Android Native 逆向

less than 1 minute read

Debug in Native mode

1. 使用 ida 调试 so

  1. 在用户目录下创建 jdb 脚本,Windows 的文件名是 jdb.ini,目录是在用户家目录,一般是 C:\\Users\\<username>\\,Lniux 的是 .jdbrc,目录同样是在用户家目录,内容如下,目的是让 jdb 在 APP 加载动态链接库的方法上下断点。
    stop in java.lang.System.loadLibrary
    
  2. 把 ida 的 android_server (注意选择对应的版本) 发送到手机中。
    adb push android_server /data/data/local/tmp/
    
  3. 手机要先 root ,然后开启全局调试。
  4. 切换到 root 权限,启动 android_server 进行监听,可能有的 APP 含有反调试,可以自行修改 android_server 文件名和默认监听的端口号。
  5. 打开 ddms ,ddms 会自动进行端口转发。
  6. 以调试模式启动 APP 。
    adb shell am start -D -n com.personal.rocketmouse/com.unity3d.player.UnityPlayerNativeActivity # -n 后面跟的参数值是 "目标应用程序的包名/主Activity名"
    

    启动之后 APP 会提示 “Waiting for debugger to connect”.

  7. 使用 jdb 连接,让程序继续执行,但是由于之前设置的断点存在,程序会在断点处暂停。
  8. 使用 ida 附加到 目标 APP,设置好断点,一般设置成在加载模块时暂停。
  9. 在 jdb 的窗口输入 run ,让 APP 继续运行。
  10. 观察 ida 下方日志窗口的输出,当目标 so 加载时,在自己感兴趣的地方下断点即可。 IDA 7.0 可能会出现无法正常显示多线程的bug,可以通过设置环境变量解决(参考自 IDA7.2 android_server 在 Android10 下无法获取子线程问题修复):
    export IDA_LIBC_PATH=/apex/com.android.runtime/lib/bionic/libc.so
    

    2. 使用 gdb 调试 so

    大致的步骤和上面使用 ida 调试 so 差不过,只不过需要把 android_server 换成相应版本的 gdbserver。
    还有就是需要把 ida 换成 gdb。
    gdb 可以安装一些辅助的插件来增强显示和功能,如 gef, peda, pwndbg 等等。
    Android 也可以开启硬件断点,但是需要修改系统源码并重新编译(关于这点,以后有时间再补上。。。)。

Comments