1. 准备工作
首先无论是调试NDK还是so都需要把IDA的调试服务器push进Android系统中运行
在Android设备中添加、配置android_server程序
先将IDA目录下的./dbgsrv/android_server程序拷贝到Android设备下:
1
adb push [IDA_PATH]/dbgsrv/android_server /data/local/tmp/
修改文件权限属性:
1
adb shell chmod 777 /data/local/tmp/android_server
启动调试服务
1
adb shell/data/local/tmp/android_server
进行端口转发,使PC端口与Android端口可进行交互
在打开一个cmd窗口执行:
1
adb forward tcp:23946 tcp:23946
监听端口可以修改, 有的反调试就是 利用默认的23946端口被占用判断是否被调试
2. 使用IDA调试NDK程序
1) 打开IDA, 打开菜单: Debugger -> Run ->RemoteArmLinux/Android debugger
打开调试程序的设置对话框:
Application:对应调试程序所在的路径
Directory:对应调试程序所在的目录路径
HostName:输入localhost
Port:PC端口2) 菜单: Debugger -> Debuger Options
设置在入口点断下
3) F9运行程序
4) 对于已经运行的程序可以Atach附加调试
3. 使用IDA调试so动态库
1) 以调试模式启动apk程序
adb shell am start -D -n 包名/类名
如: adb shell am start -D -n com.example.jnitest/.MainActivity
启动后会停在这个界面2) 附加开启的进程
启动ida pro,点击”Debugger - > Attach -> Remote ArmLinux/Android debugger”
直接确定
选择进程双击, 或者OK
3) 设置调试选项
(一定要在这个步骤设置, 之前没附加设置无效)
点击”Debug options”按钮, 设置如下, 因为要在loadlibrary之前断下;之后, F9 运行程序, 把程序跑起来
4) 获取调试端口
打开eclipse ddms在Devices窗口
前面的是调试端口, 圈住的就是映射后的端口:
映射的步骤如果开启Esclipse了就不用:
没开启的话把8700端口映射到进程ID, 所以JDB连8700端口等于连目标进程;
adb forward tcp:8700 jdwp:进程ID
如: adb forward tcp:8700 jdwp:487在命令行输入:
1
jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=localhost
运行成功:
5) 进入调试流程
之后, 可能会出现add map窗口一律cancle, 可以发现加载的是我们要的so
这时, 程序会断下, 点击ida中的”Debugger -> Debugger windows -> Module list ”。在”Modules”窗口中找到我们的so
双击后就可以看到so中的函数了
在之后就可以双击到对应函数的ARM汇编中F2下断, F9运行就会断下
F9后断点就激活了
至此, 就可以使用IDA愉快调试SO或NDK程序了