- 從0到1:CTFer成長之路
- Nu1L戰隊
- 1493字
- 2021-01-07 17:32:11
4.2 APK逆向工具
本節主要介紹在APK逆向時主要使用的一些逆向工具和模塊,好工具能大大加快逆向的速度。針對Android平臺的逆向工具有很多,如Apktool、JEB、IDA、AndroidKiller、Dex2Jar、JD-GUI、smali、baksmali、jadx等,本節主要介紹JEB、IDA、Xposed和Frida。
4.2.1 JEB
針對Android平臺有許多反編譯器,其中JEB的功能最強大。JEB從早期的Android APK反編譯器發展到現在,不僅支持Android APK文件反編譯,還支持MIPS、ARM、ARM64、x86、x86-64、WebAssembly、EVM等反編譯,展示頁面和開放接口易用,大大降低了逆向工程的難度,見圖4-2-1。

圖4-2-1
JEB 2.0后增加了動態調試功能,動態調試功能簡單易用,容易上手,可以調試任意開啟調試模式的APK。
附加調試時,進程標記為D,表示該進程可以被調試,否則說明該進程沒有打開調試開關,無法調試,見圖4-2-2。

圖4-2-2
打開調試功能后,OSX系統通過Command+B在smali層面上布置斷點,右側VM/局部變量窗口下查看當前位置各寄存器的值,雙擊能修改任意寄存器值,見圖4-2-3。

圖4-2-3
沒有開啟調試功能的應用、非Eng版本的Android手機被root后,可能出現無法調試其他應用的情況,這時可以通過Hook系統接口強制開啟調試模式來進行,如通過Xposed Hook實現非Eng手機下的JEB動態調試。Hook動態修改debug狀態的代碼如下:

強制將PackageManagerService的getPackageInfo函數中應用程序調試Flag改為調試狀態,即可強制打開調試模式,在任意root設備中完成動態調試。
4.2.2 lDA
在遇到Native(本地服務)逆向時,IDA優于JEB等其他逆向工具,其動態調試能大大加速Android Native層逆向速度,本節主要介紹如何使用IDA進行Android so Native層逆向。
IDA進行Android Native層調試需要用到IDA自帶工具android_server:對于32位Android手機,使用32位版android_server和32位版IDA;對于64位Android手機,使用64位版android_server和64位版IDA,將android_server存至手機目錄,且修改權限,見圖4-2-4。

圖4-2-4
IDA調試默認監聽23946端口,需要使用adb forward指令將Android端口命令轉發至本機:

打開IDA遠程ARM/Android調試器,見圖4-2-5。
Hostname選擇默認的127.0.0.1或本機IP地址,Port選擇默認的23946,見圖4-2-6。再選擇需要調試的應用,見圖4-2-7。

圖4-2-5

圖4-2-6
進入IDA主頁面后選擇modules,找到該進程對應的native層so,見圖4-2-8。
雙擊進入該so對應的導出表,找到需要調試的Native函數(見圖4-2-9),然后雙擊進入函數頁面,在主頁面下斷點、觀察寄存器變化(見圖4-2-10)。
某些Native函數(JNI_OnLoad、init_array)在so加載時會默認自動執行,對于這類函數無法直接使用上述方式進行調試,需要在動態庫加載前斷下,所有動態庫都是通過linker加載,所以需要定位到linker中加載so的起始位置,然后在linker初始化該so時進入。
4.2.3 Xposed Hook
Xposed是一款在root設備下可以在不修改源碼的情況下影響程序運行的Android Hook框架,其原理是將手機的孵化器zygote進程替換為Xposed自帶的zygote,使其在啟動過程中加載XposedBridge.jar,模塊開發者可以通過JAR提供的API來實現對所有Function的劫持,在原Function執行的前后加上自定義代碼。Xposed Hook的步驟如下。
<1>在AndroidManifest.xml中的application標簽內添加Xposed相關的meta-data:


圖4-2-7

圖4-2-8

圖4-2-9

圖4-2-10

其中,xposedmodule表示這是一個Xposed模塊,xposeddescription描述該模塊的用途,可以引用string.xml中的字符串,xposedminversion是要求支持的Xposed Framework最低版本。
<2>導入XposedBridgeApi jar包。在Android studio中修改app/build.gradle,添加如下內容:

sync后,即可完成導入。
<3>編寫Hook代碼:

<4>聲明Xposed入口。新建assets文件夾,并創建xposed_init文件,從中填寫Xposed模塊入口類名,如上述代碼對應的類名為com.test.ctf.CTFDemo。
<5>激活Xposed模塊。在Xposed應用中激活模塊并且重啟,即可觀察Hook后的效果。
4.2.4 Frida Hook
Frida是一款跨平臺的Hook框架,支持iOS、Android。對于Android應用,Frida不僅能Hook Java層函數,還能Hook Native函數,能大大提高逆向分析的速度。Frida的安裝過程見官方文檔,不再贅述,下面主要介紹Frida使用的技巧。
①Hook Android Native函數:

②Hook Android Java函數:

③通過__fields__獲取類成員變量:

④Native層下獲取Android jni env:

⑤Java層獲取類的field字段:

⑥獲取Native特定地址:

⑦獲取app context:

Frida需要在root環境下使用,但是提供了一種不需root環境的代碼注入方式,通過反編譯,在被測應用中注入代碼,使其在初始化時加載Frida Gadget相關so,并且在lib目錄下存放配置文件libgadget.config.so,說明動態注入的JS代碼路徑。重打包應用后,即可實現不需root的Frida Hook功能。