Xposed (一) Android hook框架入門

原理

Xposed替換了/system/bin/app_process可執行文件,在啓動Zygote時加載額外的jar文件(/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar),並執行一些初始化操做(執行XposedBridge的main方法)。而後咱們就能夠在這個Zygote上下文中進行某些hook操做。java

安裝XposedInstaller

  1. 下載XposedInstaller
  2. 安裝。安裝完會提示重啓手機。若是是虛擬機要選擇軟重啓,真實手機要選擇硬重啓,千萬不要搞反。 注:手機啓動會比較慢,但若是手機重啓時卡在歡迎界面,能夠經過連續按電源鍵來跳過Xposed加載。

開發Xposed項目

###1. Xposed module基礎android

Xposed程序稱爲module,它是包含一些特殊元數據和文件的android項目。建議使用android SDK 4.0.3 (API 15)進行開發。 一個Xposed module項目結構以下:git

XposedModule項目結構

其中/assets/xposed_init文件指定了module的入口類,開發者要在這個類中實現須要的hook代碼。這個類要實現特定的XposedBridge接口。 /assets/xposed_init內容:github

com.example.xmodule.car.XModule

AndroidMannifest.xml內容:app

<?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文件而致使類衝突。ide

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

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

  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中進行配置,配置完還須要重啓才能生效。code

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

@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());
    }

運行結果以下:

hook結果

參考連接

相關文章
相關標籤/搜索