阿里第一代 android dex加固的脫殼方法
脫殼環境: Android 4.2、dalvik模式、 root…
使用到的工具:
- IDA 6.8 Android
- Device Monitor
- Android Killer V1.3.1.0
- Android逆向助手V2.2
將程式拖入Android killer 工具中 ,彈出如下視窗
在清單檔案中看到application中有定義android:name
Android:name 不瞭解 、網上收集了下
android:name屬性是用來設定所有activity 屬於哪個application的,預設是android.app.Application。
當然也可以自己定義一個類,例如:
public class TestApplication extends Application {}
這個類的作用是為了放一些全域性的和一些上下文都要用到的變數和方法。
然後在 AndroidManifest.xml 中 application 節點中新增android:name屬性
application android:icon="@drawable/icon"android:label="@string/app_name"
android:name =".TestApplication"
這樣就可以將預設的Application給設定成我們自定義的TestApplication
這樣處理的好處是:繼承的話,當應用程式退出後其生命週期也跟著結束,
而用靜態類的話程式退出後不會立刻被gc回收,當你再次進入後會發現該靜態類儲存的資訊狀態
是之前的。有可能會導致程式不是你想要的初始化狀態。PS:TestApplication一定要指明類域為public,否則執行時候會報錯找不到這個類。
即使寫成這樣:class TestApplication extends Application{}也不可以,因為預設情況只是為包可見
大概看出,程式的入口已經不是預設的application了,而是com.ali.mobisecenhance.StubApplication
我們去找StubApplication類看個究竟
可以看到,StubApplication載入了一個so檔案。名字是libmobisec.so,並聲明瞭3個方法
疑問:並沒有程式碼中看到呼叫這3個so檔案中的方法,可能是工具沒有解析全,需要進一步探究,這裡掠過。。
下一步我們去分析so檔案。這裡掠過。。。
猜測:
這個so檔案是解密dex檔案的。
我們讓程式執行起來,在Dalivk開始載入解密後的dex檔案時,把dex檔案從記憶體中dump下來即可。
根據android原始碼知道,Dalivk在載入dex檔案時用到方法
int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)
此方法第一個引數是dex的基址,第二個引數是dex的大小。這正是我們需要的。
1. 以除錯模式啟動測試程式
2. 用IDA附加測試程式
3. 在記憶體中給dvmDexFileOpenPartial下斷點,執行程式, 得到方法dvmDexFileOpenPartial引數1和引數2的值
4. 執行IDA指令碼,dump dex到本地。
下面是詳細操作步驟
1.以除錯模式啟動測試程式
命令格式: adb shell am start -D -n PackageName/ActivityName
2.用IDA附加測試程式
把程式android_server push到安卓裝置/data/local/tmp/目錄下並執行 【android_server在IDA 6.8\dbgsrv目錄下】
設定埠轉發,轉發PC資料到手機,埠為android_server監聽的埠
開啟IDA程式,選擇如下
3.在記憶體中給dvmDexFileOpenPartial下斷點,執行程式
在模組搜尋dvm,然後雙擊進入so程式
接著搜尋關鍵 函式 DvmDexFileOpenPartial
開啟Android Device Monitor
在控制檯輸入指令 jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
jdb connect : 連線被除錯程式應用層,使程式執行起來
按F8單步除錯一下,看棧的變化,得到方法dvmDexFileOpenPartial引數1和引數2的值
為了驗證是否正確,按快捷鍵 G ,輸入地址0x4c05a008,跟過去瞧瞧,可見是正確的
3.執行IDA指令碼,dump dex到本地。
開啟指令碼視窗- File –Script Command 或直接用快捷鍵“Shift + F2 ”
將dex基址改為0x4c05a008,dex檔案大小改為0x941fc
static main(void)
{
auto fp, begin, end, dexbyte;
fp = fopen("d:\\dump.dex", "wb"); //開啟或建立一個檔案
begin = 0x4c05a008; //dex基址
end = begin + 0x941fc; //dex基址 + dex檔案大小
for ( dexbyte = begin; dexbyte < end;dexbyte ++ )
{
fputc(Byte(dexbyte), fp); //按位元組將其dump到本地檔案中
}
}
如圖,點選執行,稍等片刻
可以看到D盤目錄下多一個dex檔案
接下來用 工具 Android逆向助手 反編譯dex檔案
在Android Killer V1.3.1.0中開啟這個路徑,將反編譯dex檔案後生成的兩個檔案android和com複製到smali目錄下
在清單檔案中刪除android:name屬性,並儲存
最後編譯、安裝、執行
能執行,我們脫殼並修復成功了