Android Native层调试记录
环境配置
- Android SDK
- IDA Pro
- DDMS
ADB
检查环境变量
首先在控制台输入 adb,查看是否存在以下回显
如果不存在以下回显的话,要把 Android SDK 目录下的 platform-tools 设置为环境变量
查看设备是否连接
设置好后,将手机用数据线连接至电脑,并且使用 adb devices 可以看到设备
安装被调试应用
然后使用 adb install 可以远程安装 app 程序,如果安装失败,可以尝试加上 -r 参数强制安装
IDA Pro 调试服务端
使用 adb 把调试文件置入手机
首先找到 IDA Pro 的安装位置,然后在其目录下的 dbgsrv 文件夹中找到 android_server64
文件,使用 adb push
命令将其传输到安卓手机中,这里选择传输到目录 /data/local/tmp
下
设置文件权限
使用 adb shell 进入手机的远程 shell,并输入 su 来提升权限为 root,再 cd 到 /data/local/tmp
目录下,给上述文件权限,再选择执行文件,可以看到 IDA 的远程调试服务器就配置好了,同时在监听 23946 端口
设置转发
程序在手机内部开启端口,我们需要使用 adb 将其转发至本机的 23946 端口。再一个新的窗口中输入 adb forward tcp:23946 tcp:23946
,来设置转发。
DDMS
DDMS 可以在 Android Stduio 中选择安装,在 File ->Settings
搜索 SDK,找到以下页面
选择 SDK Tools
去掉勾选 Hide Obsolete Packages
选择并下载 Android SDK Tools(Obsolete),如果已经勾选则说明已经安装
安装后的使用 SDK 目录下 tools\monitor.bat
脚本打开 DDMS。
JDB
在 Andoroid Studio 中找到 jdb 文件,在安装目录下的 jre\bin\
或者 jbr\bin\
,可以将其设置为环境变量。
启动调试
以调试模式启动程序
先查看所有包名
使用 pm list packages
可以查看并找到对应的包名
然后使用调试模式启动程序
如果需要调试程序启动初期的代码,那么必须要用这种形式来启动,而如果不是初期的代码,那么使用正常启动后再附加的方式也可以。
|
|
IDA Pro 附加
使用调试模式启动后,再使用 IDA 打开 So 文件,
在此处选择 Remote ARM Linux/Android debugger
然后在这里设定调试选项
修改 Debugger options,选择需要的选项,我这里需要调试 so 库的 JNI_OnLoad,所以至少需要勾选 Suspend on library load/unload。
下面的 Autoload PDB files 建议勾选,如果不勾选无法把当前解析出来的内容在调试过程中显示,在调试过程就不能看伪代码了。
设置好后,在此处选择 Attch to process
选择需要调试的程序
点击 OK 后会断在一个 libc 处
继续执行被调试程序
此时程序虽然被附加调试上了,但是还无法操作程序,需要打开 ddms 进行操作,可以看到我们之前用调试模式启动的程序旁边有一个红色的虫子。
此时,如果 ddms 看不到进程,有可能是以下两个问题
- 说明没有设置
ro.debuggable
(网上有大量教程,这里不再赘述)- ADB 连接问题,重启 adb(adb kill-server 和 adb start-server)
此时记录下 ddms 中的端口为 8700,然后在控制台输入以下命令,其中后面传入的端口就是 DDMS 中显示的端口。
|
|
此时可以发现 ddms 中的小虫子变成了绿色,说明程序继续执行成功了
然后在 IDA 中按多次 F9 继续执行,加载到我们当前 IDA 分析的 so 文件时,IDA 提示会提示是否匹配,选择 Same(如果机器是 X86_64 架构的,这里可能会出错)
此时会断在 linker 处,可以选择单步到初始化位置
或者可以选择去下断点,在右侧搜索和找到想要调试的 so 模块,然后点击查看,可以搜索定位到我们需要下断函数
按 F9 再次执行后就可以断下,如果在上面勾选了自动加载 PDB,那么这个时候应该是可以使用 F5 查看伪代码的,同时这个伪代码是具有符号信息的。