利用工具(如IDA、AS)动态调试so和动态调试dex的基本步骤。
1.前提
待调试的APK的AndroidManifest
文件中显式定义了android:exported="true"
,否则就需要添加之后重打包APK,或者在修改后的自定义Android系统中运行调试。
2.so的动态调试
A.IDA动态调试so
(1)基本步骤
- 在IDA的安装路径中找到android_server文件,将android_server拷贝到手机的/data/local/tmp目录下面,启动android_server。
上图中存在错误。如果不在root条件下启动android_server,则在IDA中附加到Android设备中的进程时只能看到一个进程system/bin/sh
。正确的操作如下图所示。
- tcp端口转发。
adb forward tcp:23946 tcp:23946
- 在命令行中启动要调试的APP。
adb shell am start -D -n com.example.testjniso/com.example.testjniso.MainActivity
启动ida pro,点击
Debugger - > Attach -> Remote ArmLinux/Androiddebugger
,在弹出的对话框中点击Debug options
按钮,在Suspend on process entry point
,Suspend on thread start/exit
,Suspend on library load/unload
等选项的前面打上勾,点击ok
后在弹出对话框的hostname
中填上localhost
,在弹出的Choose process to attach to
窗口中找到com.example.testjniso
进程,选中该进程,然后点击ok
按钮。打开DDMS,看到com.example.testjniso进程的端口为8700,然后关闭DDMS。
jdb连接调试进程。
jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=localhost
点击ida中的继续执行按钮(绿色三角形按钮),或者按F9,在ida弹出的
Add map
窗口中,一律点击Cancle
按钮。在手机上点击运行app,确保so文件已经加载到了手机内存中后,点击ida中的
Debugger -> Debugger windows -> Module list
,在Modules
窗口中找到目标so,点击ida中的暂停调试按钮,暂停当前的调试,右击目标so文件,在弹出的框中点击Jump to module base
,跳转到目标so文件的起始地址,按下Alt+T,查找并跳转到指定地址处,然后下断点,再按F9重新开始调试。接下来就可以一边操作app,一边调试so了。
(2)参考
B.GDB动态调试so
基本步骤如下图所示。
3.dex的动态调试
A.IDA动态调试so
基本步骤如下图所示,但不推荐此方式,更常用的是下述方式。
B.Android Studio + SmaliIDEA动态调试smali代码
首先需要在Android Studio中安装ideasmali插件,接下来的具体步骤如下图所示。