介绍IDA动态调试.so之前先说几个在调试过程中可能遇到的坑和相应的解决方法。
问题一:IDA在使用过程中,F5插件翻译C/C++代码,汇编时报 please position the cursor within a function。
解决方法:1.右键 create func;2.在该函数内点F5即可翻译。
问题二:在使用adb push 时adb push d:\android_server(IDA的dbgsrv目录下) /data/local/tmp时有报错,说失败;
解决方法:1.adb shell 进入手机目录下;2.su 获取超级用户权限;3.chmod 777 data 给data赋予权限;4.cd local进入local目录下;5.chmod 777 local给local赋予权限;5.cd tmp;进入tmp目录下;6.chmod 777 tmp
问题三:启动android_server时候报错。
解决方法:
root@android:/data/local/tmp # ./android_server
IDA Android 32-bit remote debug server(ST) v1.19. Hex-Rays (c) 2004-2015 Listening on port #23946...
出现 bind: Address already in use 错误
这是因为手机中可能已经在运行android_server,使用 ps | grep android_server 看一下,有的话杀掉.
如下:(14061是pid)
root@android:/ # ps | grep android_server
root 14061 13574 11180 9504 ffffffff 40183da0 S /data/local/tmp/android_server
127|root@android:/ # kill -s 9 14061
下面转入正题,如何动态调试.so文件,网上其实介绍的已经有很多了,自己也是参考别人的结合自己的实践整理出一套方案。一方面便于自己记忆,另一方面也为了方便他人。
第一步:先安装自己待调试的APK(adb install 后面的为自己的APK)
adb install C:\..\app-debug_Signed.apk
第二步:找到IDA的dbgsrv目录下的androir_server,然后将其adb push进入手机指定目录下:
adb push "D:\Program Files (x86)\IDA 6.8\dbgsrv\android_server" /data/local/tmp
第三步:adb shell进入手机根目录下,进入到tmp目录下:
adb shell
cd data/local/tmp
第四步,给android_server赋予权限并启动android_server(一定要输入su进入超级用户)
su
chmod 777 android_server
./android_server
第五步,另开启命令提示符,开始操作(注意:adb shell am start -D -n后面跟的是:包名/主函数名)
adb forward tcp:23946 tcp:23946
adb shell am start -D -n com.game.game2048/com.game.game2048.MainActivity
第六步,打开IDA,选择Go->选择Debugger->选择Attach->选择Remote ARMLinux/Android debugger->弹出弹窗,Host里面填写127.0.0.1 ->记录com.game.game2048的ID,在这里我的是27191(每次都是不一样的,一定要记住哈)->勾选debugger选项。如下图所示。
第七步,另开命令提示符,进行端口转接,8700端口为调试端口。
adb forward tcp:8700 jdwp:27191
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
第八步,根据so文件中的相对地址计算其绝对地址。
1.先F9键到加载so文件入口时。
2.要定位stringFromJNI函数,故而先看在so文件中的相对地址是0CA0
3.切回IDA,Ctrl+s调出segment表,查找libxxx.so的入口地址。我们看到该so的start地址比较多,我们记住有X属性的Start地址为75676000,忽略7567B000那个,绝对地址75676000+so内偏移地址0CA0=75676CA0。
第九步,IDA中G键,设定断点地址 75676CA0,F2设置断点。如图所示。
第十步,F9执行至断点处,F7单步调试,F8单步步入 ,这样就可以愉快的调试了。