Android Native层调试记录

警告
本文最后更新于 2022-06-05,文中内容可能已过时。

环境配置

  1. Android SDK
  2. IDA Pro
  3. DDMS

ADB

检查环境变量

首先在控制台输入 adb,查看是否存在以下回显

image.png

如果不存在以下回显的话,要把 Android SDK 目录下的 platform-tools 设置为环境变量

查看设备是否连接

设置好后,将手机用数据线连接至电脑,并且使用 adb devices 可以看到设备

image.png

安装被调试应用

然后使用 adb install 可以远程安装 app 程序,如果安装失败,可以尝试加上 -r 参数强制安装

image.png

IDA Pro 调试服务端

使用 adb 把调试文件置入手机

首先找到 IDA Pro 的安装位置,然后在其目录下的 dbgsrv 文件夹中找到 android_server64 文件,使用 adb push 命令将其传输到安卓手机中,这里选择传输到目录 /data/local/tmp

image.png

设置文件权限

使用 adb shell 进入手机的远程 shell,并输入 su 来提升权限为 root,再 cd 到 /data/local/tmp 目录下,给上述文件权限,再选择执行文件,可以看到 IDA 的远程调试服务器就配置好了,同时在监听 23946 端口

image.png

设置转发

程序在手机内部开启端口,我们需要使用 adb 将其转发至本机的 23946 端口。再一个新的窗口中输入 adb forward tcp:23946 tcp:23946,来设置转发。

image.png

DDMS

DDMS 可以在 Android Stduio 中选择安装,在 File ->Settings 搜索 SDK,找到以下页面

选择 SDK Tools

image.png

去掉勾选 Hide Obsolete Packages

image.png

选择并下载 Android SDK Tools(Obsolete),如果已经勾选则说明已经安装

image.png

安装后的使用 SDK 目录下 tools\monitor.bat 脚本打开 DDMS。

JDB

在 Andoroid Studio 中找到 jdb 文件,在安装目录下的 jre\bin\ 或者 jbr\bin\,可以将其设置为环境变量。

启动调试

以调试模式启动程序

先查看所有包名

使用 pm list packages 可以查看并找到对应的包名

image.png

然后使用调试模式启动程序

如果需要调试程序启动初期的代码,那么必须要用这种形式来启动,而如果不是初期的代码,那么使用正常启动后再附加的方式也可以。

1
adb shell am start -D -n com.example.test/.MainActivity

image.png

IDA Pro 附加

使用调试模式启动后,再使用 IDA 打开 So 文件,

image.png

在此处选择 Remote ARM Linux/Android debugger

然后在这里设定调试选项

image.png

修改 Debugger options,选择需要的选项,我这里需要调试 so 库的 JNI_OnLoad,所以至少需要勾选 Suspend on library load/unload。

下面的 Autoload PDB files 建议勾选,如果不勾选无法把当前解析出来的内容在调试过程中显示,在调试过程就不能看伪代码了。

image.png

设置好后,在此处选择 Attch to process

image.png

选择需要调试的程序

image.png

点击 OK 后会断在一个 libc 处

image.png

继续执行被调试程序

此时程序虽然被附加调试上了,但是还无法操作程序,需要打开 ddms 进行操作,可以看到我们之前用调试模式启动的程序旁边有一个红色的虫子。

image.png

此时,如果 ddms 看不到进程,有可能是以下两个问题

  1. 说明没有设置 ro.debuggable(网上有大量教程,这里不再赘述)
  2. ADB 连接问题,重启 adb(adb kill-server 和 adb start-server)

此时记录下 ddms 中的端口为 8700,然后在控制台输入以下命令,其中后面传入的端口就是 DDMS 中显示的端口。

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

image.png

此时可以发现 ddms 中的小虫子变成了绿色,说明程序继续执行成功了

image.png

然后在 IDA 中按多次 F9 继续执行,加载到我们当前 IDA 分析的 so 文件时,IDA 提示会提示是否匹配,选择 Same(如果机器是 X86_64 架构的,这里可能会出错)

image.png

此时会断在 linker 处,可以选择单步到初始化位置

image.png

或者可以选择去下断点,在右侧搜索和找到想要调试的 so 模块,然后点击查看,可以搜索定位到我们需要下断函数

image.png

按 F9 再次执行后就可以断下,如果在上面勾选了自动加载 PDB,那么这个时候应该是可以使用 F5 查看伪代码的,同时这个伪代码是具有符号信息的。

image.png

0%