官术网_书友最值得收藏!

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功能。

主站蜘蛛池模板: 阿尔山市| 东安县| 南部县| 泸水县| 闵行区| 宝坻区| 井研县| 兖州市| 丹东市| 黄山市| 永嘉县| 桦甸市| 白山市| 榆社县| 伊宁县| 云南省| 内江市| 桂阳县| 东宁县| 托克逊县| 凤台县| 大名县| 九龙坡区| 随州市| 肇州县| 城市| 疏勒县| 博罗县| 上犹县| 吉木萨尔县| 克什克腾旗| 凤凰县| 夏河县| 定南县| 石林| 安吉县| 剑阁县| 灵丘县| 临武县| 泾阳县| 北川|