練習向:Xposed安裝和使用的踩坑
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地址也在上面,同時提供了許多模組的下載
Xposed作者rovo89寫的使用文件:https://github.com/rovo89/XposedBridge/wiki/Development-tutorial
Xposed框架API:http://api.xposed.info/reference/packages.html
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 這個引數包含了載入的應用程式的一些基本資訊
方法: 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
Android Hook框架Xposed進階:http://blog.csdn.net/zhangmiaoping23/article/details/52315815
相關文章
- YII安裝踩坑
- mac 安裝nvm 踩坑Mac
- 安裝 Laravel/horizon 踩過的坑Laravel
- Xposed框架的安裝框架
- 安裝SLM-Lab踩坑記
- 視覺化爬蟲Portia安裝和部署踩過的坑視覺化爬蟲
- puppetter安裝就踩坑-解決篇
- Laravel Homestead踩坑記1——安裝Laravel
- Laravel 6.0 安裝 adminLTE 3.0.1 所踩的坑Laravel
- 容器映象倉庫-Harbor的安裝及踩坑
- Charles在windows下的安裝以及踩過的坑Windows
- Ubuntu中安裝python3.6踩坑UbuntuPython
- Flutter之Dialog使用和踩坑Flutter
- [rabbitmq]安裝ampq的擴充套件的踩坑總結MQ套件
- MQTT使用踩坑MQQT
- MySQL 8.0.13組複製安裝步驟和踩坑經驗分享MySql
- 原創視訊:Win10下使用Docker安裝RabbitMQ踩坑Win10DockerMQ
- [踩坑] Go Modules 使用Go
- URLEncoder使用踩坑
- VUE 使用中踩過的坑Vue
- php學習踩坑(一)PHP
- 我的學習(踩坑)記錄
- 聽說你要在 Ubuntu 上安裝 MySQL ?踩坑了吧。UbuntuMySql
- ubuntu 18.04 lts 安裝cuckoo沙箱踩坑記錄Ubuntu
- Nextcloud fpm 版在 Dokcer 下安裝踩坑Cloud
- Centos7安裝docker-compse踩過的坑CentOSDocker
- 又踩坑了!BigDecimal使用的5個坑!Decimal
- 使用 Typescript 踩 react-redux 的坑TypeScriptReactRedux
- 那些年使用Hive踩過的坑Hive
- 字元驅動裝置踩坑字元
- Windows nvm的安裝使用(及排坑)Windows
- CVAT 使用(4) 安裝採坑
- golang的踩坑Golang
- (踩坑)WSL2+docker+laradock 配置並安裝 Laravel 框架DockerLaravel框架
- 【踩坑記】Ubuntu 20.04.6 LTS下編譯安裝gcc 4.4.0Ubuntu編譯GC
- 使用phoenix踩的坑與設計思考
- jmeter:測試片段使用的踩坑點JMeter
- WSL2和CUDA踩坑