使用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 |
|
将APK文件解包,将运行的对应架构so文件拖入对应版本IDA,这里我用是是x86_64
架构。然后在对应函数下断点,我这里是cmpstr
配置Remote Linux debugger的Hostname和Port
调试模式启动应用
1 |
|
因为这个应用的属性android:debuggable="true"
,因此可以直接调试。否则可能需要改包或者
1 |
|
然后找到PID,我这里使用frida-ps -U
,其他方法同理。然后使用顺手的端口号转发
1 |
|
IDA-Debugger-Attach to process...,里面找到进程,可以Ctrl+F查找,这里也能看到pid
然后使用jdb
连接就行了
1 |
|
推荐在IDA的Debugger setup里把Suspend on process entry point
、Suspend on thread start/exit
、Suspend on library load/unload
勾上。然后就能正常调试了。
我们可以看到Output
窗口看到引入的so文件和进程的开始结束。在汇编区Ctrl+S可以看到引入的so文件和位置。
坑
如果我们现在直接运行的话,是找不到引入的libfrida0x8.so
文件的,断点也无法生效,搜索得知是android:extractNativeLibs="false"
这个属性导致的问题。这个属性会导致应用安装时不释放lib文件到安装文件夹,运行时只会从base.apk
中读取,定位不到对应的so文件。解决办法有二:一是解包修改属性后重打包;二是导出对应架构的so文件,找到对应的安装文件夹
1 |
|
然后将lib文件复制进去/data/app/~~m3jiydVaec6iWb_wo2-VIg==/com.ad2001.frida0x8-n-XnSCp7x4hizYDHlvdh0w==/lib/x86_64
这时应用运行时优先使用lib中的so文件
继续调试
这时就能在断点处正常断下了
平时怎么动调现在怎么动调就行,对应的变量的值也能够正常读取显示
至此通过IDA完成对Android so文件的动调