安卓逆向(三)-native层动态调试

apk动态调试

Posted by hmoytx on January 1, 2023

安卓逆向(三)-native层动态调试

前言

跳过一些内容,关于arm汇编,ida静态分析资料很多,不重新写,主要记下之前so动态调试的学习过程。

环境

ida这个不用介绍。
模拟器或者真机(需要ROOT过)。

准备工作

需要先将IDA中的dbgsrv文件夹下的android_server文件(根据手机的架构选择)拖到手机上。
1
给予执行权限并且以root权限执行,然后将端口映射到电脑。
2
然后就把对应的apk安装上即可。

开始调试

这里以一个简单的app demo为例,其中so中静态注册的函数如图:
3
要进行app中的so调试,同样需要以调试模式启动app。
需要改apk中的manifest设置为可调试,或者修改安卓的ro.debuggable为1。
修改安卓的ro.debuggable为1,可以通过面具也可以用自己编译的mprop。 执行命令:

adb shell am start -D -n  "com.xxx.xxxx/.MainActivity”   

此时手机或者模拟器会出现如下界面,然后才可以进行后续步骤调试:
4

ida动态调试

打开ida,对应位数别错,我这里是64位。
选择debuger,这里我是真机所以选ARM,如果是模拟器,要选linux。
5
选择后填写对应的地址及调试选项,这里要注意,上面第一步的时候一定要用adb forward把端口映射到本地。
6
然后找到对应的要调试的app,选择加载即可。
7
会断下来,让他运行起来:
8
然后可以用DDMS查看调试端口,jdb命令:

jdb -connect com.sun.jdi.SocketAttach:127.0.0.1,port=端口 

或者直接命令让app继续跑起来:

adb forward tcp:端口 jdwp:调试进程id

9
然后就等so载入,可以通过ctrl+s搜索对应要调试so,然后根据静态分析的函数相对地址去加上动态调试的so的基址,来定位函数。
此时已经可以愉快的下断了:
10
然后放行,开始输入,点击按钮后触发断点,断下来,此时就可以继续愉快地单步调试了。
11

总结

记下之前动态调试的学习过程,真机还是模拟器都可以,看自己选择。