[翻译]木马病毒和EDR的一些Bypass思路
字数 2269 2025-08-22 22:47:39
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语言示例:
var (
kernel32 = syscall.NewLazyDLL("kernel32.dll")
virtualAlloc = kernel32.NewProc("VirtualAlloc")
)
2.5 AMSI绕过
- 内存修补技术:
- 获取目标进程句柄(如PowerShell)
- 定位AmsiScanBuffer等函数地址
- 修改为ret指令(0xC3)
- Go实现示例:
patch := []byte{0xC3}
procHandle := OpenProcess(PROCESS_ALL_ACCESS, false, pid)
WriteProcessMemory(procHandle, amsiScanBufferAddr, &patch[0], 1)
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的完整流程:
- 定义数据结构:
struct _VX_TABLE_ENTRY {
void* addr; // 函数地址
DWORD hash; // 函数名哈希
DWORD ssn; // 系统调用号
};
struct _VX_TABLE {
_VX_TABLE_ENTRY entries[MAX_ENTRIES];
};
- 预处理:
- 为每个目标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工作原理并系统性地应用这些绕过技术,可以有效提高攻击工具在防护环境中的生存能力。但需注意这些技术会随防御方升级而失效,需要持续研究和创新。