安卓调试新手教程
IDA Server调试
1、拷贝IDA dbgsrv目录下的ida调试Server到/data/local/tmp目录下,四个文件代表四种架构吧
android_server64对应arm64-v8a
android_server对应armeabi-v7a
android_x86_server对应x86
android_x64_server对应x86_64
调试的时候有可能会看不到线程名,可以考虑以下启动命令,调试arm64
1 | |
如果是32位就用export IDA_LIBC_PATH=/apex/com.android.runtime/lib/bionic/libc.so
至于为什么要export IDA_LIBC_PATH,我才懒得研究,这是IDA的问题呢。
尽量在真机上面调试,而不是模拟器,这是因为模拟器往往是x86架构,使用的是二进制翻译来强行运行其它架构的指令的,代码并没有真正在运行。
2、真机如果有root权限,直接以su权限启动调试服务即可调试所有App
真机没有root权限,则需要将dbgsrv拷贝到应用的/data/data/包名目录下面,这样调试服务才有访问App进程的权限,同时App包对应的AndroidManifest中application节点必须要有android:debuggable=”true”,没有的话可以考虑对App进行重打包。
3、开启端口转发
使用adb forward tcp:23946 tcp:23946命令将手机上监听的端口转发到电脑上来,这样IDA就能访问23946端口连接到手机上的调试服务了。
然后以调试模式启动进程adb shell am start -D -n com.example.application/.MainActivity,通过ddms能看到调试的端口号
然后再jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700连接上端口就行了
或者使用简单的脚本
1 | |
注意,由于脚本使用了set-debug-app命令,结束调试后务必记得使用命令清理当前正在调试的App,否则可能会出现其它调试器无法下断点等现象。。。
1 | |
4、调试so
如果想要调试某个很早加载的so之类的,那么就需要更高的权限
1 | |
如果是安卓14以上的版本,那么ro.debuggable属性已经没用了,改用下面的命令
1 | |
安卓模拟器调试
一般来说,模拟器上面在跑的真实指令都是x86_64,对应ida调试器是android_x64_server
模拟器上的Magisk可以使用https://huskydg.github.io/magisk-files/,安装的时候需要注意的是,需要在模拟器设置上面勾选系统盘可写。
ida调试的时候选择Debugger -> Attach -> Remote Linux Debugger