最近對接某應用, 他們整合我司sdk後出了點問題, 打算看看他們程式碼, 發現咋jadx中找不到包名目錄;
可以看到有個 wrapper 包名 com.secneo.apkwrapper
包名, 查了下, 是梆梆加固的(我自己用免費的梆梆加密apk,倒是沒有個包,而是多了 com.secshell.secData
包):
之前用愛加密/騰訊樂固等加固軟體, 都會隱藏app所有程式碼, 沒想到梆梆只隱藏了app本身的程式碼,而對其依賴的第三方庫的程式碼則保持不變, 一開始看到這個目錄結構時,還以為是沒有做加固,因此想找找看可不可以嘗試脫殼,因為以前沒玩過,所以在此記錄下; P.S. 忙活到最後,發現想脫殼的apk在虛擬機器中執行不起來,鬱悶的啊?, 不過倒也不是沒有收穫就是了;
工具
搜尋了一圈,發現有個開源專案 DexExtractor 直接支援梆梆脫殼; 這個專案最早是在 看雪論壇 上釋出的;
DexExtractor 的使用
1. 將 github 專案 clone下來
後續會用到裡面的 Decode.jar
;
2. 到作者網盤上下載 system.img 並解壓
這個檔案是用於 android 4.4 api 19 虛擬機器的, 所以需要在 <androidSDKHome>/system-images
中有 android-19
目錄,
若無
<androidSDKHome>/system-images/android-19
,則可通過 android studio的建立虛擬機器功能,一步步選擇System-image --> Other Images --> Kitkat 19 armeab-v7a Android 4.4(非 Google APIs)
下載完後建立一臺基於此image的虛擬機器;
3. 拷貝剛才下載的 system.img
到 <androidSDKHome>/system-images/android-19/default/armeabi-v7a/
中
可以備份下原始的 system.img
4. 啟動剛才建立的虛擬機器(api 19);
5. 將需要脫殼的apk拖入虛擬機器安裝執行;
注意: 要求apk帶有讀寫儲存卡的許可權,若無,請自行反編譯apk新增後重新編譯簽名後再安裝執行;
6. 開啟 as logcat 會看到如下日誌:
其中 create file /sdcard/<your_package_name>_classes_***.dex
就是作者把記憶體中執行的dex經過 base64 加密後寫到儲存卡上的,可能有多個;
將這些檔案都拷貝出來,方法:
adb pull /sdcard/<your_package_name>_classes_***.dex
- 利用 android studio 3.0+ 的
Device File Explorer
來檢視/sdcard
目錄, 直接右鍵儲存所需要的檔案到電腦上;
最後, 將拷貝出來的dex檔案統一放入一個目錄中,比如 dex_dir
;
7. 利用第1步下載的 Decode.jar
進行 base64 解密
java -jar Decode.jar dex_dir
複製程式碼
執行完成後, dex_dir
目錄中的每個dex都會生成一個對應的 *.read.dex ,這就是解密後的dex;
但此時的dex無法直接通過jadx工具檢視,因為是odex,倒是可以通過ida開啟,因此需要進行轉換;
8. 下載 baksmali.jar 和 smali.jar
9. 將odex轉為jar
// 將odex檔案 "your_dex.read.dex" 轉成samli檔案,輸出到 classout 目錄中
java -jar baksmali-2.2.2.jar disassemble -o ./classout/ your_dex.read.dex
複製程式碼
10. 將smali目錄重新打包生成dex檔案: final.dex
java -jar smali-2.2.2.jar assemble ./classout -o final.dex
複製程式碼
11. 利用jadx直接檢視 final.dex 檔案即可看到原始碼;
參考文章
Apk脫殼聖戰之—如何脫掉“梆梆加固”的保護殼 DexExtractor原理分析 常見app加固廠商脫殼方法研究 Android應用程式通用自動脫殼方法研究 Andorid APK反逆向解決方案---梆梆加固原理探尋