在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(根据手机架构选择),将它推送到手机上
|
|
然后开一个adb shell以root身份启动调试器
|
|
再开一个终端,将端口转发到本机
|
|
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监听当前活动对象获得
|
|
然后开个adb的shell以调试方式启动
|
|
然后如果ro.debuggable=1(开了全局调试权限),应用程序应该显示“等待调试器附加”,如果没开这个,应用程序应该直接跑起来了,可以IDA直接Attach上去断点调试了。
调试JNI_OnLoad
JNI_Load的加载时机非常早,如果等待应用程序跑起来再attach上去是调试不到的,所以需要我们能在应用程序启动之初就断下来附加。这就需要我们前面开启全局调试权限(ro.debuggable=1),然后以 adb am -D 启动程序,此时程序会显示“等待调试器附加”,这个时候就是安卓应用程序启动的最初时机。
首先,先 IDA Debugger->AttachProcess 把调试器挂上去,这个时候模块应该都是没有被加载到进程的,所以也下不了断点。并且应用程序还在“等待调试器附加”这个状态。我们需要先通知应用程序继续运行。这里要转发端口并用安卓的调试协议通知程序继续运行
|
|
然后IDA F9,程序就会继续运行了。若是我们在 IDA->Debugger->Debugger Options 中勾选了第五个Event(Suspend on library load/unload),程序会在so模块加载时断下,可以F9直到我们需要的so被加载,然后在右边的Module List中选中其JNI_OnLoad函数下断即可调试