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提示符下输入下面的命令:

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,然后选择你感兴趣的文件类型,并设置查找选项,选择输出目录,即可进行恢复。
Android应用的内存抓取_第1张图片


整个操作步骤就是这样了,要拿到你想要的内容,就看自己的功力了。


当然,要完成这个操作的前提是你的gdb能attach到目标进程上去,有些应用可能会使用反调试技术,如腾讯的手游,这种方法就不好使了,在第一步启动gdbserver的时候就会出错。如何处理这种情况就是另外一个话题了。








你可能感兴趣的:(逆向工程)