安卓逆向学习入门之过反调试(一)
前面有篇文章讲了 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函数的断点处:
这样,一个动态调试时过反调试简单例子就完成了。
调试到这里,指令想怎么改就怎么改吧,你高兴就好。
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/109508042
- 点赞
- 收藏
- 关注作者
评论(0)