IDA动态调试so库这篇文章中讲了基本的动态调试方法,但是这种方法有一个缺点,就是只能在进程运行起来之后才能attach上,也就是说这时进程已经将so库加载进内存并且已经执行完JNI_OnLoad,所以只需要在JNI_OnLoad函数中完成一些反调试措施,就无法使用上篇文章所介绍的方法来动态调试。这篇文章就介绍动态调试的另一种方法:直接在JNI_OnLoad函数上下断点。

另外,上篇文章是在模拟器下进行调试,这篇文章直接在真机上完成动态调试。

1.工具准备

IDA6.6,adb,jdb,固件工具箱,android_server,ddms。

首先打开ddms。

2.运行android_server

在IDA的dbgsrv目录下找到android_server,并且拷贝至手机的/data/目录下,然后修改android_server的权限为777,然后以su的身份运行android_server。

3.设置端口转发

打开另一个窗口设置端口转发:

 4.adb am启动主activity

首先打开固件工具箱–>程序管理器–>选中要调试的apk–>高级–>高级冻结–>这里可以查看apk中所有类的完整路径(也可以直接从AndroidManifest.xml中找),找到主activity完整路径。在终端中运行:

比如:

这时手机会进入waiting for debugger状态。

5.IDA附加

点击菜单 Debugger->Attach->Remote ArmLinux/Android debugger ,打开调试程序对话框,在hostname一栏输入localhost。选中要被调试的apk,这时会停在libc.so:

ida0

设置调试选项:点击菜单Debugger->Debugger Opitions 在弹出的Debugger setup窗口的Events中选择 suspend on thread start/exit 以及 suspend on library load/unload,然后OK退出。通过此操作可以使得程序在创建新线程和加载so时自动中断。

ida2

6.jdb连接调试器

在ddms中查看相应的进程端口号(一般情况下为8700),然后执行如下命令:

然后在IDA中点击F9继续运行,然后手机上的waiting for debugger提示消失。

7.在JNI_OnLoad上下断点

IDA中Ctrl+s查找要调试的so,一般情况下会有多个同名so,选择具有rx权限的so(代码段),其他的可能为数据段之类的,比如:

ida3

用另一个IDA打开这个so库,找到JNI_OnLoad起始地址,加上so库的偏移地址即为JNI_OnLoad函数在运行时的真实地址。快捷键g,转至该地址,即可在JNI_OnLoad函数内下断点:

ida4

接下来F9继续运行,就可以动态调试了。

 

 

 

 

观看更多有关 的文章?

*

+
跳转到评论