安卓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