使用IDA对Android so进行动调

使用IDA对Android so进行动调

最近学了下Frida框架,跟着Frida-Labs这个项目来学效果还不错。我也是借着这个项目学一下在IDA里动调so。本篇博客主要也是记录下动调的过程与一些坑

环境准备

需要一台拥有Root权限的手机/模拟器,这里可以使用实体机解bl锁后获取Root权限,但为了防止逆向过程中把手机搞崩还是建议使用非主力机或模拟器。我这里使用Android Studio里自带的AVD,搭配rootAVD刷入Magisk框架,过程参考了https://www.bilibili.com/read/cv25705003

然后这里用的是Frida 0x8这道题,使用adb安装,然后push IDA的sevrer到/data/local/tmp,使用su权限运行即可。

开始调试

运行后转发IDA server端口到本机

1
adb forward tcp:23946 tcp:23946

将APK文件解包,将运行的对应架构so文件拖入对应版本IDA,这里我用是是x86_64架构。然后在对应函数下断点,我这里是cmpstr

image-20240712232247988

配置Remote Linux debugger的Hostname和Port

image-20240712232346619

调试模式启动应用

1
adb shell am start -D -n com.ad2001.frida0x8/.MainActivity

因为这个应用的属性android:debuggable="true",因此可以直接调试。否则可能需要改包或者

1
2
3
4
adb shell
su
magisk resetprop ro.debuggable 1
stop;start;

然后找到PID,我这里使用frida-ps -U,其他方法同理。然后使用顺手的端口号转发

1
adb forward tcp:[port] jdwp:[pid]

IDA-Debugger-Attach to process...,里面找到进程,可以Ctrl+F查找,这里也能看到pidimage-20240712233456572

然后使用jdb连接就行了

1
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=[port]

推荐在IDA的Debugger setup里把Suspend on process entry pointSuspend on thread start/exitSuspend on library load/unload勾上。然后就能正常调试了。

我们可以看到Output窗口看到引入的so文件和进程的开始结束。在汇编区Ctrl+S可以看到引入的so文件和位置。

如果我们现在直接运行的话,是找不到引入的libfrida0x8.so文件的,断点也无法生效,搜索得知是android:extractNativeLibs="false"这个属性导致的问题。这个属性会导致应用安装时不释放lib文件到安装文件夹,运行时只会从base.apk中读取,定位不到对应的so文件。解决办法有二:一是解包修改属性后重打包;二是导出对应架构的so文件,找到对应的安装文件夹

1
adb shell pm path com.ad2001.frida0x8

然后将lib文件复制进去/data/app/~~m3jiydVaec6iWb_wo2-VIg==/com.ad2001.frida0x8-n-XnSCp7x4hizYDHlvdh0w==/lib/x86_64

这时应用运行时优先使用lib中的so文件

image-20240712235323035

继续调试

这时就能在断点处正常断下了image-20240712235529299

平时怎么动调现在怎么动调就行,对应的变量的值也能够正常读取显示

image-20240712235713830

至此通过IDA完成对Android so文件的动调

本文作者:lrhtony
本文链接:https://lrhtony.cn/2024/07/08/IDA-in-Android/
版权声明:本文采用 CC BY-NC-SA 4.0 协议进行许可