IDA动态调试apk流程

IDA动态调试apk流程

1 启动DDMS

2 IDA 远程service配置

1
2
3
4
5
6
7
8
9
# 1 将ida/dbgsrv目录下对应的service导入android
$ adb push android_service /data/local/tmp
# 2 提权
$ adb shell
$ su
$ cd /data/local/tmp
$ chmod 755 android_service
# 3 运行
$ ./android_service

Listening on 0.0.0.0:23946 端口转发:

3 动态调试

1
2
3
4
5
# 端口转发
$ adb forward tcp:23946 tcp:23946
# 启动对应app Activity
$ adb shell
# am start -D -n (packageName)/(ActivityName)

4 IDA 操作

  1. 依次点击Debug > Attach > Remote ARMLinux/Android debugger 启动IDA Pro 中的 Android Debugger
  2. 弹出的对话框勾选
    1. “Suspend on process entry point”
    2. “Suspend on thread start/exit”
    3. “Suspend on library load/unload”
  3. Hostname 配置为localhost,端口设置为23946
  4. Attach 对应的进程

5 恢复程序运行

1
$ jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=xxxx

6 补充:使用IDA中的一些小技巧以及经验(长期更新)

  • ARM 指令集分为ARM 模式和Thumb模式,按alt+G即能看到&切换模式

  • 定位到JNI_OnLoad位置方法:

    1. pull出libdvm.so
    2. 查找函数dvmLoadNativeCode
    3. BLX R:R 即对应的JNI_OnLoad函数[Calling JNI_OnLoad for \"%s\"]
  • 定位到RegisterNatives函数:

    1. pull 出 libdvm.so
    2. 搜索字符串Registering JNI native methods for class %s
    3. 查看引用Registering JNI native methods for class %s的地址
  • 定位加载到内存中dex的地址

    • 直接Ctrl + S 查找

    • 从加载dex的返回结构体获取

      • dex 加载时调用用libdvm.so中的openDexFileNative函数
  • 搜索字符串Refusing to reopen boot DEX '%s'查看引用地址即可

  • 从Android源码看so的加载 关于如何找到INI_OnLoad和.init函数

  • 调试模式:

    1. 将APK的AndroidManifest.xml文件的debuggable设置为true
    2. 根目录下的default.prop中的 ro.debuggable设置为1

7 其他好的帖子

Android逆向新手答疑解惑篇-JNI与动态注册