測試環境為:
安卓2.3
IDA6.6
下面看具體操作步驟:
具體怎樣用IDA動態調試我就不多說了,網上己經有很多文章了,下面直接進入正題。
1.准備好調式環境后 用IDA附加進程。

2.附加成功后按"G"鍵 跳到dvmDexFileOpenPartial函數與fopen函數與fgets函數去下好斷點。


3.下好斷點后我們來說說它的反調試吧,下面我給兩張圖片大家可能就會明白它的反調試是怎么一回事了。
在調試狀態下查看進程 TracerPid 不為0

在非調試狀態下查看進程 TracerPid 為0

上面TracerPid: 23131
不為0時表示跟蹤當前進程的進程ID,如果是0,表示沒有跟蹤。
4.明白了反調試后就可以進下面脫殼步驟了 F9 運行 斷在fopen

5.打開進程成功后使用fgets獲得信息 當獲得如下信息進我們將其修改為 0

修改為 0 后

6.我在測試時它檢查了兩次,都修改后就會來到這里。

7.這樣就得到了解密后的DEX開始地址與大小,R0為存放DEX數據開始地址,R1為Dex大小,Dump出來。
8.寫個簡單的過idc腳本將其dump出來,開始地址加上dex大小就是結束地址了。
0x446DC4E4為開始地址加上大小后等於0x4472AFBC(結束地址)
auto fp, dexAddress;
fp = fopen("C:\\test.dex", "wb");
for ( dexAddress=0x446DC4E4; dexAddress < 0x4472AFBC; dexAddress++ )
fputc(Byte(dexAddress), fp);
9.使用idc腳本將其dump出來

運行完腳本后c盤就會出來明文的DEX了,到此脫殼完成。
重新打包時一定要刪除AndroidManifest.xml文件中
android:name="com.shell.SuperApplication" 殼入口。
這樣原始的dex文件就被dump出來了。
完.
樣本及文檔下載
http://yunpan.cn/cASwMkjaMwaTy (提取碼:ce81)
