IDA动态调试apk流程
1 启动DDMS
2 IDA 远程service配置
1 | # 1 将ida/dbgsrv目录下对应的service导入android |
Listening on 0.0.0.0:23946 端口转发:
3 动态调试
1 | # 端口转发 |
4 IDA 操作
- 依次点击
Debug > Attach > Remote ARMLinux/Android debugger启动IDA Pro 中的 Android Debugger - 弹出的对话框勾选
- “Suspend on process entry point”
- “Suspend on thread start/exit”
- “Suspend on library load/unload”
- Hostname 配置为localhost,端口设置为23946
- 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位置方法:- pull出
libdvm.so - 查找函数
dvmLoadNativeCode BLX R:R 即对应的JNI_OnLoad函数,[Calling JNI_OnLoad for \"%s\"]
- pull出
定位到
RegisterNatives函数:- pull 出
libdvm.so - 搜索字符串
Registering JNI native methods for class %s - 查看引用
Registering JNI native methods for class %s的地址
- pull 出
定位加载到内存中dex的地址
直接Ctrl + S 查找
从加载dex的返回结构体获取
- dex 加载时调用用
libdvm.so中的openDexFileNative函数
- dex 加载时调用用
搜索字符串
Refusing to reopen boot DEX '%s'查看引用地址即可从Android源码看so的加载 关于如何找到INI_OnLoad和.init函数
调试模式:
- 将APK的
AndroidManifest.xml文件的debuggable设置为true - 根目录下的
default.prop中的ro.debuggable设置为1
- 将APK的