调试dex
将被调试文件以及对应版本的
android_server
push到/data/local/tmp
(可为其他)修改两者的权限为可执行权限,
chmod 777 xxx
启动调试服务,
./android_server
进行端口转发,
adb forward tcp:23946 tcp:23946
,使PC端口与Android端口可进行交互启动ida,
Debugger->Run->RemoteArmLinux/Android debugger
并设置好对应的参数(被调试文件的路径)设置好端口号(默认23946)点击OK则开始调试
调试so
- 安装好apk,并运行
启动调试服务并进行端口转发(与上相同)
使用工具对apk进行解包,获取到so文件
若要对libdvm.so或者libart.so等系统的so进行分析,则从/system/lib/
文件夹中pull出ida加载so文件,并下好断点(源码调试)
attach进程
点击Debugger->Attach to process
,在选择框中选择apk对应的包名(即apk运行的进程名)并记录下ID然后点击OK然后F9运行ida
进入
Debug options
选中Suspend on library load/unload
在PC的xxx(此处为ID)端口与手机的相应端口之间建立连接
adb forward tcp:8700 jdwp:xxx(此处为ID)
也可使用ddms通信过程如下图(图片来源ctfwiki)
使用jdb在java层将apk attach到电脑上,恢复运行
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
此时ida开始加载so此时ida来到linker(Android系统的加载器/链接器,用于加载so文件)处
进入module找到对应的so下好断点,F9运行ida来到断点处,即可进行调试
问题
若想对无法在module中找到的函数进行动态调试该怎么办?
- 再打开一个ida导入so进行静态分析,找到对应函数的相对地址(双开定位法)
- 在动态调试的ida中找到so在内存中的基址
- 跳转至基址和相对地址相加的位置,即为函数所在处
对于加壳或有反调试的文件进行动态调试不能直接打开apk然后attach
应当以调试方式来启动程序,adb shell am start -D -n packagename/.MainActivity
使用其他模拟器好像都不太行(架构的问题)
建议使用真机或者使用SDK自带的模拟器如何patch
对于一般函数:找到调用函数处修改对应的HEX为
00 00 00 00
(也可为其他无意义指令),也可将函数的第二条(第一条为PUSH)改为POP指令对于动态注册的函数:把调用exit退出对应的HEX改成
00 00 00 00