安卓逆向_22( 一 ) --- Xposed【 Android Studio + Xposed 实现简单的 hook 】
?
From:使用滲透測試框架 Xposed 框架 hook 調試 Android APP:https://www.freebuf.com/articles/terminal/56453.html
Xposed框架分析:https://blog.csdn.net/zjx839524906/article/details/81046844
xposted框架 原理
Xposed框架之函數Hook學習:https://www.cnblogs.com/csnd/p/11800719.html
如何看待阿里開源的 dexposed 框架?:https://www.zhihu.com/question/31894163
Epic——ART上的Dexposed(無侵入式Hook框架):https://bbs.pediy.com/thread-222931.htm
【搬磚】無需 Root 也能使用 Xposed:https://www.52pojie.cn/thread-679501-1-1.html
?
Android中Xposed框架篇—利用Xposed框架實現攔截系統方法:http://www.520monkey.com/archives/895
?
關鍵字:xposed hook:https://www.baidu.com/s?wd=xposed%20hook
?
?
1. 什么是 hook
?
hook 本質就是劫持函數調用,但由于處于 linux 用戶態,每個進程都有自己獨立的進程空間,所以必須先注入到所要 hook 的進程空間,修改其內存中的進程代碼,替換其過程表的符號地址。
Android 中一般通過 ptrace 函數附加進程,然后向遠程進程注入 so 庫,從而達到監控以及遠程進程關鍵函數掛鉤。
Hook 的難點在于尋找函數的入口點、替換函數,這就涉及到函數的連接與加載機制。
Android 中一般存在兩種 hook:sdk hook,ndk hook。native hook 的難點在于理解 ELF 文件與學習 ELF 文件,Java 層 Hook 則需要了解虛擬機的特性與 java 上的反射使用。另外還存在全局 hook,即結合 sdk hook 和 ndk hook,xposed 就是一種典型的全局 hook 框架。
?
?
2. Xposed
?
xposed 原理
Xposed 是 Android 平臺下的一個著名hook框架,其原理是通過修改替換 /system/bin/app_process 程序控制 zygote 進程,使app_process 在啟動過程中加載 xposedBrider.jar 包,從而完成對 zygote 進程以及其創建的虛擬機劫持。基于 xposed 框架可以制作出許多功能強大的模塊,其在功能不沖突的情況下同時運作。
?
Xposed 工程
Xposed 源碼地址為:https://github.com/rovo89
Xposed 文件下載地址為:http://dl-xda.xposed.info/framework/
工程主要包括 5 部分:
- Xposed:獨立實現了一版 Xposed版的 zyogte,即生成用來替換 /system/bin/app_process 的可執行文件,該文件在系統啟動時在 init.rc 中被調用,啟動 Zygote 進程,init.zygote.rc 中源碼如下:
- XposedBridge:Xposed 框架的 Java 部分,編譯輸出為 XposedBridge.jar?(編寫 hook 需要導入)為開發者提供接口
- android_art:Xposed 框架的 C++ 部分,對 XposedBridge 的補充
- XposedTools:框架編譯工具,因為 Xposed 和 XposedBridge 編譯依賴于 Android 源碼,而且還有一些定制化的東西。
- XposedInstaller:Xposed 插件管理和功能選擇應用,界面如下圖所示, 其功能包括啟動 Xposed 框架,下載和啟用指定插件,或禁用插件等。
?
?
Xposed 框架
?
Xposed Framework 是一個很強大的滲透測試框架,本文中講述如何用 Xposed Framework hook 一個Android APP中的一個方法并繞過登錄驗證。
?
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
?
Xposed Framework 原理簡述
Xposed Framewrork 也使用了模塊化的擴展模式,可以通過編寫模塊來滿足不同的需求,比如有一個模塊叫?3dot menu,可以在每一個 APP 界面中添加一個三點按鈕,20MP sensor for Superior Auto?可以擴展 sony 相機,所有 Xposed Framework 能夠實現的功能都是通過模塊的方式實現的,這里提供了一些例子模塊:example modules。
如果想了解更多關于 Xposed Framework 的詳情,出門右轉 :Xposed Framework
Zygote 是 Android 的核心,每打開一個 app,Zygote 就會 fork 一個虛擬機實例來運行 app,Xposed Framework 深入到了 Android 核心機制中,通過改造 Zygote 來實現一些很牛逼的功能。Zygote 的啟動配置在 /init.rc?腳本中,由系統啟動的時候開啟此進程,對應的執行文件是 /system/bin/app_process,這個文件完成類庫加載及一些函數調用的工作。
當系統中安裝了 Xposed Framework 之后,會對?app_process 進行擴展,也就是說,Xposed Framework 會拿自己實現的 app_process?覆蓋掉 Android 原生提供的?app_process 文件,當系統啟動的時候,就會加載由 Xposed Framework 替換過的進程文件,并且,Xposed Framework 還定義了一個 jar 包,系統啟動的時候,也會加載這個包:
/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar環境要求
- 1. Rooted Device / Emulator (已 root 的手機或者模擬器)
- 2.?Xposed Installer?( 通過?Xposed Installer.apk 安裝 xposed )
- 3. Testing Android App
Xposed Framework 就是一個 apk 包,下載到后用下面的命令安裝到手機上:
adb?install?<xposed-installer-you-just-downloaded>.apk現在安裝 Xposed 比較方便,因為 Xposed 作者開發了一個 Xposed Installer App,下載后按照提示傻瓜式安裝(前提是 root 手機)。其實它的安裝過程是這個樣子的:首先探測手機型號,然后按照手機版本下載不同的刷機包,最后把 Xposed 刷機包刷入手機重啟就 好。刷機包下載 里面有所有版本的刷機包。
刷機包解壓打開里面的?文件?構成是這個樣子的:
Xposed 原理簡介及其精簡化:https://www.jianshu.com/p/6b4a80654d4e
META-INF/ 里面有文件配置腳本 flash-script.sh 配置各個文件安裝位置。 system/bin/ 替換zygote進程等文件 system/framework/XposedBridge.jar jar包位置 system/lib system/lib64 一些so文件所在位置 xposed.prop xposed版本說明文件所以安裝 Xposed 的過程就上把上面這些文件放到手機里相同文件路徑下。
通過查看文件安裝腳本發現:Xposed?就是修改替換了?/system/bin/app_process 文件,app_process 是 zygote 的進程文件。所以 Xposed 通過替換的 zygote 進程實現了控制手機上所有 app 進程。因為所有 app 進程都是由 Zygote fork 出來的。
Xposed 的基本原理是修改了 ART/Davilk 虛擬機,將需要 hook 的函數注冊為 Native 層函數。當執行到這一函數時,虛擬機會優先執行 Native層函數,然后再去執行 Java層函數,這樣完成函數的 hook。
安裝好之后,打開 Xposed ,下面是截圖:
Modules 下面是一些可用的模塊
?
?
3. 模塊 和 實現一個模塊
?
一個Xposed模塊 就是 一個 Android app。
- 如果你只是 hook,那么可以選擇 add no activity
- 但是如果有和自身app交互,那么就選擇 empty activity
?
實現模塊要完成下面幾個步驟
- 1. 實現?IXposedHookLoadPackage接口
- 2. 指定要 hook 的包名 ( 這里是 com.attify.vuln )
- 3. 判斷當前加載的包是否是指定的包 ( 在接口方法中判斷)
- 4. 指定要 hook 的方法名
- 5. 實現 beforeHookedMethod方法 和 afterHookedMethod方法 ( hook的具體功能 )
下圖是模塊的核心代碼,上述各項都已經具備
這里的包名是com.attify.vuln,
if(lpparam.packageName.equals("com.attify.vuln"))上面這一行代碼指定了只有當 com.attify.vuln 這個包加載的時候,才會觸發一系列的 hook 行為,當這行為觸發的時候,de.robv.android.xposed.XposedHelpers 類的 findAndHookMethod 方法就會被調用,并在適當的時候執行前置方法(beforeHookedMethod)和后置方法(afterHookedMethod),這里繞過驗證方法只需要讓傳遞到 checkLogin 方法的兩個參數相等即可,so easy。當 checkLogin 方法被調用前調用我們實現的模塊,并執行前置函數,就可以使得傳遞給 checkLogin 函數的兩個參數相等。
?
最后環節
把我們實現的模塊安裝到設備上,如下圖:
勾選我們剛才安裝的模塊,并重啟系統,等系統重啟之后,打開樣例 app,在輸入密碼的地方輸入任意字符,因為我們實現的那個模塊會執行
param.args[1]?=?param.args[0];這行代碼,所以輸入任意密碼都會通過驗證,如下圖
整個模塊執行過程的 log 信息可以在 Xposed log 中查看到,如下圖
由日志可以看到,hook 的關鍵代碼 (前置函數) 執行前,checkLogin 方法的兩個參數是不同的,而在后置函數執行的時候,兩個參數已然相等了:)
[參考來源?attify,譯/實習編輯 吳知,轉載請注明來自FreeBuf黑客與極客(FreeBuf.COM)]shi
?
?
4. 示例
?
示例 1:Android Studio + Xposed 實現簡單的 hook
?
************************?這三個示例重點看,理解 xposed 的 hook?**********************************
- 1. Android Studio + Xposed實現簡單的hook(詳細篇):https://www.52pojie.cn/thread-873366-1-1.html
- 2. Xposed 使用經驗:https://www.52pojie.cn/thread-728459-1-1.html
- 3. Android逆向Hook學習——第一篇:Xposed:https://www.52pojie.cn/thread-873013-1-1.html
查看 Xposed 的 log
不能導入模塊參考:
? ? ? ?Why Xposed cannot load module?:https://forum.xda-developers.com/xposed/xposed-load-module-t3771921
The thing is you are including Xposed API into your module which is not OK. Yo have to configure the gradle for Xposed lib to be "provided" not "compiled".
*****************************************************************************************************
?
?
示例?2 :crackme 的 Hook 并打印用戶名和密碼
?
Form:https://www.bilibili.com/video/BV1UE411A7rW?p=73
https://www.52pojie.cn/thread-232658-1-1.html
Android入門破解題目(EX05_01_.apk、Crackme02.apk、CrackMe-F1F2.apk)
? ? ? ? https://blog.csdn.net/m0_38071863/article/details/102931100
第一個Android crackme:https://www.cnblogs.com/flycat-2016/p/5521979.html
示例破解程序
工程目錄:
示例 hook 代碼:
hook 后,無論輸入什么,都可以注冊成功,因為hook 修改了返回值,使返回值一直是?true
?
hook 系統函數(攔截系統函數),篡改 IMEI 號:( getDeviceId 函數沒有參數 )
?
去優酷廣告
?
?
示例 3:Hook 人人直播.apk
?
From( hook解密算法 ):https://www.bilibili.com/video/BV1UE411A7rW?p=75
"人人直播" 登錄協議分析:https://www.cnblogs.com/LuLuLuHao
?
?
?
?
總結
以上是生活随笔為你收集整理的安卓逆向_22( 一 ) --- Xposed【 Android Studio + Xposed 实现简单的 hook 】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 使用 smtp ssl 模
- 下一篇: 交互式数据包处理程序 Scapy 用法