安卓调试新手教程

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
2
export IDA_LIBC_PATH=/apex/com.android.runtime/lib64/bionic/libc.so
./android_server64 &

如果是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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import os
import time

jdb_debug_port = 8700

package_name = 'com.example.application'
activity_name = '.MainActivity'

res = os.popen(f'adb shell pidof {package_name}').read()
if res != '':
os.system(f'adb shell kill -9 {res}')
time.sleep(0.5)

os.system(f'adb shell am set-debug-app -w --persistent {package_name}')
os.system(f'adb shell am start -D -n {package_name}/{activity_name}')

while True:
res = os.popen(f'adb shell pidof {package_name}').read()
if res == '':
print('process not found')
time.sleep(1)
else:
break

pid = int(res)
print(f'pid:{res}')

os.system("pause")

os.system(f'adb forward tcp:{jdb_debug_port} jdwp:{pid}')
os.system(f'jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port={jdb_debug_port}')
#os.system("pause")

注意,由于脚本使用了set-debug-app命令,结束调试后务必记得使用命令清理当前正在调试的App,否则可能会出现其它调试器无法下断点等现象。。。

1
adb shell am clear-debug-app

4、调试so

如果想要调试某个很早加载的so之类的,那么就需要更高的权限

1
2
3
4
adb shell
su
magisk resetprop ro.debuggable 1
stop;start;

如果是安卓14以上的版本,那么ro.debuggable属性已经没用了,改用下面的命令

1
2
3
4
5
adb shell
su
magisk resetprop ro.build.type userdebug
magisk resetprop persist.debug.dalvik.vm.jdwp.enabled 1
stop;start

安卓模拟器调试

一般来说,模拟器上面在跑的真实指令都是x86_64,对应ida调试器是android_x64_server

模拟器上的Magisk可以使用https://huskydg.github.io/magisk-files/,安装的时候需要注意的是,需要在模拟器设置上面勾选系统盘可写。

ida调试的时候选择Debugger -> Attach -> Remote Linux Debugger


安卓调试新手教程
https://fjqisba.github.io/2024/08/06/新手教程/安卓调试新手教程/
作者
fjqisba
发布于
2024年8月7日
许可协议
MIT