工具:IDA 6.8+eclipse
在AndroidMainifest.xml配置文件中添加 android:debuggable=”true” 属性
1). 如果有源码,则在代码中添加该属性;
2). 如果没有源代码,则反编译apk文件,添加此属性,再重新打包(如何反编译重新打包,网上有很多参考)。启动android_server程序
1). 拷贝IDA目录dbgsrv/android_server文件到手机中,如:/data/data/android_server,可通过命令行执行: adb push E:\IDA\dbgsrv\android_server /data/
2). 执行如下命令:
adb shell
su root
cd data
./android_server
启动后,此窗口不要关闭监听23946端口
另打开一个cmd窗口,执行 adb forward tcp:23946 tcp:23946通过命令行启动应用程序
如: adb shell am start -D -n com.example.jni/.MainActivity
此时应用程序会停在等待调试界面,打开IDA工具:
1). 打开要调试的so文件,可直接拖入;
2). 选择ELF for ARM (Shared object)[elf.ldw],等待so解析完成;
3). 点击Debugger选项,选择 Remote ARM Linux/Android debugger,点击OK;
4). 点击Debugger选项,选择Process options…,配置Hostname为127.0.0.1或者localhost(如果是真机调试,则查看手机IP地址,填写即可,如:192.168.2.167),端口使用默认值 23946;
5). 点击Debugger选项,选择 Attach to process…, 选择要调试应用的包名;
6). 于左侧列表中Ctrl+F,搜索JIN_onLoad函数,双击,打上断点;监听调试继续执行
命令行中输入 jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700 回车如果一切顺利,则可以断点调试;
调试其他方法类似;调试快捷键,F7单步进入,F8单步,F9运行;
注意事项:
1). 手机要有root权限;
2). 实际测试中发现,如果先打eclipse工程,再开始以上步骤,则最后未能断在断点处,而是直接运行结束了。此时应该关闭eclipse,待运行到第4步后,再打开eclipse工程,并在DDMS中选择要调试的工程,再进行第5步,则调试正常。以上是调试Android so方法大致流程和步骤,待有时间记录更详细步骤并添加截图,以防忘记。
实际中遇到的问题也比较多,但是由于时间较长,而且当时未作记录,所以不能一一写下,其中之一是,原电脑中python版本太低,每次启动IDA都提示xxx模块初始化失败,重新安装IDA目录中python-2.7.6后,此问题解决。