1. 程式人生 > >【Xposed模組開發】用Android Studio開發第一個Xposed模組

【Xposed模組開發】用Android Studio開發第一個Xposed模組

最近打算學習Xposed模組的開發。

Xposed框架是一款可以在不修改APK的情況下影響程式執行(修改系統)的框架服務,通過替換/system/bin/app_process程式控制zygote程序,使得app_process在啟動過程中會載入XposedBridge.jar這個jar包,從而完成對Zygote程序及其建立的虛擬機器的劫持。

具體瞭解可前往:

下面演示一下如何建立並編寫一個Xposed模組:

首先建立一個工程,新增Xposed依賴,直接在gradle檔案的依賴中新增就可以了:

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

在AndroidManifest.xml檔案中新增如下內容:


<meta-data
            android:name="xposedmodule"
            android:value="true" />
        <meta-data
            android:name="xposeddescription"
            android:value="Module測試" />
        <meta-data
            android:name="xposedminversion"
            android:value="54" />


第一個meta-data標識自己是否為一個Xposed模組


第二個meta-data為Xposed模組的描述資訊

第三個meta-data為所支援Xposed框架的最低版本

新建一個Activity,並新增一個按鈕,當點選按鈕時,呼叫toastMessage()方法,彈出一個“我未被劫持”的Toast

public class MainActivity extends AppCompatActivity {
    private Button button;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_main);

        button = (Button) findViewById(R.id.testButton);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, toastMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    public String toastMessage() {
        return "我未被劫持";
    }
}


我們的模組所要實現的功能就是劫持toastMessage()方法,並返回"你已被劫持"的字串。

新建一個類,並實現IXposedHookLoadPackage介面,並實現IXposedHookLoadPackage介面中的handleLoadPackage方法

public class HookToast implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        
    }
}

在handleLoadPackage方法中先篩選到我們本程式的包名,然後用XposedHelpers裡的findAndHookMethod方法對MainActivity中的toastMessage方法進行劫持,在其Hook的回撥中的beforeHookedMethod或afterHookedMethod方法裡進行劫持操作,具體程式碼如下:

public class HookToast implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        if (loadPackageParam.packageName.equals("com.mrglaucus.xposedmoduledemo")) {
            Class clazz = loadPackageParam.classLoader.loadClass("com.mrglaucus.xposedmoduledemo.MainActivity");
            XposedHelpers.findAndHookMethod(clazz, "toastMessage", new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    super.beforeHookedMethod(param);
                }

                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    param.setResult("你已被劫持");
                }
            });
        }
    }
}

現在我們需要告訴Xposed框架模組的主入口類,也就是這裡的com.mrglaucus.xposedmoduledemo.HookToast

新增一個assets資料夾:右鍵點選 app這個module  --> new --> Folder -->Assets Folder,然後確認即可。


在assets中new一個file,檔名為xposed_init,並在其中寫上入口類的完整路徑


好了,這樣模組就編寫完成了,其功能是劫持com.glaucus.xposedmoduledemo中的MainActivity中的toastMessage()方法,並返回"你已被劫持".

在執行模組之前要確保手機上已經安裝有Xposed框架,沒有安裝的可以使用這個軟體進行安裝,支援5.0+,需要ROOT許可權,手機有變磚風險,請備份重要資料,部分ROM不支援,如最新版MIUI,三星的ROM等,具體安裝方法和過程這裡不贅述,大家可自行百度。


安裝好Xposed後點擊執行(Run)即可,除錯執行Xposed外掛時請關閉Android Studio的Instan Run功能,否則會報didn't find class的錯誤。

安裝模組後會在Xposed框架的模組列表中顯示:


我們先不勾選它,執行程式,點選按鈕,可見目前是未被劫持狀態


現在勾選,並重啟(重啟才會生效),在執行程式點選按鈕


模組生效,劫持成功。


至此,一個簡單的xposed模組就編寫完成啦,可以看到Xposed模組的功能是十分強大的,大家可以慢慢去發掘。