[翻译]木马病毒和EDR的一些Bypass思路
字数 2269 2025-08-22 22:47:39

EDR与防病毒软件绕过技术详解

1. EDR/防病毒软件工作原理

1.1 检测技术概述

现代安全解决方案采用多层检测机制:

  1. 签名检测:通过哈希值(SHA-256等)匹配已知恶意软件
  2. 静态分析:扫描程序中的可疑字符串和模式
  3. 启发式/行为检测:通过沙盒观察程序行为
  4. IAT检查:分析导入函数表寻找可疑组合
  5. AMSI:反恶意软件扫描接口实时检测
  6. ETW:Windows事件跟踪收集行为数据
  7. API挂钩:监控关键系统调用
  8. 网络检测:监控异常网络连接

1.2 各技术细节

1.2.1 签名检测

  • 计算文件哈希与恶意软件数据库比对
  • 易绕过:微小修改即可改变整个哈希值
  • 示例:Mimikatz 2.2.0特定哈希被广泛识别

1.2.2 静态分析

  • 扫描可执行文件中的字符串
  • 示例:包含"mimikatz"字符串会被标记
  • 使用YARA规则进行模式匹配检测

1.2.3 启发式/行为检测

  • 在沙盒中运行程序观察行为
  • 检测可疑API调用序列
  • 示例:OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThreadEx组合

1.2.4 IAT检查

  • 分析程序的导入地址表
  • 查找已知恶意功能组合
  • 示例:进程注入相关API同时出现

1.2.5 AMSI

  • 通过amsi.dll提供的接口
  • 关键函数:AmsiScanString, AmsiScanBuffer
  • 被PowerShell等脚本宿主使用

1.2.6 ETW

  • 三组件架构:
    • 提供者(发送事件)
    • 消费者(处理事件)
    • 控制器(管理会话)
  • 关键提供者:Windows事件跟踪-威胁情报

1.2.7 API挂钩

  • EDR注入DLL到目标进程
  • 修改关键API前几条指令跳转到检测代码
  • 示例:挂钩ntdll.dll中的Nt系列函数

2. 绕过技术详解

2.1 绕过签名检测

  • 修改程序任意部分改变哈希
  • 重命名变量/函数
  • 添加无害代码段

2.2 绕过静态分析

  • 字符串混淆:
    • 使用工具如garble对Go二进制混淆
    • 替换标识符为哈希值
    • 删除调试信息
  • Shellcode加密:
    • 使用AES等加密payload
    • 运行时解密

2.3 绕过启发式/行为检测

  • 反沙盒技术:
    • 检测域环境(NetGetJoinInformation)
    • 检查硬件特征(内存、CPU核心)
    • 查找虚拟化驱动(VBox*.sys)
  • 添加良性功能混淆真实意图

2.4 混淆IAT

  • 动态加载DLL:
    • 使用LoadLibrary + GetProcAddress
    • 避免函数出现在静态IAT中
  • Go语言示例:
var (
    kernel32     = syscall.NewLazyDLL("kernel32.dll")
    virtualAlloc = kernel32.NewProc("VirtualAlloc")
)

2.5 AMSI绕过

  • 内存修补技术:
    1. 获取目标进程句柄(如PowerShell)
    2. 定位AmsiScanBuffer等函数地址
    3. 修改为ret指令(0xC3)
  • Go实现示例:
patch := []byte{0xC3}
procHandle := OpenProcess(PROCESS_ALL_ACCESS, false, pid)
WriteProcessMemory(procHandle, amsiScanBufferAddr, &patch[0], 1)

2.6 ETW绕过

  • 类似AMSI的内存修补:
    1. 获取进程句柄
    2. 定位EtwEventWrite/NtTraceEvent
    3. 修改为ret指令
  • 注意需要修补调用链末端函数

2.7 API挂钩绕过

2.7.1 直接系统调用

  • 自行实现Nt函数汇编代码
  • 包含正确的SSN(系统调用号)
  • 问题:非ntdll中的syscall指令易被检测

2.7.2 间接系统调用

  • 实现Nt函数前导部分
  • jmp到ntdll中其他Nt函数的syscall指令
  • 示例:使用NtAllocateVirtualMemory的syscall执行NtOpenProcess

2.7.3 Hell's Gate技术

动态解析SSN的完整流程:

  1. 定义数据结构:
struct _VX_TABLE_ENTRY {
    void* addr;     // 函数地址
    DWORD hash;     // 函数名哈希
    DWORD ssn;      // 系统调用号
};

struct _VX_TABLE {
    _VX_TABLE_ENTRY entries[MAX_ENTRIES];
};
  1. 预处理:
  • 为每个目标Nt函数计算djb2哈希
  • 建立"哈希->函数名"映射表
  1. 动态解析:
  • 通过TEB/PEB获取ntdll.dll的EAT
  • 遍历导出函数,计算每个名称的djb2哈希
  • 匹配预处理表中的哈希值
  • 找到匹配后,定位函数代码中的SSN:
    • 搜索字节序列:4C 8B D1 B8(mov r10, rcx; mov eax, SSN)
    • 从mov eax指令中提取SSN
  1. 处理挂钩:
  • 如果标准位置被挂钩,继续搜索后续代码
  • 直到找到未被修改的SSN或遇到syscall/ret

2.7.4 高级变种

  • Halos Gate:改进的Hell's Gate,处理更多对抗情况
  • 系统调用堆栈欺骗:伪造调用链

3. 进阶技术方向

  1. 内核回调绕过

    • 理解内核通知机制
    • 定位和修改回调数组
  2. EtwTI高级绕过

    • 需要BYOVD(自带漏洞驱动)
    • 绕过PatchGuard保护
  3. SSN动态解析增强

    • 处理不同Windows版本偏移
    • 对抗EDR的SSN混淆技术
  4. 内存操作隐蔽化

    • 使用低级别API如NtMapViewOfSection
    • 内存属性欺骗

4. 防御对抗演进

  • EDR开始检测非标准系统调用
  • 增加对间接系统调用的检测
  • 监控内核级内存修改
  • 使用AI分析行为模式

5. 实施建议

  1. 技术组合:单一技术易被检测,需组合使用
  2. 环境适配:根据目标环境选择适当技术
  3. 持续更新:绕过技术需随EDR演进而更新
  4. 隐蔽优先:最小化异常行为,模仿合法程序

6. 参考实现要点

  • Go语言适合编写加载器:天然支持动态调用
  • 关键函数应动态解析,避免静态导入
  • Shellcode必须加密存储,运行时解密
  • 添加环境检测逻辑,对抗沙盒分析
  • 实现多阶段加载,降低单次检测风险

通过深入理解EDR工作原理并系统性地应用这些绕过技术,可以有效提高攻击工具在防护环境中的生存能力。但需注意这些技术会随防御方升级而失效,需要持续研究和创新。

EDR与防病毒软件绕过技术详解 1. EDR/防病毒软件工作原理 1.1 检测技术概述 现代安全解决方案采用多层检测机制: 签名检测 :通过哈希值(SHA-256等)匹配已知恶意软件 静态分析 :扫描程序中的可疑字符串和模式 启发式/行为检测 :通过沙盒观察程序行为 IAT检查 :分析导入函数表寻找可疑组合 AMSI :反恶意软件扫描接口实时检测 ETW :Windows事件跟踪收集行为数据 API挂钩 :监控关键系统调用 网络检测 :监控异常网络连接 1.2 各技术细节 1.2.1 签名检测 计算文件哈希与恶意软件数据库比对 易绕过:微小修改即可改变整个哈希值 示例:Mimikatz 2.2.0特定哈希被广泛识别 1.2.2 静态分析 扫描可执行文件中的字符串 示例:包含"mimikatz"字符串会被标记 使用YARA规则进行模式匹配检测 1.2.3 启发式/行为检测 在沙盒中运行程序观察行为 检测可疑API调用序列 示例:OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThreadEx组合 1.2.4 IAT检查 分析程序的导入地址表 查找已知恶意功能组合 示例:进程注入相关API同时出现 1.2.5 AMSI 通过amsi.dll提供的接口 关键函数:AmsiScanString, AmsiScanBuffer 被PowerShell等脚本宿主使用 1.2.6 ETW 三组件架构: 提供者(发送事件) 消费者(处理事件) 控制器(管理会话) 关键提供者:Windows事件跟踪-威胁情报 1.2.7 API挂钩 EDR注入DLL到目标进程 修改关键API前几条指令跳转到检测代码 示例:挂钩ntdll.dll中的Nt系列函数 2. 绕过技术详解 2.1 绕过签名检测 修改程序任意部分改变哈希 重命名变量/函数 添加无害代码段 2.2 绕过静态分析 字符串混淆: 使用工具如garble对Go二进制混淆 替换标识符为哈希值 删除调试信息 Shellcode加密: 使用AES等加密payload 运行时解密 2.3 绕过启发式/行为检测 反沙盒技术: 检测域环境(NetGetJoinInformation) 检查硬件特征(内存、CPU核心) 查找虚拟化驱动(VBox* .sys) 添加良性功能混淆真实意图 2.4 混淆IAT 动态加载DLL: 使用LoadLibrary + GetProcAddress 避免函数出现在静态IAT中 Go语言示例: 2.5 AMSI绕过 内存修补技术: 获取目标进程句柄(如PowerShell) 定位AmsiScanBuffer等函数地址 修改为ret指令(0xC3) Go实现示例: 2.6 ETW绕过 类似AMSI的内存修补: 获取进程句柄 定位EtwEventWrite/NtTraceEvent 修改为ret指令 注意需要修补调用链末端函数 2.7 API挂钩绕过 2.7.1 直接系统调用 自行实现Nt函数汇编代码 包含正确的SSN(系统调用号) 问题:非ntdll中的syscall指令易被检测 2.7.2 间接系统调用 实现Nt函数前导部分 jmp到ntdll中其他Nt函数的syscall指令 示例:使用NtAllocateVirtualMemory的syscall执行NtOpenProcess 2.7.3 Hell's Gate技术 动态解析SSN的完整流程: 定义数据结构: 预处理: 为每个目标Nt函数计算djb2哈希 建立"哈希->函数名"映射表 动态解析: 通过TEB/PEB获取ntdll.dll的EAT 遍历导出函数,计算每个名称的djb2哈希 匹配预处理表中的哈希值 找到匹配后,定位函数代码中的SSN: 搜索字节序列:4C 8B D1 B8(mov r10, rcx; mov eax, SSN) 从mov eax指令中提取SSN 处理挂钩: 如果标准位置被挂钩,继续搜索后续代码 直到找到未被修改的SSN或遇到syscall/ret 2.7.4 高级变种 Halos Gate:改进的Hell's Gate,处理更多对抗情况 系统调用堆栈欺骗:伪造调用链 3. 进阶技术方向 内核回调绕过 : 理解内核通知机制 定位和修改回调数组 EtwTI高级绕过 : 需要BYOVD(自带漏洞驱动) 绕过PatchGuard保护 SSN动态解析增强 : 处理不同Windows版本偏移 对抗EDR的SSN混淆技术 内存操作隐蔽化 : 使用低级别API如NtMapViewOfSection 内存属性欺骗 4. 防御对抗演进 EDR开始检测非标准系统调用 增加对间接系统调用的检测 监控内核级内存修改 使用AI分析行为模式 5. 实施建议 技术组合 :单一技术易被检测,需组合使用 环境适配 :根据目标环境选择适当技术 持续更新 :绕过技术需随EDR演进而更新 隐蔽优先 :最小化异常行为,模仿合法程序 6. 参考实现要点 Go语言适合编写加载器:天然支持动态调用 关键函数应动态解析,避免静态导入 Shellcode必须加密存储,运行时解密 添加环境检测逻辑,对抗沙盒分析 实现多阶段加载,降低单次检测风险 通过深入理解EDR工作原理并系统性地应用这些绕过技术,可以有效提高攻击工具在防护环境中的生存能力。但需注意这些技术会随防御方升级而失效,需要持续研究和创新。