IDA利用Pixel3动调.so文件
USB连接手机
用数据线连接Pixel 3和主机,然后在Pixel 3中选择信任主机
然后用adb连接
1 | adb usb |
然后输入
1 | adb devices |
可以查看是否已连接
然后通过adb将apk安装到手机上
1 | adb install <APK文件> |
IDA连接手机
将android_server存入手机(该文件位于<IDA目录>/dbgsrv/
)
1 | adb push .\android_server64 /data/local/tmp |
可以在shell中执行
1 getprop ro.product.cpu.abi来查询手机CPU架构
打开手机shell
1 | adb shell |
进入存放android_server的文件夹给
1 | cd /data/local/tmp |
获得root权限后给android_server执行权限
1 | su |
运行android_server
1 | ./android_server |
端口转发
由于android_server在Android真机设备的23946端口上运行,而IDA Pro在PC端,要想用IDA动态调试,需要将Android系统上的23946端口转发到PC端的23946端口,再打开一个CMD运行以下命令
1 | adb forward tcp:23946 tcp:23946 |
运行要调试的apk
1 | adb shell am start -D -n com.ctf.CheckYourKey/.MainActivity |
此时手机会变成这样

利用Android Device Monitor查看apk的jdb调试端口
Android Studio自带以下的文件,可以自行搜索运行,这里展示的是未安装Android Studio运行Android Device Monitor的方式
下载android 3.1 SDK
https://pan.baidu.com/s/1pJ0naTP?utm_source=androiddevtools&utm_medium=website
下载platform-tools-r22
https://pan.baidu.com/s/1sj4ZfTb?utm_source=androiddevtools&utm_medium=website
下载SDK Tools
下载JDK1.8
https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html#license-lightbox
而后将下载解压好的SDK Tools
文件夹和platform-tools文件夹放入android 3.1 SDK
的文件夹
然后运行tools/monitor.bat
即可打开Android Device Monitor
记录下端口为8600,不要关闭Android Device Monitor
IDA附加程序调试
使用IDA打开要调试的so文件
选择Remote Android调试器
选择IDA工具栏的Debugger->Debugger options,勾选Suspend on process entry point、Suspend on thread start/exit、Suspend on library load/unload这三个选项,使其在加载完so文件后暂停
打开IDA的Debugger->Attach->Remote ARM Linux/Android debugger
成功连接
如果adb shell中提示
且IDA中显示
就说明用错android_server了,android_server为32位的,android_server64为64位的,并且要使用对应位数的IDA
然后附加到想要的进程上,可以用search来搜索
然后点击绿色箭头或按F9来运行
然后使用jdk1.8的jdb运行以下命令
1 | .\jdb.exe -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8600 |
成功运行后Android Device Monitor的虫子会变绿色
这里的8600端口号就是之前Android Device Monitor看到的程序端口号
如果jdb连接出现类似于下面这种错误错误
可以使用以下步骤解决
- adb shell
- su
- export IDA_LIBC_PATH=/apex/com.android.runtime/lib64/bionic/libc.so
- 再开始进行正常调试的步骤
然后转到IDA
可以看到已经加载了第一个so
然后继续按F9运行,它停下重新按F9运行一直到运行到加载我们需要动调的so文件
然后在modules页面里就可以看到我们需要的so,双击so文件然后找到JNI_OnLoad
在方法的第一句下断点,然后关闭Debugger->Debugger options种之前勾选的三个选项
然后按F9运行,就可以看到程序运行到了我们的断点处
之后我们就可以正常分析JNI_OnLoad
找到动态注册表,具体分析可以参考https://www.jianshu.com/p/c423e5fefd5e
不知道为什么笔者以这种方式调试手机上是空白的一片
所以我在找到对应函数后采用了以下步骤动调函数内部
- 在手机上直接安装运行所要调试的apk
- 按之前的方法使用adb连接手机并运行相应的android_server并进行adb端口转发
- 然后打开IDA后选择Remote Android调试器并attach进程
- 然后在之前找到的函数内部下断点,然后在手机输入内容按下按钮进行调试