安卓ida动态调试总结
不出问题的理想步骤(带反调试的版本)
需要的软件:
- ida7.0/6.8
- ddms(或者sdk/tools/monitor.bat)
- root真机一部(因为android_server是基于arm架构,而大多数模拟器基于x86,所以最好是真机)或者AVD模拟器
- 待调试apk(test.apk,包名:)
- adb
正确步骤:
- 新开一个cmd
- adb push android_server /data/local/tmp(android_server在ida的dbgsrv目录下)
- adb shell
- su
- cd /data/local/tmp
- chmod 777 android_server
- ./android_server
- 新开一个cmd
- adb install test.apk
- adb forward tcp:23946 tcp:23946
- adb shell am start -D -n 包名/类名(程序包名可以在AndroidMainfest文件中找到,类名我是用androidkiller的入口函数;这是以启动模式启动)
-
打开IDA,Debugger->attach->android_server ,
先Debug options设置:
然后hostname设置如图:
然后点击ok,弹出进程列表
Search apk包名,然后记住进程ID,然后重要的一步,在Debug option里面:
还是选中那三个选项。
4.cmd
- adb forward tcp:8899 jdwp:11514 (11514是进程的id)
- jdb -connect com.sun.jdi.SocketAttach:port=8657,hostname=127.0.0.1
jdb的port参考的是monitor的相关进程的端口号:
等前面的蜘蛛变绿(不用jdb,前面蜘蛛为红色),然后就可以F9运行了。
下面说说遇到的问题:
1.首先保证apk是否支持debuggble模式,在AndroidMainfest文件里,application结点android:debuggable="true",如果不是,可修改后二次打包
如:
2.原手机android_server已经在运行问题:
在执行./android_server时弹出bind: Address already in use
解决方案:
在adb shell 里:ps | grep android_server
然后他会输出进程ID,第一个数即为进程id:
如输出:root 12212 13423 23213 后省略
然后执行kill -s 9 12212
3.IDA attach报错
(1)incompatible debugging serer:address size is 4 bytes
错误原因:是android_server是32位的,而ida是64位的。
解决方案:启动32位ida
(2)Bogus or irresponsive remote server
错误原因:SELinex安全策略限制
解决方案:
- adb shell
- su
- setenforce 0