1. 程式人生 > >Android動態除錯so之dump記憶體資料

Android動態除錯so之dump記憶體資料

1.配置環境

一臺已root手機
IDA pro6.6
Android SDK

準備工作:
1.1把Android SDK新增到環境變數中
1.2把已root手機的系統中關鍵so拖到本地,必要時可以靜態讀取,獲取系統函式的偏移地址。
例如把手機系統的system/lib的檔案拖到本地debugging資料夾中。

adb pull /system/lib .\debugging\lib

1.3在IDA pro6.6中找出android_server,並把android_server放到手機system/bin中。push的時候沒有root許可權,可以如下操作:

adb push android_server /data/local/tmp
adb shell
su
cp /data/local/tmp/android_server /system/lib

2.環境啟動

由於需要除錯程式啟動載入的so,所以步驟比較多。
2.1進入adb shell,在手機中執行android_server。

adb shell
su
android_server

2.2進行埠轉發

adb forward tcp:23946 tcp:23946

2.3使用除錯模式啟動程式,adb shell am start -D -n 包名/類名,以上一篇博文的dexunshellram為例,dexunshellram動態載入了crackme0201,啟動命令如下:

adb shell am start -D -n com.droider.dexunshellram/com.droider.crackme0201.MainActivity

2.4開啟IDA6.6,開啟需要除錯的so,然後選擇Debugger->Select debugger,選擇Remote ARM Linux/Android debugger。
然後選擇Debugger->Debugger options,勾選所有logging和Events裡的Suspend on thread start/exit和Suspend on library load/unload。
然後選擇Debugger->process options,在Hostname中填寫127.0.0.1,埠預設為23946。
然後選擇Debugger->attach a process,選擇com.droider.dexunshellram。
然後可能出現如下圖所示,需要add map,由於之前把手機系統的system/lib複製到電腦中,這樣可以指定到電腦的相應資料夾中,這樣就可以靜態除錯系統so。如果你覺得你用不著除錯系統函式,可以不用指定。

image0
2.5在Android SDK中找出ddms.bat,雙擊開啟,為了後面執行jdb。
2.6在IDA中點選執行或者按F9,然後在cmd中執行一下命令啟動jdb

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

2.7IDA在linker中停下了,然後在path中找到相應除錯的libunshellram.so,選擇函式Java_com_droider_dexunshellram_unshellram_loadDex,這裡是記憶體動態載入dex的地方。在else語句之前進行斷點,就是loc_前一行插入斷點,按F2,然後再執行程式,按F9。

3.dump記憶體

如下圖所示,R0暫存器BE8F9144-48儲存著Dex檔案的地址。
image1
可以看出暫存器儲存的地址為0x7653E008
image2
檢視0x7653E018地址可以看出儲存的就是DEX檔案,DEX檔案是dex.035開頭的。而0x7653E038-3B儲存著是DEX檔案的長度25C5BC
image3
把以下指令碼儲存成dump.py,通過在file->Script File,選擇dump.py。然後輸入0x7653E018,輸入長度0x25C5BC,最後輸入儲存的檔案C:\classes.dex。

import struct
def dumpdex(start, len, target):
	rawdex = idaapi.dbg_read_memory(start, len)
	fd = open(target, 'wb')
	fd.write(rawdex)
	fd.close()

def getdexlen(start):
	pos = start + 0x20
	mem = idaapi.dbg_read_memory(pos, 4)
	len = struct.unpack('

把dex檔案dump到C盤中,由於是crackme0201的classes.dex,如果把dex放回之前博文的crackme0201的apk中,可以正常啟動應用。