天天看點

Xposed (一) Android hook架構入門

原理

Xposed替換了/system/bin/app_process可執行檔案,在啟動Zygote時加載額外的jar檔案(/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar),并執行一些初始化操作(執行XposedBridge的main方法)。然後我們就可以在這個Zygote上下文中進行某些hook操作。

安裝XposedInstaller

  1. 下載下傳XposedInstaller
  2. 安裝。安裝完會提示重新開機手機。如果是虛拟機要選擇

    軟重新開機

    ,真實手機要選擇

    硬重新開機

    ,千萬不要搞反。 注:手機啟動會比較慢,但如果手機重新開機時卡在歡迎界面,可以通過連續按電源鍵來跳過Xposed加載。

開發Xposed項目

###1. Xposed module基礎

Xposed程式稱為module,它是包含一些特殊中繼資料和檔案的android項目。建議使用android SDK 4.0.3 (API 15)進行開發。 一個Xposed module項目結構如下:

Xposed (一) Android hook架構入門

其中/assets/xposed_init檔案指定了module的入口類,開發者要在這個類中實作需要的hook代碼。這個類要實作特定的XposedBridge接口。 /assets/xposed_init内容:

com.example.xmodule.car.XModule
           

AndroidMannifest.xml内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.Xmodule" android:versionName="1.0" android:versionCode="1">
    <uses-sdk android:minSdkVersion="15"/>
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <meta-data
                android:name="xposedmodule"
                android:value="true"/>
        <meta-data
                android:name="xposeddescription"
                android:value="Xposed子產品示例"/>
        <meta-data
                android:name="xposedminversion"
                android:value="54"/><!-- 對應的XposedBridge版本号 -->
    </application>
</manifest>
           

注意: Xposed module項目在開發時導入了XposedBridge jar檔案,但編譯時要去掉,否則因為在Zygote中已經導入該jar檔案而導緻類沖突。

###2. 一個簡單的示例

開發一個xposed module來修改手機imei,imsi。

  1. 建立一個普通的android項目,添加依賴XposedBridge.jar(源碼下載下傳),scope為Provided。
  2. 在AndroidManifest.xml中添加Xposed中繼資料
  3. 編寫 /assets/xposed_init檔案
  4. 編寫hook代碼
public class XModule implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
        //隻hook測試app
        if (lpparam.packageName.equals("com.example.test")) {
            XposedHelpers.findAndHookMethod(TelephonyManager.class, "getDeviceId", new XC_MethodReplacement() {
                @Override
                protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                    return "this is imei";
                }
            });
            XposedHelpers.findAndHookMethod(TelephonyManager.class, "getSubscriberId", new XC_MethodReplacement() {
                @Override
                protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                    return "this is imsi";
                }
            });
        }
    }
}
           

###3. 運作module module的安裝與普通app一樣,如果沒有編寫Activity,子產品不會顯示在launcher中。但可以在XposedInstaller應用中看到安裝的module;另外module的啟用與停止都需要在XposedInstaller中進行配置,配置完還需要重新開機才能生效。

###4. 運作結果 test app的Activity代碼

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

        final TextView tv1 = (TextView) findViewById(R.id.tv1);
        final TextView tv2 = (TextView) findViewById(R.id.tv2);
        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        tv1.setText("imei: "+tm.getDeviceId());
        tv2.setText("imsi: "+tm.getSubscriberId());
    }
           

運作結果如下:

Xposed (一) Android hook架構入門

參考連結

  • Xposed Development-tutorial
  • XposedBridge
  • XposedInstaller

版權聲明:本文為CSDN部落客「weixin_34015336」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_34015336/article/details/92430086