前提條件:
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檔案資訊:
2、擷取指定DEX檔案包含可加載類名:
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上反編譯)。
6、Dump指定記憶體空間區域資料到檔案
7、Dump Dalvik堆棧資訊到檔案,檔案可以通過java heap分析工具分析處理。
8、運作時動态調用Lua腳本
該功能可以通過Lua腳本動态調用java代碼。
使用場景:
a.可以動态調用解密函數,完成解密。
b.可以動态觸發特定邏輯。
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指令),儲存,簽名重新安裝,這下可以正常運作了。
原文位址: http://www.cnblogs.com/goodhacker/p/3961045.html