0%

IDA调试安卓so 在libart.so OpenMemory下断点

概述

如果想要在so加载时就下断点的话,需要以调试模式运行,并使用ddms进行jdb的连接。

准备

一部打开了调试开关(ro.debuggable=1)的手机或可调试的apk, IDA及android_server, 已启动的ddms(启动AndroidSDK\tools\monitor.bat

具体步骤

1. 开启端口转发并启动android_server

1
2
adb forward tcp:12345 tcp:12345
adb shell su -c "/data/as"

这里使用的是修改过的android_server,默认端口为12345

2. 以调试模式启动app

1
adb shell am start -D -n xyz.sysorem.cokey/.CokeyActivity

这时手机会显示Waiting For Debugger

3. 使用IDA附加及下断点

点击确定前先修改Debug options,把Event下前三个Suspend都勾选上,然后连接。
选定要调试的app进程后,在模块列表中找到libart.so,并在目标函数位置下断点
然后点击运行

4. 使用jdb附加,使程序继续运行

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

此处的8700即ddms中显示的对应端口
正常情况下就会在libc.so处暂停了

5. dump

在OpenMemory断下时,按shift+F2,运行dump脚本

1
2
3
4
5
6
7
static main(void){
auto fp, dex_addr, end_addr;
fp = fopen("D:\\dump.dex", "wb");
end_addr = r0 + r1;
for ( dex_addr = r0; dex_addr < end_addr; dex_addr ++ )
fputc(Byte(dex_addr), fp);
}

参考

安卓 smali启动就附加调试 的正确步骤