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文件信息:

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指令),保存,簽名重新安裝,這下可以正常運行了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM