动态调试 so、dex

利用工具(如IDA、AS)动态调试so和动态调试dex的基本步骤。

1.前提

待调试的APK的AndroidManifest文件中显式定义了android:exported="true",否则就需要添加之后重打包APK,或者在修改后的自定义Android系统中运行调试。

2.so的动态调试

A.IDA动态调试so

(1)基本步骤

  1. 在IDA的安装路径中找到android_server文件,将android_server拷贝到手机的/data/local/tmp目录下面,启动android_server。

上图中存在错误。如果不在root条件下启动android_server,则在IDA中附加到Android设备中的进程时只能看到一个进程system/bin/sh正确的操作如下图所示。

  1. tcp端口转发。

adb forward tcp:23946 tcp:23946

  1. 在命令行中启动要调试的APP。

adb shell am start -D -n com.example.testjniso/com.example.testjniso.MainActivity

  1. 启动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按钮。

  2. 打开DDMS,看到com.example.testjniso进程的端口为8700,然后关闭DDMS。

  3. jdb连接调试进程。

jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=localhost

  1. 点击ida中的继续执行按钮(绿色三角形按钮),或者按F9,在ida弹出的Add map窗口中,一律点击Cancle按钮。

  2. 在手机上点击运行app,确保so文件已经加载到了手机内存中后,点击ida中的Debugger -> Debugger windows -> Module list,在Modules窗口中找到目标so,点击ida中的暂停调试按钮,暂停当前的调试,右击目标so文件,在弹出的框中点击Jump to module base,跳转到目标so文件的起始地址,按下Alt+T,查找并跳转到指定地址处,然后下断点,再按F9重新开始调试。

  3. 接下来就可以一边操作app,一边调试so了。

(2)参考

Android逆向系列之动态调试7–IDA调试so文件(上)

B.GDB动态调试so

基本步骤如下图所示。

3.dex的动态调试

A.IDA动态调试so

基本步骤如下图所示,但不推荐此方式,更常用的是下述方式。

B.Android Studio + SmaliIDEA动态调试smali代码

首先需要在Android Studio中安装ideasmali插件,接下来的具体步骤如下图所示。