Android應用的內存抓取


工具準備

1. 一臺Windows PC,安裝好Android NDK,能用ADB連接你的Android設備;另外需要專業版的WinHex,建議購買正版,寫本文時是488RMB一套;
2. 一臺root過的Android手機,內存最好1G以上,空閒存儲空間2G以上,安裝的系統版本最好在4.2.2以上;
(較早的版本可能會遇到gdb兼容性問題,不過筆者也沒有在較老的版本本測試過,只是看到有文章說最好這個版本,所以老的版本說不定也可以工作,只要能找到合適版本的gdb就可以)。
3. 在Android設備上安裝好BusyBox

操作步驟

一、用ADB登陸到你的Android設別,確保獲得root權限(su)

二、在Android設備上啓動你想抓取內存的應用

三、查出目標應用的PID
可以使用命令dumpsys meminfo | grep com.*找到你的目標應用,或這如果知道應用名關鍵字,用ps -ef | grep namekey也可以查到

四、用GDB調試程序,dump內存
如果你的設備上安裝了gdb,直接使用命令 gdb -pid xxxx 就可以注入到目標程序,用gcore saveFile 就可以將應用的當前內存數據保存到saveFile文件中。保存文件時需要把目標文件設置到有寫權限的目錄下,這個輸出文件大約需要佔用1G左右的存儲空間,選擇目標位置的時候需要注意。

如果你的設備上還沒有gdb,可以在網絡上搜索適合你的手機CPU體系結構的gdb可執行程序,用adb push到手機上使用;
然而,實際上,Android的NDK裏已經有了用於調試本地代碼的GDB程序,只不過是在手機上運行gdbserver,然後在PC上遠程連接調試的方法。下面的步驟介紹如何使用這中調試方式:

- 針對你的手機平臺的gdbserver可以從NDK安裝根目錄下的prebuilt中找到,例如加入你的手機是ARM體系的CPU, 則使用$NDKROOT/prebuilt/android-arm/gdbserver/目錄下的gdbserver程序,用adb push到你的手機上,放到/system/bin目錄,添加可執行權限,運行即可:
gdbserver :1234 --attach pid
該命令會啓動gdbserver,附加到ID爲pid的進程上,並在TCP端口1234上監聽gdb client連接。

- 在NDK目錄$NDKROOT/toolchains目錄下查找gdb客戶端程序,如我的Android設備是ARM體系的,然後要在X86體系的PC上使用gdb客戶端,所以打開的客戶端就是: $NDKROOT/\toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin目錄下的程序arm-linux-androideabi-gdb.exe。
在gdb提示符下輸入下面的命令:

<pre name="code" class="plain">gdb>shell adb forward tcp:1234 tcp:1234
gdb>target remote localhost:1234



即可連接到Android客戶機上,然後就可以像調試本地程序一樣調試Android應用了。

使用下面的命令將應用的內存映像保存到文件:
gdb>gcore savefile.out

Note: 如果在用adb上傳文件時遇到Read Only File System的問題,可以嘗試切換到root用戶,然後重新以讀寫方式加載文件系統的:
mount -o remount rw /system

五、使用WinHex解析文件內容
其實上面的步驟已經完成了抓取Android應用內存的任務,但是抓取出來的文件有什麼用呢?其實抓出來的文件就是個可執行文件的內存映像,裏面程序運行需要的內容應有盡有,如果你非常熟悉ELF文件的格式,完全可以自己編寫一個工具解析出你想要的內容。
而這裏,我介紹一個強大的工具,WinHex。
用WinHex打開上面dump出的內存文件,選擇tools->Disk Tool->File Recover by Type,然後選擇你感興趣的文件類型,並設置查找選項,選擇輸出目錄,即可進行恢復。


整個操作步驟就是這樣了,要拿到你想要的內容,就看自己的功力了。


當然,要完成這個操作的前提是你的gdb能attach到目標進程上去,有些應用可能會使用反調試技術,如騰訊的手遊,這種方法就不好使了,在第一步啓動gdbserver的時候就會出錯。如何處理這種情況就是另外一個話題了。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章