- IDA使用知識,如果沒有使用過可以先看看
- ida調試方法與快捷鍵
原理
android在運作app時,不管做了多麼牛逼的加強,一定會将最終的dex檔案加載到記憶體,通過這個特性,我們隻要找到dex在記憶體的位置,然後dump出來…
實際運用
需要過掉前期的反調試,對這些有dex資訊的函數下斷(過反調試是個繁瑣的任務)
其他方案
① 通過修改Android系統源代碼,在這些dump點插入dump整體dex的代碼
② 使用frida來hook這些函數,然後通過指針對這些對象中的變量進行通路,最終定位到記憶體中的dex的起始點并完成dump
③ 使用xposed或者virtualxposed結合native層函數的hook技術實作
将dex加載到記憶體的函數是什麼?
-
dvm虛拟機:
android版本:4.4(包括)以下
在libdvm.so中的dvmDexFileOpenPartial()函數,R0寄存器指向的位址就是dex檔案在記憶體中的開始位址,R1寄存器就是dex檔案的大小
-
art虛拟機:
android版本:5.0-7.0
在libart.so中的openMemory()函數R1寄存器指向的位址就是dex檔案在記憶體中的開始位址,R2寄存器就是dex檔案的大小
android版本:8.0以上發現沒有openMemory()函數,如果知道的可以留言補上
可以通過
adb push /system/lib/libart.so 存放的位址
然後通過ida檢視是否有沒有這個函數
運作環境
前提條件和運作環境一定要寫清楚,不然會有很多坑,坑死人。
- 小米5手機,android7.0開發版,已root
- IDA 是7.0.170914版本
- JDB 使用Java安裝目錄下的
開始
- 打開usb調試
- 複制IDA 安裝目錄下dbgsrv 檔案裡面的android_server檔案到 手機記憶體儲的 /data/local/tmp 目錄下
- 控制台輸入 adb shell su 指令擷取管理者權限
- cd /data/local/tmp 進入android_server目錄 ,輸入chmod 777 android_server指令擷取執行權限
- ./android_server啟動android_server
-
新開一個指令視窗 不用擷取管理者權限
直接輸入 adb forward tcp:23946 tcp:23946 指令 端口轉發
-
adb shell am start -D -n 包名/activity路徑 啟動應用
adb shell am start -D -n com.cmxxzwy.mz/com.e4a.runtime.android.mainActivity
- 打開IDA
- 菜單 debugger->attach->Remote ARM Linux/android debugger
- debug options一定要選

- hostname處輸入127.0.0.1
- 點選ok後,在彈出的程序選擇框 選擇要調試的com.cmxxzwy.mz 程序
- 手機上的App開始運作後一定要點選IDA 的開始運作按鈕。如果有反調試的話,一定要先下斷點,不然一運作就崩潰了,一切重新來過。
- 打開Android Device Minitor
android逆向-通過IDA工具dump指定的dex原理運作環境開始 -
檢視 要調試的程序,發現8700端口被占用。可以使用8677端口
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8677
用jdb将app恢複執行。
- 找到libart.so 的 openMemory方法,在push下面的任意一行按F2下斷點
- 按F9,跳到斷點的位置,檢視寄存器,R1(開始位置)和R2(大小),注意:這裡會走多次,大家可以通過dex的大小做判斷,具體dump哪一個
- 下腳本(按Shift+F2),然後點選run,等待dump完成
static main(void){
auto fp, begin, end, dexbyte;
//打開或建立一個檔案
fp = fopen("d:\\dump.dex", "wb");
//dex基址
begin = R1;
//dex基址 + dex檔案大小
end = begin + R2;
print "length:%d"%(R2)
for ( dexbyte = begin; dexbyte < end; dexbyte ++ ){
//按位元組将其dump到本地檔案中
fputc(Byte(dexbyte), fp);
if((end-dexbyte)%100==0){
print "dump %d"%(end-dexbyte)
}
}
}
19: 目前dump出來的dex,方法全部配抽空了,有些android版本的是沒有問題的
常見問題
問題描述:
IDA連接配接android_server 選中程序點ok之後 連接配接不上報錯
提示:
The debugger could not attach to the selected process.
This can perhaps indicate the process was just terminated, or that you dot’t have the necessary privileges.
原因:
Android5.0之後預設啟用了 SELinux/SEAndroid
解決方法:
setenforce 0
或者
echo 0 > /sys/fs/selinux/enforce
問題描述:
啟動過一次android_server之後,再次啟動報錯
提示:
IDA Android 32-bit remote debug server(ST) v1.22. Hex-Rays © 2004-2017
bind: Address already in use
原因:
該端口程序還沒殺死,不能重複起來
解決方法:
1:adb shell
2:ps |grep android_server(檢視程序)
3:kill -9 xxxx(殺死這個程序,xxxx需要自己看程序号對應如kill -9 9971)
4:重新啟動
問題描述:
啟動ida失敗
提示:
Incompatible debugging server:
address size is 4 bytes, expected 4
原因:
你的android_server 是32位的,而你啟動的 ida 是64位的
解決方法:
換成32位的ida 就OK