IDA利用Pixel3动调.so文件

USB连接手机

用数据线连接Pixel 3和主机,然后在Pixel 3中选择信任主机

然后用adb连接

1
adb usb

然后输入

1
adb devices

可以查看是否已连接

image-20221211154250928

然后通过adb将apk安装到手机上

1
2
3
adb install <APK文件>
# 卸载
# adb uninstall <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
2
su
chmod 777 android_server

运行android_server

1
./android_server

image-20221211155901595

端口转发

由于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

此时手机会变成这样

image-20221211160726234

利用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

https://dl.google.com/android/repository/sdk-tools-windows-3859397.zip?utm_source=androiddevtools&utm_medium=website

下载JDK1.8

https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html#license-lightbox

而后将下载解压好的SDK Tools文件夹和platform-tools文件夹放入android 3.1 SDK的文件夹

image-20221216135120408

然后运行tools/monitor.bat即可打开Android Device Monitor

image-20221216135222696

记录下端口为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文件后暂停

image-20221211161644148

打开IDA的Debugger->Attach->Remote ARM Linux/Android debugger

image-20221211160611200

成功连接

image-20221211160625770

如果adb shell中提示

image-20221211161138328

且IDA中显示

image-20221211161304454

就说明用错android_server了,android_server为32位的,android_server64为64位的,并且要使用对应位数的IDA

然后附加到想要的进程上,可以用search来搜索

image-20221216144016190

然后点击绿色箭头或按F9来运行

image-20221216144033775

然后使用jdk1.8的jdb运行以下命令

1
.\jdb.exe -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8600

image-20221216144119913

成功运行后Android Device Monitor的虫子会变绿色

这里的8600端口号就是之前Android Device Monitor看到的程序端口号

image-20221216144157743

如果jdb连接出现类似于下面这种错误错误

image-20221216184027352

可以使用以下步骤解决

  1. adb shell
  2. su
  3. export IDA_LIBC_PATH=/apex/com.android.runtime/lib64/bionic/libc.so
  4. 再开始进行正常调试的步骤

参考https://bbs.pediy.com/thread-268276.htm

然后转到IDA

可以看到已经加载了第一个so

image-20221216184424139

然后继续按F9运行,它停下重新按F9运行一直到运行到加载我们需要动调的so文件

image-20221216184610654

然后在modules页面里就可以看到我们需要的so,双击so文件然后找到JNI_OnLoad

image-20221216184702546

image-20221216184759386

在方法的第一句下断点,然后关闭Debugger->Debugger options种之前勾选的三个选项

image-20221216185143884

image-20221216185209646

然后按F9运行,就可以看到程序运行到了我们的断点处

image-20221216185308838

之后我们就可以正常分析JNI_OnLoad找到动态注册表,具体分析可以参考https://www.jianshu.com/p/c423e5fefd5e

image-20221216185458961

不知道为什么笔者以这种方式调试手机上是空白的一片

所以我在找到对应函数后采用了以下步骤动调函数内部

  1. 在手机上直接安装运行所要调试的apk
  2. 按之前的方法使用adb连接手机并运行相应的android_server并进行adb端口转发
  3. 然后打开IDA后选择Remote Android调试器并attach进程
  4. 然后在之前找到的函数内部下断点,然后在手机输入内容按下按钮进行调试

Reference