Xposed框架实战
文章目錄
- 環境
- 夜神(Android5.1)
- XposedInstaller(這里我用的是夜神軟件商店下載的)
- 下載后直接點擊version進行install
- 插件(i春秋教程教導)
- 過程
- 導入(注意這里不是libs,而是新建的lib)lib文件XposedBridgeApi-54.jar(把implemention改為provided模式,也就是不參與編譯到最終文件中)
- 原來:
- 更改:
- AndroidManifest.xml文件編寫
- 入口類編寫
- 回調函數編寫
- 設置啟動入口
- 安裝激活插件,重啟即看到插件效果
- 實戰
- times類
- hook掉times類中的test函數,讓它不再調用
- hook前(無這行代碼param.setResult(null);)
- hook后(有這行代碼param.setResult(null);)
- classLoader
環境
夜神(Android5.1)
XposedInstaller(這里我用的是夜神軟件商店下載的)
點擊立即安裝就行,切記:不要再去稀奇古怪找一些其它版本的,那樣沒辦法激活的(即使有,也得費半天勁),自帶的直接雙擊式安裝
下載后直接點擊version進行install
然后就會顯示已激活
插件(i春秋教程教導)
過程
導入(注意這里不是libs,而是新建的lib)lib文件XposedBridgeApi-54.jar(把implemention改為provided模式,也就是不參與編譯到最終文件中)
原來:
更改:
AndroidManifest.xml文件編寫
<meta-data android:name="xposedmodule" android:value="true"/><meta-data android:name="xposeddescription" android:value="模塊說明"/><meta-data android:name="xposedminversion" android:value="54"/> <meta-data android:name="xposedmodule" android:value="true"/>true的話,xposed嘗試去加載apk作為插件的一部分
<meta-data android:name="xposeddescription" android:value="模塊說明"/> <meta-data android:name="xposedminversion" android:value="54"/>
或者在assets目錄下的version文件里
入口類編寫
package com.example.xposed; import android.app.Application; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.callbacks.XC_LoadPackage;import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;public class XposedEntry implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam Param) throws Throwable {findAndHookMethod("com.example.xposed.times",Param.classLoader,"test", Application.class,new myget_times());} }class myget_times extends XC_MethodHook{protected void beforeHookedMethod(MethodHookParam param) throws Throwable {param.setResult(null);}protected void afterHookedMethod(MethodHookParam param) throws Throwable {}}創建一個類繼承IXposedHookLoadPackage,然后把接口函數handleLoadPackage進行相應的重寫
hook函數的思路是先找到類,然后再近一步找到函數, findAndHookMethod的第一個參數是函數所在的類名(包名+類名),第二個參數Param.classLoader類裝載器,第三個參數是函數名,第四個參數是函數所需要的參數(參數類型+class),第五個參數是回調函數(還需近一步實現)
回調函數編寫
class myget_times extends XC_MethodHook{protected void beforeHookedMethod(MethodHookParam param) throws Throwable {param.setResult(null);}protected void afterHookedMethod(MethodHookParam param) throws Throwable {}}創建一個類,繼承XC_MethodHook,然后對beforeHookedMethod(函數調用前操作,舉例 :直接讓它別調這個函數)和afterHookedMethod(函數調用后操作,舉例:直接把返回值(返回值在param中)更改再進行返回)
設置啟動入口
創建assests文件,在文件夾中,新建xposed_init文件,寫入入口類的信息
安裝激活插件,重啟即看到插件效果
可以看到,xp是在程序啟動的時候同時加載的,因此它的鉤子函數是區分進程的。如果有想對特定進程下鉤的話可以很方便使用xposed。而掛鉤函數方面可能沒有Cydia那樣容易寫,不過有一個優點是,對于程序的類和參數,可以通過名字來進行下構。比如說,對于String類,類名是java.lang.String,那么傳遞的參數可以使“java.lang.String”,與傳遞String.class效果是一樣的
xp的Hook分為函數執行前,和執行后兩個位置,可以分別進行參數修改和結果修改。如果不想進行調用的話,可以在執行前使用setResult(NULL)參數
實戰
times類
package com.example.xposed; import android.app.Application; import android.widget.Toast;import static android.widget.Toast.LENGTH_LONG;public class times {public void test(Application a){Toast.makeText(a, "點擊成功",LENGTH_LONG).show();}}hook掉times類中的test函數,讓它不再調用
package com.example.xposed;import android.app.Application; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.callbacks.XC_LoadPackage;import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;public class XposedEntry implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam Param) throws Throwable {findAndHookMethod("com.example.xposed.times",Param.classLoader,"test", Application.class,new myget_times());} }class myget_times extends XC_MethodHook{protected void beforeHookedMethod(MethodHookParam param) throws Throwable {param.setResult(null);}protected void afterHookedMethod(MethodHookParam param) throws Throwable {}hook前(無這行代碼param.setResult(null);)
hook后(有這行代碼param.setResult(null);)
classLoader
與java上的類似,就是一個類裝載器,與java不同的是,classLoader所加載的就是dex文件本身,所以通過程序的classLoader,可以取得程序的classLoader,可以取得程序的dex中所定義的所有類以及成員函數。同理,如果一個程序有多個dex,那么則會對應著多個classLoader,特別是使用動態加載的dex,則需要傳遞想要的classLoader才可以進行數據獲取,這點請注意。
總結
以上是生活随笔為你收集整理的Xposed框架实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ida动态调试apk(so层)
- 下一篇: Ubuntu下pip安装、升级、卸载