IDA动态调试SO文件
前言
此篇博文仅仅记录下本人学习
IDA pro动态调试so文件过程。工具:
IDA pro 7.5参考博文及APK来源:
- https://blog.youkuaiyun.com/hbhgyu/article/details/81321923
- https://blog.youkuaiyun.com/tabactivity/article/details/78492377
一、启动android server,以调试方式启动APK
-
进入
[安装路径]\dbgsrv\dbgsrv目录,将对应android版本的android server和android server64发到手机/data/local/tmp/目录,并设置可执行权限,运行。(建议android server和android server64都发送,避免某些apk只有32位或64位so包。)# 同理,将android server64同样设置 adb push [安装路径]\dbgsrv\android_server /data/local/tmp/ adb shell su chmod 777 /data/local/tmp/android_server ./data/local/tmp/android_server # 启动 -
手机端设置端口转发
adb forward tcp:23946 tcp:23946 -
调试方式启动APK,启动后,手机端出现
Waiting For Debugger弹窗。adb shell am start -D -n [aok包名]/[主活动] -
启动 DDMS(进入Sdk安装目录
\Sdk\tools下,运行monitor.bat脚本启动),在DDMS上选择相应进程后,使用指令使apk继续运行,成功后,DDMS上进程将显示绿色,否则是红色。jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700 # localhost可以填127.0.0.1
二、调试步骤
-
首先,IDA 加载so文件(此时,可以先查看需要设置断点的函数,位置,然后设置断点。)

-
选择调试器,点击:
Debugger=>Select debugger(或直接按快捷键F9),选择Remote ARM Linux/Android debugger,点击OK。(若弹出PLEASE READ CARFULLY窗口,点击YES)
-
点击:
Debugger=>Debugger options,根据需要,设置如下三个选项,会在相应位置暂停,按F9可继续调试- 第一个:在APK程序入口处停止。
- 第二个:有线程启动运行或者退出时,暂停。
- 第三个:当动态库(apk中的so文件)加载或者取消加载时,暂停。

-
点击:
Debugger=>Process options,此处设置远程主机(android手机)和调试端口号(IDA 默认为23946),点击OK。
-
点击:
Debugger=>Process options,选择当前待调试的apk进程,点击OK。(可按CTRL+F或者ALT+T搜索包名查找)
-
在IDA中,按
F9开始调试,如果在调试前设置过断点和Debugger options,调试会在相应断点位置或满足选项时停止。
三、调试技巧
-
可以在启动调试前,使用静态分析设置相应断点。
-
ARM中没有NOP指令,可通过以下指令替代
MOVS R0,R0 # 十六进制为:00 00 A0 E1 -
当调试函数遇到
无法设置断点弹窗,或者到一个DCB定义数据处无法F9继续时调试和返回时,可按G键跳转到LR寄存器地址处,再按F4,函数运行到当前指针位置。 -
使用
F5快捷键将ARM指令转化为可读的C代码,同时可以使用Y键,对JNIEnv指针做一个类型转换,从而对JNI里经常使用的JNIEnv方法能够识别;同时,可以通过选项Copy to assembly,将C代码注释到ARM指令中,增加Patch so的便利性,甚至可以直接看到答案显示。

5. 32位ARM下,函数参数保存在 R0~R3寄存器中(多余的参数入栈),可以将Hex View和 寄存器同步,查看函数参数数据。
本文档详细介绍了如何使用IDA Pro 7.5进行动态调试Android的SO文件。首先,通过ADB推送android_server到手机并设置权限,然后配置端口转发并以调试模式启动APK。在DDMS中连接进程后,设置调试选项,如在库加载时暂停。调试过程中,可以预先设置断点,利用ARM指令如MOV SR0, R0作为NOP替代,并使用F5查看C代码。此外,调试技巧包括处理无法设置断点的情况以及查看函数参数。
1929

被折叠的 条评论
为什么被折叠?



