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程序了 
 
		