This page looks best with JavaScript enabled

【安卓】IDA调试so与JNI_OnLoad

 ·  ☕ 3 min read · 👀... views

在CTF中经常有Android题需要调试so,或者需要调试so的初始化函数JNI_OnLoad和init_array,正好这次腾讯游戏安全大赛的安卓题也有这个需要,就整理了一下。

开启全局调试权限

如果需要调试JNI_OnLoad等函数,需要设置Android的全局调试权限ro.debuggable为1

有两种方法,临时设置一次性有效:

su
magisk resetprop ro.debuggable 1
stop;start

启动IDA远程Serve

因为是双机调试,所以需要在安卓真机上启动IDA Serve程序。先从 ida/dbgsrv 目录中复制出android_server或者android_server64(根据手机架构选择),将它推送到手机上

1
2
./adb.exe devices                               # 列出已连接设备
./adb.exe push android_server /data/local/tmp   #上传调试器

然后开一个adb shell以root身份启动调试器

1
2
3
4
./adb.exe shell                                 # 连接手机
su
cd /data/local/tmp
./android_server64                              #启动调试器

再开一个终端,将端口转发到本机

1
./adb.exe forward tcp:23946 tcp:23946           # 端口转发

IDA Open .so

然后需要用IDA打开so文件。可以将apk以zip的方式解包,然后打开想要调试的so

配置IDA->Debugger为 Remote Android Debug

配置IDA Debugger Options,按需勾选第3、4、5个Event选项

配置IDA Debugger Process,将IP设置为127.0.0.1

调试模式启动目标

接下来需要使用adb的activity manager以调试的模式启动目标程序,这样我们才能够attach上去调试。在这之前我们需要知道包名,可以用adb监听当前活动对象获得

1
./adb shell am monitor  # 查看当前活动对象包名(quit结束监控)

然后开个adb的shell以调试方式启动

1
2
./adb.exe shell                 # 连接手机
am start -D -n <包名>/.入口     # am命令启动app(如:am start -D -n com.example.re3/.MainActivity)

然后如果ro.debuggable=1(开了全局调试权限),应用程序应该显示“等待调试器附加”,如果没开这个,应用程序应该直接跑起来了,可以IDA直接Attach上去断点调试了。

调试JNI_OnLoad

JNI_Load的加载时机非常早,如果等待应用程序跑起来再attach上去是调试不到的,所以需要我们能在应用程序启动之初就断下来附加。这就需要我们前面开启全局调试权限(ro.debuggable=1),然后以 adb am -D 启动程序,此时程序会显示“等待调试器附加”,这个时候就是安卓应用程序启动的最初时机。

首先,先 IDA Debugger->AttachProcess 把调试器挂上去,这个时候模块应该都是没有被加载到进程的,所以也下不了断点。并且应用程序还在“等待调试器附加”这个状态。我们需要先通知应用程序继续运行。这里要转发端口并用安卓的调试协议通知程序继续运行

1
2
adb forward tcp:8700 jdwp:<pid>     # 转发被调试进程的pid到8700端口
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

然后IDA F9,程序就会继续运行了。若是我们在 IDA->Debugger->Debugger Options 中勾选了第五个Event(Suspend on library load/unload),程序会在so模块加载时断下,可以F9直到我们需要的so被加载,然后在右边的Module List中选中其JNI_OnLoad函数下断即可调试

Share on

Qfrost
WRITTEN BY
Qfrost
CTFer, Anti-Cheater, LLVM Committer