01
基本问题
1、在bilibili 7.26.1版本的apk包用frida去分析功能,以spawn模式启动应用操作frida就被干掉。
2、分析工具和环境:bilibili 7.26.1、frida 15.2.2(去除特征版本)、pixel 6 android 12
02
分析准备
Frida 的两种操作模式: spwan/attach
spwan 模式就是将启动APP的权利交由Frida来控制,采用这个模式即使APP已经启动在使用Frida注入时还是会重新启动APP,通过加上 -f 参数指定包名以spwan模式操作APP。
attach 模式是建立在APP已经启动的的情况下,Frida通过ptrace注入程序从而执行HOOK的操作。
Spwan一启动就被杀死那么就需要具体分析出是APP中的那个so文件的具体哪个函数去执行的。
03
定位检测
排查定位是APP中具体那个so在检测frida,用hook方式去hook下 dlopen函数,观察一下so的加载流程
Hook的执行结果
由so的加载流程可知,当app执行到libmsaoaidsec.so加载之后,frida进程就被杀掉了,因此对frida检测的关键点在libmsaoaidsec.so中。
接下来可以把重点放在libmsaoaidsec.so中,可以结合ida去分析处理。
04
检测处理
如果有了解过so的加载流程,那么就会知道linker会先对so进行加载与链接,然后调用so的.init_proc函数,接着调用.init_array中的函数,最后才是JNI_OnLoad函数,所以我需要先确定检测点大概在哪个函数中。
使用frida hook JNI_OnLoad函数,如果调用了该函数就输出一行日志,如果没有日志输出,那么就说明检测点在.init_xxx函数中,注入的时机可以选择dlopen加载libmsaoaidsec.so完成之后。
并没有输出日志,那么说明检测的位置在JNI_OnLoad函数之前,所以我需要hook .init_xxx的函数,但这里有一个问题,dlopen函数调用完成之后.init_xxx函数已经执行完成了,这个时候不容易使用frida进行hook
这个问题其实很麻烦的,因为想要hook linker的call_function并不容易,这里面涉及到linker的自举,这里有一个取巧的办法,请看接下来的操作。
首先在.init_proc函数中找一个调用了外部函数的位置,时机越早越好
选择_system_property_get函数,接下来使用frida hook dlopen函数,当加载libmsaoaidsec.so时,在onEnter回调方法中hook _system_property_get函数,以"ro.build.version.sdk"字符串作为过滤器。
如果_system_property_get函数被调用了,那么这个时候也就是.init_proc函数刚刚调用的时候,在这个时机点可以注入我想要的代码,具体实现如下:
在获取了一个非常早的注入时机之后,就可以定位具体的frida检测点了。网上对frida的检测通常会使用openat、open、strstr、pthread_create、snprintf、sprintf、readlinkat等一系列函数,从这里下手是一个不错的选择。
我对pthread_create函数进行hook,打印一下新线程要执行的函数地址
这里面有两个线程是libmsaoaidsec.so创建的,对应的函数偏移分别是0x11129和0x10975
这两个函数都检测了frida,想要了解具体检测方法的可以自己看看,这里不再深入。
05
检测绕过
绕过的方法很简单,直接nop掉pthread_create或者替换检测函数的代码逻辑都可以,我是直接把pthread_create函数nop掉了,下面是完整代码。
至此,frida检测也就成功绕过了
本文来源:
https://bbs.kanxue.com/thread-277034.htm
原文始发于微信公众号(编码安全):某APP检测绕过的实战
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论