Android Studio Xposed模組編寫(一)
轉:https://www.cnblogs.com/gordon0918/p/6689883.html
1、環境說明
本文主要參考https://my.oschina.net/wisedream/blog/471292?fromerr=rNPFQidG的內容,自己實現了一遍,侵權請告知
已經安裝xposed Installer的nexus5一臺,Xposed Installer版本2.7 experimental1, Android 版本4.4.4
開發環境Android Studio 2.2.3
2、開發流程
1、拷貝XposedBridgeApi-54.jar到新建工程的libs目錄
2、修改app目錄下的build.gradle檔案,在AndroidManifest.xml中增加Xposed相關內容
3、新建hook類,編寫hook程式碼
4、在app上右鍵新建assets folder,然後在assets目錄下新建檔案xposed_init,在裡面寫上hook類的完整路徑
3、Hook模組編寫
1、新建Android studio工程,選擇無activity,並將XposedBridgeApi-54.jar拷貝到libs目錄下,然後雙擊app目錄下的build.gradle檔案,將
compile fileTree(include: ['*.jar'], dir: 'libs') 替換為 provided fileTree(include: ['*.jar'], dir: 'libs')
2、修改AndroidManifest.xml檔案,在Application標籤下增加內容如下
<meta-data android:name="xposedmodule" android:value="true" /> <meta-data android:name="xposeddescription" android:value="模組描述" /> <meta-data android:name="xposedminversion" android:value="54" />
3、新建hook類,命名為XMdodule,內容如下
public class XModule implements IXposedHookLoadPackage{
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if(loadPackageParam.packageName.equals("com.example.test")){
XposedBridge.log("XLZH " + loadPackageParam.packageName);
XposedHelpers.findAndHookMethod(TelephonyManager.class, "getDeviceId", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
return "this is imei";
}
});
XposedHelpers.findAndHookMethod(TelephonyManager.class, "getSubscriberId", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
return "this is imsi";
}
});
}
}
}
程式碼功能是hook 系統TelephonyManager類的getDeviceId()和getSubscriberId()方法,返回字串,而且只hook com.example.test應用。
4、新建assets目錄,在其中新建文字xposed_init,裡面內容為
com.zcgames.xposedtest.XModule
最後的目錄結構如下圖所示
4、Hook目標應用編寫
Android Studio新建com.example.test應用,MainActivity.java內容如下
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.getImei);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
try {
Log.d("XLZH", "get imei " + tm.getDeviceId());
Log.d("XLZH", "get imsi " + tm.getSubscriberId());
}catch (Exception e) {
Log.d("XLZH", e.getMessage());
e.printStackTrace();
}
}
});
}
}
5、實施Hook
1、XposedTest工程編寫完成後,點選Build-Build Apk(因為沒有Activity,所以無法點選執行自動安裝),build成功後,在app/build/output/apk目錄下生成app-debug.apk,點選as下發的Terminal,進入該目錄使用adb install安裝即可
2、com.example.test工程完成後,點選run執行,點選按鈕,使用logcat | grep XLZH,檢視結果如下
3,開啟xposed Installer應用,選擇模組,可以看到XposedTest模組,選中,然後重啟手機,再次開啟目標應用,點選按鈕,結果如下所示,hook成功
6、幾個小坑
1、xposed載入模組失敗,在xposed installer的log中看到提示如下
java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
原因:因為沒有修改build.gradle檔案,預設libs目錄下的內容會被包僅apk中,導致和手機上原有的發生了衝突,在build.gradle中把compile修改成provided即可。
2、xposed_init中區分大小寫,例如com.zcgames.xposedtest.XModule修改成com.zcgames.XposedTest.XModule,也會導致模組載入失敗
3、模組安裝後再次使用adb install安裝時,提供程式已經安裝,需要到設定->應用中找到安裝的模組進行解除安裝(沒有activity,無法在桌面解除安裝)