本文主要參考https://my.oschina.net/wisedream/blog/471292?fromerr=rNPFQidG的內容,本身實現了一遍,侵權請告知php
已經安裝xposed Installer的nexus5一臺,Xposed Installer版本2.7 experimental1, Android 版本4.4.4java
開發環境Android Studio 2.2.3android
庫版本 XposedBridgeApi-54.jarapp
一、拷貝XposedBridgeApi-54.jar到新建工程的libs目錄ide
二、修改app目錄下的build.gradle文件,在AndroidManifest.xml中增長Xposed相關內容gradle
三、新建hook類,編寫hook代碼ui
四、在app上右鍵新建assets folder,而後在assets目錄下新建文件xposed_init,在裏面寫上hook類的完整路徑this
一、新建Android studio工程,選擇無activity,並將XposedBridgeApi-54.jar拷貝到libs目錄下,而後雙擊app目錄下的build.gradle文件,將spa
compile fileTree(include: ['*.jar'], dir: 'libs') 替換爲 provided fileTree(include: ['*.jar'], dir: 'libs')
二、修改AndroidManifest.xml文件,在Application標籤下增長內容以下.net
<meta-data android:name="xposedmodule" android:value="true" /> <meta-data android:name="xposeddescription" android:value="模塊描述" /> <meta-data android:name="xposedminversion" android:value="54" />
三、新建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應用。
四、新建assets目錄,在其中新建文本xposed_init,裏面內容爲
com.zcgames.xposedtest.XModule
最後的目錄結構以下圖所示
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(); } } }); } }
一、XposedTest工程編寫完成後,點擊Build-Build Apk(由於沒有Activity,因此沒法點擊運行自動安裝),build成功後,在app/build/output/apk目錄下生成app-debug.apk,點擊as下發的Terminal,進入該目錄使用adb install安裝便可
二、com.example.test工程完成後,點擊run運行,點擊按鈕,使用logcat | grep XLZH,查看結果以下
3,打開xposed Installer應用,選擇模塊,能夠看到XposedTest模塊,選中,而後重啓手機,再次打開目標應用,點擊按鈕,結果以下所示,hook成功
一、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便可。
二、xposed_init中區分大小寫,例如com.zcgames.xposedtest.XModule修改爲com.zcgames.XposedTest.XModule,也會致使模塊加載失敗
三、模塊安裝後再次使用adb install安裝時,提供程序已經安裝,須要到設置->應用中找到安裝的模塊進行卸載(沒有activity,沒法在桌面卸載)