原理
Xposed替換了/system/bin/app_process可執行檔案,在啟動Zygote時加載額外的jar檔案(/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar),并執行一些初始化操作(執行XposedBridge的main方法)。然後我們就可以在這個Zygote上下文中進行某些hook操作。
安裝XposedInstaller
- 下載下傳XposedInstaller
- 安裝。安裝完會提示重新開機手機。如果是虛拟機要選擇
,真實手機要選擇軟重新開機
,千萬不要搞反。 注:手機啟動會比較慢,但如果手機重新開機時卡在歡迎界面,可以通過連續按電源鍵來跳過Xposed加載。硬重新開機
開發Xposed項目
###1. Xposed module基礎
Xposed程式稱為module,它是包含一些特殊中繼資料和檔案的android項目。建議使用android SDK 4.0.3 (API 15)進行開發。 一個Xposed module項目結構如下:
其中/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。
- 建立一個普通的android項目,添加依賴XposedBridge.jar(源碼下載下傳),scope為Provided。
- 在AndroidManifest.xml中添加Xposed中繼資料
- 編寫 /assets/xposed_init檔案
- 編寫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 Development-tutorial
- XposedBridge
- XposedInstaller
版權聲明:本文為CSDN部落客「weixin_34015336」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/weixin_34015336/article/details/92430086