Android逆向系列之动态调试(七)–IDA调试so文件(下)

111111111

《Android逆向系列之动态调试(零)–入门篇》
《Android逆向系列之动态调试(一)–Smali注入》
《Android逆向系列之动态调试(二)–Eclipse调试apk》
《Android逆向系列之动态调试(三)–IDA调试dex》
《Android逆向系列之动态调试(四)–代码注入(JDB调试)》
《Android逆向系列之动态调试(五)–gdb调试》
《Android逆向系列之动态调试(六)–IDA调试so文件》
《Android逆向系列之动态调试(七)–IDA调试so文件(下)》

一、环境准备
工具详见<工具篇>、破解的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–>勾选如下图的勾:
ida配置

4.jdb–attach
先打开DDMS
F9运行程序
然后再cmd下输入: jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
jdb成功

问题分析:jdb出现致命错误,无法附加到目标 VM
问题解决:
打开DDMS,然后选中相应的进程,重新输入jdb命令;如果不行,重新检查是否有android:debuggable=”true”属性;

问题分析:出现如图:
找不到文件
问题解决:直接点取消即可,另一弹窗也点取消,最终程序会断在linker断即正确。

5.下断点–触发断点
定位函数的方法:绝对地址=基地址+偏移地址
具体方法请查看上一篇文章

这里触发断点的方式为:点击运行按钮或者是按F9
接着就可以动态调试F7或者F8里

6.程序破解
这里F8跟踪程序,每次调试到BLX R7;便退出,说明这里有问题,我们查看一下寄存器,发现是一个pthread_create函数,说明,反调试在这里开启一个线程,然后不断地做轮询,主要的原理是判断TrackerPid字段值是否等于0,由于如果存在调试,TrackerPid就不为0,因此可以用作反调试;要破解也简单,我们只要把这里的调用函数给Nop掉即可。
JNI

使用二进制编辑器,将BLX R7 nop掉,首先找到其对应的地址,这里可以再打开另一个ida去找到对应的地址。
nop

然后使用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逆向之动态调试总结

本文属原创,转载请注明出处,如有问题请联系,root@tasfa.cn

发表评论

电子邮件地址不会被公开。

You must enable javascript to see captcha here!