前提條件:
1、Root手機一部
2、需要通過Xposed installer(http://dl.xposed.info/latest.apk)安裝Xposed Framework;
一、ZjDroid工具介紹
ZjDroid是基於Xposed Framewrok的動態逆向分析模塊,逆向分析者可以通過ZjDroid完成以下工作:
- DEX文件的內存dump
- 基於Dalvik關鍵指針的內存BackSmali,有效破解加固應用
- 敏感API的動態監控
- 指定內存區域數據dump
- 獲取應用加載DEX信息。
- 獲取指定DEX文件加載類信息。
- dump Dalvik java堆信息。
- 在目標進程動態運行lua腳本。
二、ZjDroid相關命令
1、獲取APK當前加載DEX文件信息:
adb shell am broadcast -a com.zjdroid.invoke --ei target pid --es cmd '{"action":"dump_dexinfo"}'
2、獲取指定DEX文件包含可加載類名:
adb shell am broadcast -a com.zjdroid.invoke --ei target pid --es cmd '{"action":"dump_class","dexpath":"*****"}'
4、根據Dalvik相關內存指針動態反編譯指定DEX,並以文件形式保存。
adb shell am broadcast -a com.zjdroid.invoke --ei target pid --es cmd '{"action":"backsmali","dexpath":"*****"}'
該方式可以脫殼目前大部分流行的加固防護。(由於手機性能問題,運行較忙)
例外情況:
由於ApkProtect特定防修改檢測,需要做如下修改即可解固該保護:
(1)在設備上創建特定目錄(如/data/local)並 chmod 為777 (2)復制zjdroid.apk到該目錄,並修改文件名為zjdroid.jar (3)修改/data/data/de.robv.android.xposed.installer/conf/modules.list,模塊代碼文件修改為zjdroid.jar,然后重啟設備即可。
5、Dump指定DEX內存中的數據並保存到文件(數據為odex格式,可在pc上反編譯)。
adb shell am broadcast -a com.zjdroid.invoke --ei target pid --es cmd '{"action":"dump_dexfile","dexpath":"*****"}'
6、Dump指定內存空間區域數據到文件
adb shell am broadcast -a com.zjdroid.invoke --ei target pid --es cmd '{"action":"dump_mem","start":1234567,"length":123}'
7、Dump Dalvik堆棧信息到文件,文件可以通過java heap分析工具分析處理。
adb shell am broadcast -a com.zjdroid.invoke --ei target pid --es cmd '{"action":"dump_heap"}'
8、運行時動態調用Lua腳本
該功能可以通過Lua腳本動態調用java代碼。
使用場景:
a.可以動態調用解密函數,完成解密。
b.可以動態觸發特定邏輯。
adb shell am broadcast -a com.zjdroid.invoke --ei target pid --es cmd '{"action":"invoke","filepath":"****"}'
luajava相關使用方法:http://www.keplerproject.org/luajava/
9、敏感API調用監控
三、相關命令執行結果查看
1、命令執行結果:
adb shell logcat -s zjdroid-shell-{package name}
2、敏感API調用監控輸出結果:
adb shell logcat -s zjdroid-apimonitor-{package name}
四、ZjDroid的安裝
1.首先需要安裝xposed框架,運行后選擇“框架”==》“安裝/更新”操作。
2.安裝模板(ZjDroid.apk)
安裝ZjDroid.apk后,點擊xposed的模塊選項,勾上ZjDroid選項,然后重啟系統激活軟件。
五、脫殼案例演示
以“捕魚達人3(1.01版)”為例來演示ZjDroid的脫殼過程,“捕魚達人3”加的是“某加密”的殼,這個殼的關鍵詞是chaosvmp。在手機上安裝好程序並運行,然后依據以下步驟進行脫殼:
1、打開命令行輸入以下命令查看logcat:
adb logcat -s zjdroid-shell-org.cocos2d.fishingjoy3
如下圖所示:
記下hook的pid=14630
2、另外開啟一個命令窗口,通過adb shell向手機發送執行命令獲取APK當前加載的DEX文件的信息,命令如下:
am broadcast -a com.zjdroid.invoke --ei target 14630 --es cmd '{action:dump_dexinfo}'
這時候第一個打開的命令窗口就會出現以下信息:
從圖中可以看到3個filepath信息,到底應該dump哪個呢?我們一般首先選擇.apk后綴的,如果dump出現錯誤,可以再試試包含classes.jar的路徑(梆梆加固的要選擇classes.jar的路徑)。現在開始執行dump dex的命令:
am broadcast -a com.zjdroid.invoke --ei target 14630 --es cmd '{action:backsmali, "dexpath":"/data/app/org.cocos2d.fishingjoy3-1.apk"}'
正常情況下,如果dump完畢,則會提示“build the dexfile ok”,dump出來的dex文件保存在/data/data/應用包名/files目錄下,文件名為dexfile.dex。我們將該文件重命名為classes.dex替換掉原包中的同名文件,再重新簽名安裝運行就可以了。下圖所示為對陌陌5.0版本成功dump的結果。
但是在本例中,等待一段時間后,並沒有出現跟上面類似的提示,並且程序停止不再運行,如下圖所示。
查看/data/data/ org.cocos2d.fishingjoy3/files目錄下的dexfile.dex文件,內容為空,說明dump時建立dex文件不成功。不過不要緊,還有一個smali文件夾,里面包含了執行backsmali命令后得到的全部smali文件。
注意:如果執行backsmali命令的時候提示“the cmd is invalid”,則可能是以下幾個原因:
(1)命令輸入不對。仔細檢查一下命令是否輸入正確,包括引號的輸入。
(2)沒有獲取root權限。已經root的手機su一下即可。
3、修復錯誤
用apktool把原apk反編譯,將smali文件夾里面的文件用dump出來的文件替換,然后重編譯,出現如下錯誤信息:
根據錯誤提示,找到對應文件的1767和3963行的代碼
將這幾行代碼注釋掉,並以同樣方法處理掉接下來的錯誤,就可以順利進行重打包了。將重打包后的文件簽名並安裝運行,閃退。后來在AndroidManifest.xml文件中發現android:name沒有修改,於是把該屬性刪除,重打包安裝還是閃退,這到底是腫么了?
通過LogCat查看log信息,發現問題在這里:
用IDA打開各個so文件,按下shift+F12快捷鍵,搜索“fuck exit1!”,在libfishingjoy3.so中找到了該字符串,查看其調用情況,如圖所示:
在002020B8處存在唯一調用:
用010Editor打開該so,CTRL+G跳轉到002020B8處,修改16進制數據為00 00 A0 E1(NOP指令),保存,簽名重新安裝,這下可以正常運行了。