龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 1116|回复: 0

安卓IDA调试so与JNI_OnLoad

[复制链接]

13

主题

3

回帖

20

积分

编程入门

Rank: 1

龙马币
36

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

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

有两种方法,临时设置一次性有效:
  1. su
  2. magisk resetprop ro.debuggable 1
  3. stop;start
复制代码

启动IDA远程Serve
因为是双机调试,所以需要在安卓真机上启动IDA Serve程序。先从 ida/dbgsrv 目录中复制出android_server或者android_server64(根据手机架构选择),将它推送到手机上
  1. ./adb.exe devices                               # 列出已连接设备
  2. ./adb.exe push android_server /data/local/tmp   #上传调试器
复制代码

然后开一个adb shell以root身份启动调试器
  1. ./adb.exe shell                                 # 连接手机
  2. su
  3. cd /data/local/tmp
  4. ./android_server64                              #启动调试器
复制代码

再开一个终端,将端口转发到本机
  1. ./adb.exe forward tcp:23946 tcp:23946           # 端口转发
  2. 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. ./adb.exe shell                 # 连接手机
复制代码
然后如果ro.debuggable=1(开了全局调试权限),应用程序应该显示“等待调试器附加”,如果没开这个,应用程序应该直接跑起来了,可以IDA直接Attach上去断点调试了。

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

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

  1. adb forward tcp:8700 jdwp:<pid>     # 转发被调试进程的pid到8700端口
  2. 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函数下断即可调试

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表