這是一篇最新的Xposed模塊編寫教程

??!前言

Xposed框架是一款開源框架,其功能是可以在不修改APK的情況下影響程序運行(修改系統(tǒng))的框架服務(wù),基于它可以制作出許多功能強大的模塊,且在功能不沖突的情況下同時運作。也正因為如此,Xposed 具有比較高的可定制化程度。
作為一個爬蟲工程師如果你只會frida的話,那你可要開始水一下這篇文章了。


image.png

Xposed 模塊編寫簡介

Xposed 框架的原理就不多說了,它部署在ROOT后的安卓手機上,通過替換/system/bin/app_process程序控制zygote進程,使得app_process在啟動過程中會加載XposedBridge.jar這個jar包,從而完成對Zygote進程及其創(chuàng)建的Dalvik虛擬機的劫持。可以讓我們在不修改APK源碼的情況下,通過自己編寫的模塊來影響程序運行的框架服務(wù),實現(xiàn)類似于自動搶紅包、微信消息自動回復(fù)等功能。

其實,從本質(zhì)上來講,Xposed 模塊也是一個 Android 程序。但與普通程序不同的是,想要讓寫出的Android程序成為一個Xposed 模塊,要額外多完成以下四個硬性任務(wù):

1、讓手機上的xposed框架知道我們安裝的這個程序是個xposed模塊。
2、模塊里要包含有xposed的API的jar包,以實現(xiàn)下一步的hook操作。
3、這個模塊里面要有對目標程序進行hook操作的方法。
4、要讓手機上的xposed框架知道,我們編寫的xposed模塊中,哪一個方法是實現(xiàn)hook操作的。
  • 這就引出我即將要介紹的四大件(與前四步一一對照):

1、AndroidManifest.xml
2、XposedBridgeApi-xx.jar 與 build.gradle
3、實現(xiàn)hook操作的具體代碼
4、xposed_Init

牢記以上四大件,按照順序一個一個實現(xiàn),就能完成我們的第一個Xposed模塊編寫。下面我們就開始吧!

邁開第一步,新建項目并編輯AndroidManifest.xml

    1. 創(chuàng)建android項目:選擇File-->new--> New project--> Empty Activity
image.png
  • 2、我們可以把項目查看方式設(shè)置為Project模式,以方便查看。然后在 “項目名稱/app/src/main/”目錄下找到AndroidManifest.xml,雙擊之,并在指定位置插入以下三段代碼:


    image.png

    插入之后,如果你把手機連上AndroidStudio ,點擊“編譯”或者“運行”的話,手機就會啟動剛剛編寫的這個程序。而在手機里的Xposed框架中也會顯示出這個模塊:

image.png

說明Xposed框架已經(jīng)認出了我們寫的程序。但先別高興太早——雖然框架已經(jīng)覺得他是一個Xposed模塊了,但我們自己心里清楚,這個模塊還啥都不會干呢。下一步,我們讓這個模塊長點本事。

走出第二步,搞定XposedBridgeApi-xx.jar 與 build.gradle

我們知道,Xposed模塊主要功能是用來Hook其他程序的各種函數(shù)。但是,如何讓前一步中的那個“一窮二白”的模塊長本事呢?那就要引入 XposedBridgeApi.jar 這個包,你可以理解為一把兵器,模塊有了這把寶刀才能施展出Hook本領(lǐng)。以前,都需要手動下載諸如XposedBridgeApi-54.jar 、 XposedBridgeApi-82.jar 等jar包,然后手工導(dǎo)入到libs目錄里,才能走下一步道路。其實在AndroidStudio 3.1里面,我們完全不用這么麻煩,只需要多寫一行代碼,就讓AndroidStuido自動給我們配置XposedBridgeApi.jar !下面操作開始(序號接著上一節(jié)):

  • 3、在 “項目名稱/app/src/main/”目錄下找到build.gradle,在圖示位置加上:

    repositories {
      jcenter()
    }
    

以及

compileOnly 'de.robv.android.xposed:api:82'
compileOnly 'de.robv.android.xposed:api:82:sources'

這句代碼是告訴AndroidStuido使用jcenter作為代碼倉庫,從這個倉庫里遠程尋找 de.robv.android.xposed:api:82 這個API。這個網(wǎng)上很少有Xposed教程介紹它的!(我們不用自己找XposedBridgeApi.jar了。注意!此處要用compileOnly這個修飾符!網(wǎng)上有些寫的是provide ,現(xiàn)在已經(jīng)停用了?。┤鐖D:


image.png

寫完之后, build.gradle會提示文件已經(jīng)修改,是否同步。點擊 “sync now”。

好了,現(xiàn)在寶刀已經(jīng)到手。下一步,就要開始“施展刀法”(編寫hook代碼)了。


邁開第三步,實現(xiàn)hook操作的具體代碼

  • 4、在“施展刀法”(編寫hook代碼)之前,我們先要立一個靶子。在界面上畫一個按鈕,并在MainAcitiviy里寫代碼如下:

    package com.gd.xposed;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    public class MainActivity extends AppCompatActivity {
        private Button button;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
              Toast.makeText(MainActivity.this, toastMessage(), Toast.LENGTH_SHORT).show();
            }
        });
      }
      public String toastMessage() {
            return "你學(xué)會了嗎?";
      }
    

    }

image.png

image.png

這個靶子很簡單:MainActivity界面有個按鈕,點擊按鈕后會彈出一個toast提示,該提示的內(nèi)容由 toastMessage() 方法提供,而toastMessage()的返回值為“你學(xué)會了嗎?”:


image.png

下面我們正式開始“施展刀法”(編寫hook代碼) 來hook我們的MainActivity并修改這個類的toastMessage()方法,讓它的返回值為“你已成功踏入xposed第一步!”:

  • 5、在MainActivity的同級路徑下新建一個類“HookTest.java”,代碼如下:


    image.png

    由代碼可知,我們是通過IXposedHookLoadPackage接口中的handleLoadPackage方法來實現(xiàn)Hook并篡改程序的輸出結(jié)果的。代碼中“com.gd.xposed”是目標程序的包名,"com.gd.xposed.MainActivity" 是想要Hook的類, "toastMessage"是想要Hook的方法。我們在afterHookedMethod方法(用來定義Hook了目標方法之后的操作)中,修改了toastMessage()方法的返回值為“你已被劫持”。

OK,以上用來hook的代碼編寫完畢,讓我們進行下一步操作。

最后一步,添加入口點

右鍵點擊 “main ” 文件夾 , 選擇new --> Folder -->Assets Folder,新建assets 文件夾:


image.png

然后右鍵點擊 assets文件夾, new--> file,文件名為xposed_init(文件類型選text),并在其中寫上入口類的完整路徑(就是自己編寫的那一個Hook類),這樣, Xposed框架就能夠從這個 xposed_init 讀取信息來找到模塊的入口,然后進行Hook操作了:


image.png
image.png

然后點擊小三角“運行”!在Xposed框架里找到自己寫的模塊,打上勾,重啟——點開自己的程序看看,是不是toast的提示已經(jīng)變了?

image.png

哈哈,是不是挺簡單的呢?你學(xué)費了嗎?
俗話說:好記性不如爛筆頭!
本文參考:https://www.freebuf.com/articles/terminal/189021.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容