lkamxmk 发表于 2019-9-21 19:58:38

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

## 一、环境准备
工具详见[<工具篇>](http://www.tasfa.cn/index.php/2016/05/05/android_tools/)、破解的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文件》](https://www.pd521.com/thread-1616-1-1.html)。

配置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

(http://www.52pojie.cn/thread-293648-1-1.html)
页: [1]
查看完整版本: Android逆向系列之动态调试(七)–IDA调试so文件(下)