某梆企业壳--过frida检测
某汽车app
查壳
github:https://github.com/moyuwa/ApkCheckPack
使用查壳工具简单看一看。

root检测
打开app直接闪退。
使用magisk,把app加入排除列表中。
能正常打开了,说明对root的检测比较常规。
frida检测
使用frida进行注入,等了一会后,进程退出。

试试使用老方法——hook pthread_create。
so文件是加密的,可以从内存中dump下来,然后修复了再看。

但这里先不dump,先试试在libDexHelper加载的第一时刻,直接将sub_4f884替换掉。

为什么会报红呢,因为在加载libDexHelper.so的时候,函数sub_4f884尚未解密,所以frida没hook上。
因此,需要在解密函数执行完后,再对函数sub_4f884进行hook。
在把libDexHelper.so dump下来以后,用sofix进行修复。
一般都是在init_array和JNI_OnLoad中进行解密。


假设libDexHelper.so通过pthread_create创建了一个线程,这个线程要执行start_routine——sub_4f884,那么,我可以选择这样一个hook时机。
检查函数pthread_create的第3个参数start_routine是否指向libDexHelper.so的sub_4f884,如果指向,则在onEnter回调中,替换sub_4f884。——执行前,应该已经完成了解密。
然而,在将start_routine指向的函数替换后,进程还是会退出,说明除了sub_4f884,仍有检测frida的地方
如果想要一个进程反复检测frida的存在,那就需要创建子线程或子进程,一般来说都是创建子线程。
而创建线程的方法有系统调用(svc)、pthread_create(库调用)、clone(库调用)。
之所以要写这篇博客,其实就是想讲讲clone、pthread_create、fork的区别。
fork和pthread_create都是依靠clone创建的,根据传递不同的参数给clone,以区别创建的是进程还是线程。

我hook库函数pthread_create,发现libDexHelper仅仅只创建了1个线程(sub_4f884)。
pthread_create在libc是这样子的,也就是说,clone的第4个参数v30,再加上96的偏移就是pthread_create的a3(start_routine)。
1 | __int64 __fastcall pthread_create(_QWORD *a1, __int64 a2, __int64 a3, __int64 a4) |
之后只要将下面的函数给hook掉,frida就能正常用了。

不过我挺好奇是如何调用的clone?——got劫持,还是说其他的方法。