天天看點

android逆向-通過IDA工具dump指定的dex原理運作環境開始

  • 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安裝目錄下的

開始

  1. 打開usb調試
  2. 複制IDA 安裝目錄下dbgsrv 檔案裡面的android_server檔案到 手機記憶體儲的 /data/local/tmp 目錄下
  3. 控制台輸入 adb shell su 指令擷取管理者權限
  4. cd /data/local/tmp 進入android_server目錄 ,輸入chmod 777 android_server指令擷取執行權限
  5. ./android_server啟動android_server
  6. 新開一個指令視窗 不用擷取管理者權限

    直接輸入 adb forward tcp:23946 tcp:23946 指令 端口轉發

  7. adb shell am start -D -n 包名/activity路徑 啟動應用

    adb shell am start -D -n com.cmxxzwy.mz/com.e4a.runtime.android.mainActivity

  8. 打開IDA
  9. 菜單 debugger->attach->Remote ARM Linux/android debugger
  10. debug options一定要選
android逆向-通過IDA工具dump指定的dex原理運作環境開始
android逆向-通過IDA工具dump指定的dex原理運作環境開始
  1. hostname處輸入127.0.0.1
  2. 點選ok後,在彈出的程序選擇框 選擇要調試的com.cmxxzwy.mz 程序
  3. 手機上的App開始運作後一定要點選IDA 的開始運作按鈕。如果有反調試的話,一定要先下斷點,不然一運作就崩潰了,一切重新來過。
android逆向-通過IDA工具dump指定的dex原理運作環境開始
  1. 打開Android Device Minitor
    android逆向-通過IDA工具dump指定的dex原理運作環境開始
  2. 檢視 要調試的程序,發現8700端口被占用。可以使用8677端口

    jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8677

    用jdb将app恢複執行。

  3. 找到libart.so 的 openMemory方法,在push下面的任意一行按F2下斷點
  4. 按F9,跳到斷點的位置,檢視寄存器,R1(開始位置)和R2(大小),注意:這裡會走多次,大家可以通過dex的大小做判斷,具體dump哪一個
  5. 下腳本(按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逆向-通過IDA工具dump指定的dex原理運作環境開始

問題描述:

啟動過一次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(檢視程序)

android逆向-通過IDA工具dump指定的dex原理運作環境開始

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

繼續閱讀