天天看點

ZjDroid工具介紹及脫殼詳細示例

前提條件:

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架構,運作後選擇“架構”==》“安裝/更新”操作。

ZjDroid工具介紹及脫殼詳細示例

2.安裝模闆(ZjDroid.apk)

安裝ZjDroid.apk後,點選xposed的子產品選項,勾上ZjDroid選項,然後重新開機系統激活軟體。

ZjDroid工具介紹及脫殼詳細示例

五、脫殼案例示範

以“捕魚達人3(1.01版)”為例來示範ZjDroid的脫殼過程,“捕魚達人3”加的是“某加密”的殼,這個殼的關鍵詞是chaosvmp。在手機上安裝好程式并運作,然後依據以下步驟進行脫殼:

1、打開指令行輸入以下指令檢視logcat:

adb logcat -s zjdroid-shell-org.cocos2d.fishingjoy3      

如下圖所示:

ZjDroid工具介紹及脫殼詳細示例

記下hook的pid=14630

2、另外開啟一個指令視窗,通過adb shell向手機發送執行指令擷取APK目前加載的DEX檔案的資訊,指令如下:

am broadcast -a com.zjdroid.invoke --ei target 14630 --es cmd '{action:dump_dexinfo}'      
ZjDroid工具介紹及脫殼詳細示例

這時候第一個打開的指令視窗就會出現以下資訊:

ZjDroid工具介紹及脫殼詳細示例

       從圖中可以看到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"}'      
ZjDroid工具介紹及脫殼詳細示例

正常情況下,如果dump完畢,則會提示“build the dexfile ok”,dump出來的dex檔案儲存在/data/data/應用包名/files目錄下,檔案名為dexfile.dex。我們将該檔案重命名為classes.dex替換掉原包中的同名檔案,再重新簽名安裝運作就可以了。下圖所示為對陌陌5.0版本成功dump的結果。

ZjDroid工具介紹及脫殼詳細示例

但是在本例中,等待一段時間後,并沒有出現跟上面類似的提示,并且程式停止不再運作,如下圖所示。

ZjDroid工具介紹及脫殼詳細示例

檢視/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出來的檔案替換,然後重編譯,出現如下錯誤資訊:

ZjDroid工具介紹及脫殼詳細示例

根據錯誤提示,找到對應檔案的1767和3963行的代碼 

ZjDroid工具介紹及脫殼詳細示例
ZjDroid工具介紹及脫殼詳細示例

将這幾行代碼注釋掉,并以同樣方法處理掉接下來的錯誤,就可以順利進行重打包了。将重打包後的檔案簽名并安裝運作,閃退。後來在AndroidManifest.xml檔案中發現android:name沒有修改,于是把該屬性删除,重打包安裝還是閃退,這到底是腫麼了?

ZjDroid工具介紹及脫殼詳細示例

通過LogCat檢視log資訊,發現問題在這裡:

ZjDroid工具介紹及脫殼詳細示例

用IDA打開各個so檔案,按下shift+F12快捷鍵,搜尋“fuck exit1!”,在libfishingjoy3.so中找到了該字元串,檢視其調用情況,如圖所示:

ZjDroid工具介紹及脫殼詳細示例
ZjDroid工具介紹及脫殼詳細示例

 在002020B8處存在唯一調用:

ZjDroid工具介紹及脫殼詳細示例

用010Editor打開該so,CTRL+G跳轉到002020B8處,修改16進制資料為00 00 A0 E1(NOP指令),儲存,簽名重新安裝,這下可以正常運作了。

ZjDroid工具介紹及脫殼詳細示例

原文位址: http://www.cnblogs.com/goodhacker/p/3961045.html

繼續閱讀