某梆企业壳--过frida检测

某汽车app

查壳

github:https://github.com/moyuwa/ApkCheckPack

使用查壳工具简单看一看。

image-20250611184449878

root检测

打开app直接闪退。

使用magisk,把app加入排除列表中。

image-20250611183441372

能正常打开了,说明对root的检测比较常规。

frida检测

使用frida进行注入,等了一会后,进程退出。

image-20250611184240288

试试使用老方法——hook pthread_create。

image-20250611185818226

so文件是加密的,可以从内存中dump下来,然后修复了再看。

image-20250611191050875

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

image-20250611194040752

为什么会报红呢,因为在加载libDexHelper.so的时候,函数sub_4f884尚未解密,所以frida没hook上。

因此,需要在解密函数执行完后,再对函数sub_4f884进行hook。

在把libDexHelper.so dump下来以后,用sofix进行修复。

一般都是在init_array和JNI_OnLoad中进行解密。

image-20250611214225402

image-20250611214444985

假设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,以区别创建的是进程还是线程。

image-20250611215932607

我hook库函数pthread_create,发现libDexHelper仅仅只创建了1个线程(sub_4f884)。

pthread_create在libc是这样子的,也就是说,clone的第4个参数v30,再加上96的偏移就是pthread_create的a3(start_routine)。

1
2
3
4
5
6
7
8
9
10
__int64 __fastcall pthread_create(_QWORD *a1, __int64 a2, __int64 a3, __int64 a4)
{
...

*(_QWORD *)(v30 + 96) = a3;

...

v32 = clone(__pthread_start, v18, 4001536LL, v30, v30 + 16, v22 + 8, v30 + 16);
}

之后只要将下面的函数给hook掉,frida就能正常用了。

image-20250612121116232

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