前言
跳过一些内容,关于arm汇编,ida静态分析资料很多,不重新写,主要记下之前so动态调试的学习过程。
环境
ida这个不用介绍。
模拟器或者真机(需要ROOT过)。
准备工作
需要先将IDA中的dbgsrv文件夹下的android_server文件(根据手机的架构选择)拖到手机上。
给予执行权限并且以root权限执行,然后将端口映射到电脑。
然后就把对应的apk安装上即可。
开始调试
这里以一个简单的app demo为例,其中so中静态注册的函数如图:
要进行app中的so调试,同样需要以调试模式启动app。
需要改apk中的manifest设置为可调试,或者修改安卓的ro.debuggable为1。
修改安卓的ro.debuggable为1,可以通过面具也可以用自己编译的mprop。
执行命令:
adb shell am start -D -n "com.xxx.xxxx/.MainActivity”
此时手机或者模拟器会出现如下界面,然后才可以进行后续步骤调试:
ida动态调试
打开ida,对应位数别错,我这里是64位。
选择debuger,这里我是真机所以选ARM,如果是模拟器,要选linux。
选择后填写对应的地址及调试选项,这里要注意,上面第一步的时候一定要用adb forward把端口映射到本地。
然后找到对应的要调试的app,选择加载即可。
会断下来,让他运行起来:
然后可以用DDMS查看调试端口,jdb命令:
jdb -connect com.sun.jdi.SocketAttach:127.0.0.1,port=端口
或者直接命令让app继续跑起来:
adb forward tcp:端口 jdwp:调试进程id
然后就等so载入,可以通过ctrl+s搜索对应要调试so,然后根据静态分析的函数相对地址去加上动态调试的so的基址,来定位函数。
此时已经可以愉快的下断了:
然后放行,开始输入,点击按钮后触发断点,断下来,此时就可以继续愉快地单步调试了。
总结
记下之前动态调试的学习过程,真机还是模拟器都可以,看自己选择。