天天看点

安卓逆向学习入门之过反调试(一)

前面有篇文章讲了 smail代码的简单修改,其实它有3个apk可以用来练手,今天来讲第二个apk,也是比较简单,大佬请飘过。

样本地址:

https://github.com/wyhuan/owasp-mstg/blob/master/Crackmes/Android/Level_02/UnCrackable-Level2.apk           

依然下载到手机并安装,打开看看:

安卓逆向学习入门之过反调试(一)

还是和之前一样还有root 检测,还是照样用 jadx打开apk看看:

安卓逆向学习入门之过反调试(一)

可以看到,除了检测 root之外,还会检测 是否正在被调试。如果 像上次一样只修改那个语句肯定不行,被调试检测也得一样修改,要不然在动态调试的时候会直接退出:

安卓逆向学习入门之过反调试(一)

这里有两种方案:

一:用frida Hook exit函数,即在执行exit的时候,什么也不做,并不是真正的将进程退出。但是注入的时间得准确,在线程创建之前;否则无法正常Hook

二:将这里的代码在smali文件里面全部删除,这样就不会将程序退出了。

我这里使用的是第二种方法,找到对应的文件和代码,全部删掉:

安卓逆向学习入门之过反调试(一)

重新打包并签名安装后,随便输入一个字符串看提示:

安卓逆向学习入门之过反调试(一)

搜索Nope定位到 调用的地方,发现调用的是一个 native 层的函数:

安卓逆向学习入门之过反调试(一)

定义如下:

安卓逆向学习入门之过反调试(一)

翻看 lib文件夹里面的文件,有这些:

安卓逆向学习入门之过反调试(一)

选择 armeabi-v7a 文件夹里面的so文件拖入到IDA,并查找 bar 函数,F5查看其C伪代码,导入jni.h头文件,并定义一些结构,效果如下:

安卓逆向学习入门之过反调试(一)

逻辑很清晰,先判断输入的字符串长度是否为23,然后再判断是否与 "Thanks for all the fish"相等,也就是输入的字符串是否为 "Thanks for all the fish",在app上输入该字符串,可以看到成功了:

安卓逆向学习入门之过反调试(一)

虽然成功了,但这不是今天的重点,该apk的native层其实有检测是否正在被调试:

安卓逆向学习入门之过反调试(一)

该子函数的定义如下:

安卓逆向学习入门之过反调试(一)

理解这段代码需要一些 进程和线程的知识,目前我也属于萌新的状态,只知道将 ptrace 函数NOP掉就可以过它的检测。下面我们就开干吧。

一,确定手机的CPU架构,一条adb命令即可:

adb shell getprop ro.product.cpu.abi           

测试手机的结果如下:

安卓逆向学习入门之过反调试(一)

二:将这个架构下的so文件拖入IDA(也要选择64位),并设置断点:

安卓逆向学习入门之过反调试(一)

三:开始手机上的服务,并进行端口转发:

安卓逆向学习入门之过反调试(一)
安卓逆向学习入门之过反调试(一)

四:设置IDA调试:

安卓逆向学习入门之过反调试(一)
安卓逆向学习入门之过反调试(一)
安卓逆向学习入门之过反调试(一)

五:调试模式运行该app,cmd输入如下命令:

adb shell am start -D -n owasp.mstg.uncrackable2/sg.vantagepoint.uncrackable2.MainActivity           

该命令运行后手机上的界面显示:

安卓逆向学习入门之过反调试(一)

六:进程PID查看,用ps命令在cmd窗口看的比较费劲,直接保存到文件,在文件里面查找吧:

adb shell ps -A >D:\123.txt           
安卓逆向学习入门之过反调试(一)

转发:

adb forward tcp:8700 jdwp:13573            

运行这条命令后,转到IDA,进行调试:

安卓逆向学习入门之过反调试(一)

点击yes,以后这种弹框都点击yes即可。

jdb附加,在cmd下输入如下命令并回车:

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700           

附加后,在IDA界面一直按F9,使程序运行起来,直到停到断点的位置:

安卓逆向学习入门之过反调试(一)

弹出框一律选择 yes 或 same。不就就会来到这里:

安卓逆向学习入门之过反调试(一)

这就停在了设置断点的位置。按下空格将窗口放大,在调用子函数时,按下F7,进入子函数:

安卓逆向学习入门之过反调试(一)

将这两处的指令直接NOP替换:

安卓逆向学习入门之过反调试(一)

然后一直按下F9,直到看到手机app 正常运行且光标闪烁,随便输入一个 字符串,并按下 VERIFY按钮,IDA弹出如下框:

安卓逆向学习入门之过反调试(一)

点击yes,来到bar函数的断点处:

安卓逆向学习入门之过反调试(一)

这样,一个动态调试时过反调试简单例子就完成了。

安卓逆向学习入门之过反调试(一)