練習向:Xposed安裝和使用的踩坑

柴月和岐月發表於2017-12-29

1.Xposed簡介

Xposed是一款優秀的android java層 hook 框架。它允許你在不修改apk原始碼的情況下,通過編寫自己的模組來改變apk的行為。它的優點是採用了外掛機制,模組能夠適用不同版本的框架和rom。模組改變apk行為的操作發生在記憶體中,對源apk不進行任何修改。你只需要安裝編寫的模組並重啟相應的裝置即可

2.相關資源

注意:下載地址裡有這麼句話:For Android 5.0 or higher (Lollipop/Marshmallow), these versions don't work! Use this instead:http://forum.xda-developers.com/showthread.php?t=3034811,所以安卓5.0以上的就去這個網址下吧,不然會用不起的。github地址也在上面,同時提供了許多模組的下載


CSDN jar包和apk下載連結:下載

3.安裝踩坑

3.1 配置入口,assets的坑

使用IDEA來練習的,生成新的安卓專案沒有assets資料夾,網上找了半天也沒找到,只好一個目錄一個目錄的試,最終結果如圖

3.2 jar包使用踩坑

jar包下載地址裡有這麼句話:Here you can also download the API jar file that you need to reference from your project. Make sure you read the development tutorial to understand how it works. Especially make sure that the classes are not included in your APK, but only referenced.意思就是讓jar包只參與引用,不參與編譯。
我現在採用的解決辦法是:在gradle檔案裡,在依賴部分使用provide關鍵字對jar包進行宣告


這個最簡單了,把原來的compile變成provided就行了

3.3 配置檔案踩坑


4.API說明

IXposedHookLoadPackage。java
方法: handleLoadPackage,這個方法用於在載入應用程式的包的時候執行使用者的操作(就是在這裡把記憶體裡原有的程式碼替換了)
引數說明: final LoadPackageParam lpparam 這個引數包含了載入的應用程式的一些基本資訊

XposedHelpers.java
方法: findAndHookMethod,這是一個輔助方法,可以通過靜態匯入使用
引數說明: findAndHookMethod(
Class<?> clazz, //需要 Hook 的類名ClassLoader,
ClassLoader classLoader,//類載入器,常設為loadPackageParam.classLoader
String methodName, //需要 Hook 的方法名 
Object… parameterTypesAndCallback)  //由1.Hook 的目標方法的引數,譬如:String.class,Integer.class  加上2.回撥方法:a.XC_MethodHook 或者b.XC_MethodReplacement組成(從名字上講就是要你提供函式引數的型別以及一個回撥介面)

XposedBridge.java
無參方法: log,該方法可以將 log 資訊以及 Throwable 丟擲的異常資訊輸出到標準的logcat 以及/data/xposed/debug.log 這個檔案中
無參方法: hookAllMethods/hookAllConstructors,該方法可以用來 hook 某個類中的所有方法或者建構函式,但是不同的Rom(非Android原生 Rom)會有不同的變種。

5.使用踩坑

首先來把決定要hook的函式寫好。後面通過hook login函式,得到不同的結果

4.1 hook函式的返回值

設定返回值通過methodHookParam.setResult()執行,引數為object型別,在java的自動包裝機制下,你傳什麼都可以
因為只設定返回值,所以只需要用XC_MethodHook介面



前後都設定了返回值的話,則以後一個為準



4.2 直接替換函式

直接替換函式我們使用XC_MethodHookedMethod()函式

替換後則不等於“123”的才能返回成功

4.3 更改函式的傳入引數

param.args是一個object陣列,裡面儲存了這個函式傳入的引數的引用,直接更改即可,同時也因為是object型別,所以可以改成任何型別的值

則無論輸入什麼,最後都會成功

4.4 Hook內呼叫該函式的其他方法

通過XposedHelpers.callMethod()函式進行呼叫,因為返回值為object,所以也能夠返回任何型別
先增加一個login2函式,執行與login相反的邏輯


再呼叫,下面會邏輯會讓任何輸入值都返回false



注:callMethod有兩個過載
public static Object callMethod(Object obj, String methodName, Object... args)//這個函式會根據你後面傳入的引數值自動對照型別輸入
public static Object callMethod(Object obj, String methodName, Class<?>[] parameterTypes, Object... args)//這個就免了上面的對照型別這一步,但是我使用的時候發現並不能使用,會讓程式自動退出,錯誤為:NoSuchMethod,真是奇怪,明明是最新的啊—— ——。。。

5.參考

Xposed如何實現類中函式的呼叫:http://blog.csdn.net/omnispace/article/details/50816740


相關文章