本文是记录自己学习IDA的一些总结与归纳,并将其体现成具体功能,便于复习与交流,有不对之处望大家包容并指出,欢迎大家留言收藏
环境
- 小米5 - root - android7.0
- IDA pro 7.0
- so包是32位
- android运行demo并进入主界面这时候不会加载so包,点按钮运行加载so包并执行native函数
- 如果出现其他问题可以参考IDA常见问题
- 附加GitHub地址下载apk
配置
- 复制IDA 安装目录下dbgsrv 文件里面的android_server文件到 手机内存储的 /data/local/tmp 目录下
- 控制台输入
adb shell su
命令获取管理员权限 - 控制台输入
setenforce 0
命令 关闭保护(每次关机后开机都要重新设置) - 控制台输入:
cd /data/local/tmp
进入android_server目录 ,输入:chmod 777 android_server
命令获取执行权限
开始
- 控制台输入
adb shell su
命令获取管理员权限 - 输入:
./data/local/tmp/android_server
启动android_server - 新开一个命令窗口 不用获取管理员权限
- 直接输入
adb forward tcp:23946 tcp:23946
命令 端口转发 - adb shell am start -D -n 包名/activity路径 启动应用,例如:
adb shell am start -D -n com.example.androidida/com.example.androidida.MainActivity
- 打开IDA -> 选择so文件 -> 弹框全部确定
- 点击IDA的菜单栏的Debugger菜单中的Select debugger项,按照如下弹框选择
- 点击IDA的菜单栏的Debugger菜单中的Debugger options项,按照如下弹框选择
- 点击IDA的菜单栏的Debugger菜单中的Process options项,按照如下弹框选择,路径按照自己的填
- 点击IDA的菜单栏的Debugger菜单中的Attach to process项,按照如下弹框选择自己的包名
- 点击IDA 的开始运行按钮(F9)。如果有反调试的话,一定要先下断点,不然一运行就崩溃了,这里运行自己的就没事
- 打开Android Device Minitor , 查看端口,这里是8612
- 控制台输入:
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8612
注意:我这里是8612,自己的是多少就填多少, 输完这时候Android Device Minitor的小瓢虫会变成绿色,并且IDA程序会开始运行 - IDA一直按运行按钮(F9)直到加载完没法按运行按钮之后 , 点击MainActiivty的按钮,这时候加载so包准备调用c方法,并且会自动断住 , 这里要慢点按运行按钮 , 每次运行查看so包是否加载了 (control + s键可以查看已经加载的so包)
- 注意:(如果有弹框,有ok按ok , 有yes按yes , 有same 按 same)
- 加载so包之后, 在general registers查看so包的函数(ctrl +F可以搜索) , 双击so包
- 搜索自己定义的函数名称,双击函数名
- 双击函数名后,在Debug View试图会定位到函数位置,按F2 可以给选中行下断点,如下:
- 按F9继续运行,一直到指示线条变色,这时候说明已经运行到断点的位置了(提示: F8运行下一个断点)
总结
本次调试是结合静态与动态调试,优点:只要加载出so包,就能查找到指定函数