【原創】簡單嘗試脫“愛加密”官網加固的DEX殼
轉:http://bbs.pediy.com/showthread.php?p=1459603#post1459603
0x00 序
第一次嘗試脫dex殼,樣本是在“愛加密”官網上免費加固的,非商業版。
本文只是做些簡單的筆記,給像我一樣的逆向新手們提供點思路,高手們不要見笑。
0x01 加固包和原包對比
加固後的classes.dex檔案變大了,脫到JEB裡面發現多了一些殼程式碼和一些垃圾類(jpvbhn、cioub、flsye…)。
原包中,很多類方法的指令被抽空了,如下面的onCreate。
將assets目錄下的libexec.so脫到IDA中,發現個別方法被加密,並且用了o-llvm進行混淆編譯。匯出表中的那些x、y開頭的變數就是o-llvm在編譯過程中,新增混淆控制流(-bcf)時建立的。
ptrace注入,從記憶體中dump出來一個libexec.so,看一下字串表:
在字串表中看到一些關鍵詞(dvmResolveClass.c、HOOK:%s() write dex!),
原包中,很多類方法的指令被抽空了,如下面的onCreate。
將assets目錄下的libexec.so脫到IDA中,發現個別方法被加密,並且用了o-llvm進行混淆編譯。匯出表中的那些x、y開頭的變數就是o-llvm在編譯過程中,新增混淆控制流(-bcf)時建立的。
ptrace注入,從記憶體中dump出來一個libexec.so,看一下字串表:
在字串表中看到一些關鍵詞(dvmResolveClass.c、HOOK:%s() write dex!),
瞎猜愛加密可能是抽取dex中的方法指令,然後hook dalvik/art 關鍵函式,在
執行時載入該類時再解密指令。所以用DexHunter試一下。
https://github.com/zyq8709/DexHunter
ps:從字串表也可以看到,愛加密為了“防模擬器”,
判斷了好多系統屬性(ro.product.model、ro.product.device…)。
0x02:利用DexHunter還原dex
DexHunter的大致原理是在某dex的第一個類被載入時,遍歷該dex檔案的所有的class_def_item,
主動載入所有的class(呼叫dvmDefineClass),並初始化(呼叫dvmIsClassInitialized和dvmInitClass),
讓殼自己完成方法指令的解密,然後再做必要修復並dump。
編譯帶DexHunter的dalvik,刷機之後試了一下,在脫殼過程中apk程式死了。
愛加密有點意思,應該是在libexec.so或libexecmain.so被載入之後,
編譯帶DexHunter的dalvik,刷機之後試了一下,在脫殼過程中apk程式死了。
愛加密有點意思,應該是在libexec.so或libexecmain.so被載入之後,
在native程式碼中判斷了“/data/”目錄下是否存在dexname檔案
(這也算DexHunter的一個特徵),如果有則自退。
修改DexHunter原始碼,把dexname這個檔名改掉:
再試一次,還是掛了,這次貌似是呼叫com.cioub類的clinit方法導致的。
看一下com.cioub類的clinit方法的實現就明白了,上面提到的那些垃圾類(jpvbhn、cioub、flsye…),
修改DexHunter原始碼,把dexname這個檔名改掉:
再試一次,還是掛了,這次貌似是呼叫com.cioub類的clinit方法導致的。
看一下com.cioub類的clinit方法的實現就明白了,上面提到的那些垃圾類(jpvbhn、cioub、flsye…),
都是愛加密為了“防DexHunter”新增的。
先用笨方法解決一下,通過一個名單檔案,將這些“防DexHunter”類pass掉。
再試一次,脫出了whole.dex,這實際是一個odex檔案,利用baksmali和smali將其轉換為dex檔案,
先用笨方法解決一下,通過一個名單檔案,將這些“防DexHunter”類pass掉。
再試一次,脫出了whole.dex,這實際是一個odex檔案,利用baksmali和smali將其轉換為dex檔案,
拖到JEB中看一下:
之前被抽空的onCreate方法成功還原了,去掉那些垃圾類和shell程式碼應該就差不多了。
0x03 後序
1、使用DexHunter脫完之後,如果還有方法沒有還原,那加固廠商可能做了函式級加解密,
之前被抽空的onCreate方法成功還原了,去掉那些垃圾類和shell程式碼應該就差不多了。
0x03 後序
1、使用DexHunter脫完之後,如果還有方法沒有還原,那加固廠商可能做了函式級加解密,
在方法呼叫時再解密方法指令。
2、定位native方法指令在記憶體中的位置
這3個native方法是愛加密加固之後的3個核心方法,但libexec.so的JNI_Onload貌似加密了,
這3個native方法是愛加密加固之後的3個核心方法,但libexec.so的JNI_Onload貌似加密了,
並且匯出函式的名字也混淆了(採用RegisterNative動態註冊),找出對應的native函式有點費勁。
可以在dvmCallJNIMethod函式中加點log,其實這個函式中本來有log,只不過注掉了。放開的時候,
可以在dvmCallJNIMethod函式中加點log,其實這個函式中本來有log,只不過注掉了。放開的時候,
要進行一下過濾,否則打出的日誌太多會淹沒其它有用的資訊。
3、愛加密應該已經有直譯器殼了,猜測愛加密商業版以後可能會是“類抽取+直譯器殼”的形式,
3、愛加密應該已經有直譯器殼了,猜測愛加密商業版以後可能會是“類抽取+直譯器殼”的形式,
因為所有指令都解釋執行的話,應該會對效率影響較大,所以二者結合是個不錯的選擇。
相關文章
- 【原創】一個dex脫殼指令碼指令碼
- “愛加密” 動態脫殼法加密
- 360加固保動態脫殼
- 一次簡單的脫殼
- 【原創】簡單替換加密加密
- [原創]heXer老兄的telock0.98脫殼機原理
- FlashSnap 1.0的簡單脫殼與演算法探析演算法
- APK加固之靜態脫殼機編寫入門APK
- 脫殼基礎知識以及簡單應用
- 殼的工作原理脫殼
- 嘗試讓查詢更簡單
- 騰訊安全ApkPecker上線DEX-VMP自動化脫殼服務APK
- MySQL刪除資料的簡單嘗試MySql
- 某當網apk加固脫個soAPK
- go1.18泛型的簡單嘗試Go泛型
- ASPRTECT1.2X加殼的Delphi Application Peeper Pro 2.3.1.9 脫殼(簡單) (3千字)APP
- 應急加固【簡單】
- 魔術情書 6.55 破解過程+不脫殼打破解補丁【原創】
- 【開源之路】溫蒂、一次簡單的嘗試
- Unity嘗試實現簡單的行為樹-01Unity
- MySQL控制程式碼恢復的簡單嘗試MySql
- 惡意軟體的脫殼方法(二):弱加密演算法加密演算法
- 壹次脫殼法――Armadillo 雙程式標準殼 快速脫殼
- VBExplorer.exe脫殼教程 附脫殼指令碼指令碼
- ExeStealth 常用脫殼方法 + ExeStealth V2.72主程式脫殼
- 脫殼----對用pecompact加殼的程式進行手動脫殼 (1千字)
- 嘗試做一個.NET簡單、高效、避免OOM的Excel工具OOMExcel
- 以殼解殼--SourceRescuer脫殼手記破解分析
- mysql簡單脫敏MySql
- 脫殼基本知識
- SoftDefender主程式脫殼
- International CueClub主程式脫殼(Softwrap殼)
- MySQL 5.5複製升級到5.7的一點簡單嘗試MySql
- 脫ASPack2.12加殼的DLL檔案簡便方法
- 簡單加密加密
- [原創]多層殼與Anti-ImportRECImport
- Alex-protect外殼完全分析【原創】
- 一次簡單的shodan的使用 原創