IDA动态调试so 指南

时间:2024-04-02 07:37:40

首先我们如果想要在调试的so的初始化JNI_OnLoad的函数里面下断点,去测试是否有反调试等操作,首先应该以启动调试模式去操作。

第一步:首先以debug模式去启动调试的app程序。

IDA动态调试so 指南

命令为: adb shell am start -D -n 包名/.activity名字

以debug模式启动后,打开ddms工具,查看下是否有小红蜘蛛出现了,如果出现了则说明关联上了。IDA动态调试so 指南

第二步:启动android_server 脚本,把android_server 拷贝到data/local/tmp文件夹下,设置上权限,并且以root用户权限去运行。

IDA动态调试so 指南

第三步:这时候我们手机端的端口已经开启了监听了,接下来再把端口数据转发到ida上面去。

IDA动态调试so 指南

我上面手机端监听的23946端口(默认端口),转发的就是23946的默认端口。

第四步:转发成功后,启动ida工具,32位的,选择remote ARMLinux/Android debugger 调试模式

IDA动态调试so 指南

第五步:设置本机ip和端口号信息

IDA动态调试so 指南

第六步:设置debug options,点击上方的debug options ,将下方的 事件监听全部勾选上,接下来点击ok。

IDA动态调试so 指南

第七步: 接下来就能看到此设备上面所有的进程了,选择我们要调试的进程信息,选中,并点击ok。

IDA动态调试so 指南

第八步:点击ok后,其实就已经进入系统断点中了,我们从下图可以看到系统断在了libc.so 中,这个是加载的系统关键类的so文件,我们再次设置下 debug options ,再次勾选上面三个event事件的选项,并点击确定。

 

IDA动态调试so 指南

IDA动态调试so 指南IDA动态调试so 指南

第九步:此时我们需要让他继续执行,因为在modules list 加载列表中,我并没有看到我自己的so被加载进去。我们按下f9,继续执行。

 

第十步:由于我在c层跳过了并让他继续执行,但是java层还是处于一个调试的状态,此时应该输入如下命令

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

让java层也继续执行下去。 此时去查看下ddms里面调试的进程的端口信息。

IDA动态调试so 指南

如上面我这个进程的端口信息是8600或者8700都可以,执行后效果如下图一样。就表示启动了jdb调试。

IDA动态调试so 指南

此时我们看下ddms的蜘蛛的状态变为了绿色,已经是可调试的状态了。

IDA动态调试so 指南

第十一步:接下来我们看到app的界面从wait for debug状态变为了黑屏,我们继续回到ida中去查看,发现已经自动断在linker.so上面了,这个是链接加载器,初始化so用的,此时我们打开modules list窗口,查找我们需要调试的so。

IDA动态调试so 指南

IDA动态调试so 指南

IDA动态调试so 指南

第十二步:双击找到我们需要调试的so,如下图我已经找到了JNI_OnLoad方法了。双击进去,然后就跳到该方法处了。

IDA动态调试so 指南

第十三步:如下图所示,我已经下好了断点了,接下来就f9继续执行吧。让他进入断点处。

IDA动态调试so 指南

以上就是ida以启动模式去下断点,适合在较早的时机去下断点,方便进行脱壳和反调试。