[mobile]真机+IDA调试apk中的so
很多mobile题目需要逆向分析apk中的so(尤其我们公司的比赛),所以这里简单总结一下调试apk中的so的方法。
材料:adb调试工具、root的真机一台(模拟器无法调试so)、IDA
下载&安装adb
adb是Android platform tools中的工具,可以去Androiddevtools下载:https://www.androiddevtools.cn/
下载完解压出来:
里面的这个就是adb,使用方法可以直接在这个目录用命令号启动:
也可以把它改名成adb.exe,之后和AdbWinApi.dll一起放在C:\Windows\system32目录下:
然后就可以命令行直接启动adb了:
准备调试
首先将apk安装到手机上,然后手机usb连接电脑,插线的时候提示是否允许usb调试,选择允许:
接下来在adb查看是否有设备连接: adb devices
可以看到设备已经连接,然后我们要用IDA调试so文件,所以需要把IDA的远程调试server文件拷贝到手机中,使用adb 的push命令:
adb push .\android_server /data/local/tmp
接下来需要把手机的23946端口用adb forward命令转发到本机的23946端口:
adb forward tcp:23946 tcp:23946
开始调试
使用adb shell
命令可以开启 一个手机的shell:
然后su到root,如果不su到root的话会发现一会IDA挂上去之后看不到可以挂的进程,这也是为什么要用root手机的原因:
然后在手机上运行我们需要调试的程序:
接下来在adb shell中cd 到刚刚传了android_server的目录/data/local/tmp 然后执行 android_server:
之后启动IDA,选择Debugger->attach->Remote ARM Linux/Android debugger:
debug options根据自己选择设置一下,然后选择自己要挂的进程:
在右侧寄存器窗口下面可以看到modules窗口,里面找到自己要调试的so:
双击之后可以查看so中的函数,选择自己要调试的函数下断点:
然后我这里要在手机中输入一些东西才能走到这:
成功断住:
然后可以调试了。
用到的命令:
adb devices //查看链接设备
adb push .\android_server /data/local/tmp //往手机拷贝东西
adb forward tcp:23946 tcp:23946 //端口转发
adb shell //链接手机shell
补充:以调试模式启动
上面介绍的方法是先在手机中运行要调试的程序,然后用IDA挂在上去,但有时候可能会有一点点问题(比如一些检测是否被挂载的等等),这里我的推荐还是找到程序中所有的反调试,然后patch掉,之后对apk进行重打包重签名,然后安装调试。
除此之外还有一种方法是让apk直接以调试模式启动,这种可以绕过一部分反调试,进入adb shell,用am命令以调试模式启动程序:
am start -D -n com.bin.MathGame/.MainActivity
程序的名字可以启动一下,然后用ps查看
之后手机上已经启动了:
接下来再使用adb forward命令将这个进程的pid转发到8700端口上:
adb forward tcp:8700 jdwp:{pid}
然后再使用jdb 的命令给进程一个启动的信号:
jdb -connect “com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700”
然后用IDA挂载就可以正常调试了