一、环境准备
工具详见<工具篇>、破解的apk demo: Alictf2014_2.APK(反调试)、apktool
上一篇文章是讲解了IDA在无反调试的情况下调试so文件,这一篇文章自然就是解决在有反调试的情况下,如何使用IDA调试so文件,下一篇文章将会讲解dump dex的方法,敬请关注!
二、调试准备
1、同样的老操作,确保XML里的android:debuggable=”true”,不懂的参考前面的文章
2.以调试模式运行apk,命令: adb shell am start -D -n 包名/类名 (包名类名获取方式请参考文章)
adb shell am start -D -n com.yaotong.crackme/.MainActivity ,出现下图说明启动成功:
3.IDA–attach
adb shell android_server
adb forward tcp:23946 tcp:23946
启动IDA–>debugger–>attach–>remote xxxxx–>填localhost–>ok–>选择对应进程
以上步骤不完整,具体请参考上一篇文章《Android逆向系列之动态调试(六)–IDA调试so文件》。
配置debugger: Debugger — Debugger Options–>勾选如下图的勾:
4.jdb–attach
先打开DDMS
F9运行程序
然后再cmd下输入: jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
问题分析: jdb出现致命错误,无法附加到目标 VM
问题解决:
打开DDMS,然后选中相应的进程,重新输入jdb命令;如果不行,重新检查是否有android:debuggable=”true”属性;
问题分析:出现如图:
问题解决:直接点取消即可,另一弹窗也点取消,最终程序会断在linker断即正确。
5.下断点–触发断点
定位函数的方法:绝对地址=基地址+偏移地址
具体方法请查看上一篇文章
这里触发断点的方式为:点击运行按钮或者是按F9
接着就可以动态调试F7或者F8里
6.程序破解
这里F8跟踪程序,每次调试到BLX R7;便退出,说明这里有问题,我们查看一下寄存器,发现是一个pthread_create函数,说明,反调试在这里开启一个线程,然后不断地做轮询,主要的原理是判断TrackerPid字段值是否等于0,由于如果存在调试,TrackerPid就不为0,因此可以用作反调试;要破解也简单,我们只要把这里的调用函数给Nop掉即可。
使用二进制编辑器,将BLX R7 nop掉,首先找到其对应的地址,这里可以再打开另一个ida去找到对应的地址。
然后使用apktool回编译,签名、安装即可进行正常的调试。
三、小结
执行android_server
端口转发 adb forward tcp:23946 tcp:23946
调试模式启动程序 adb shell am start -D -n 包名/类名
IDA附加
静态找到目标函数对应所在模块的偏移地址
Ctrl+S找到对应模块的基地址,两个地址相加得到最终地址
G跳转至地址,然后下断点
F9运行
执行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
断下,进行调试
参考资料:
http://m.blog.csdn.net/article/details?plg_nld=1&id=51500328&plg_auth=1&plg_uin=1&plg_usr=1&plg_vkey=1&plg_nld=1&plg_dev=1
Android逆向之动态调试总结