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的