Windows 静态恶意代码免杀与逃逸技术(一)
字数 1720 2025-09-01 11:26:17
Windows 静态恶意代码免杀与逃逸技术教学文档
1. 静态免杀概述
静态免杀(Static AV Evasion)是指在目标程序尚未执行的情况下,依靠对其文件结构、元数据、字符串特征等静态属性的分析,来避免被安全软件检测的技术。核心目标是使程序在不运行时看起来像一个正常文件。
2. 常见静态检测特征
安全产品主要通过以下特征进行静态检测:
2.1 敏感字符串
- 可疑命令(powershell, cmd.exe等)
- 可疑API调用(CreateRemoteThread等)
- 网络相关特征(IP地址等)
2.2 导入表(IAT)特征
- 可疑API(VirtualAlloc, WriteProcessMemory, LoadLibraryA等)
- 异常的函数导入组合
2.3 YARA规则匹配
- 基于已知恶意代码模式的匹配规则
2.4 文件声明信息
- 系统类型、编译器声明等元数据异常
2.5 Section特征
- .text, .rdata等段的名称和属性异常
2.6 资源/绑定信息
- 不合理的应用软件进程对应关联
2.7 IOC标识
- 常用于后段防御的特征信息
3. Shellcode编码与加密技术
3.1 XOR编码
- 使用单字节密钥对原始shellcode逐字节异或
- 简单高效但容易被识别
3.2 UUID编码
- 将shellcode按16字节分块编码为UUID字符串
- 可规避正则匹配与部分YARA检测
3.3 SGN编码
- 基于EgeBalci的sgn工具(https://github.com/EgeBalci/sgn)
- 编码后shellcode可直接执行,无需解码
- 建议与其他编码技术混合使用
3.4 AES加密
- 使用对称加密方式对shellcode进行加密
- 执行前需要进行解密
其他可选编码方式:
- MAC地址编码
- IPv4/IPv6编码
- Base64编码
4. IAT检查与逃避技术
4.1 延迟加载技术
- 运行时使用LoadLibraryA和GetProcAddress动态加载API
- 避免在IAT中显示可疑函数
4.2 API哈希调用技术
- 自定义实现函数查找逻辑
- 通过API哈希值匹配导出表中的函数名
- 完全隐藏API调用痕迹
其他高级技术:
- 手动解析API地址从PEB
- 解析Export Table获取函数地址
- 回调函数技术
- Syscall直接调用
- APC注入
5. 熵与检测规避
5.1 熵的概念
- 衡量信息不确定性或随机程度的指标
- 熵越高,内容越随机;熵越低,内容越有序
- 安全产品会检测高熵段(.text段内高熵shellcode)
5.2 降低熵的技术
5.2.1 编码选择
- 避免使用AES等会提高熵的加密方式
- 使用SGN+UUID、IPv4/v6、MAC编码等
- 这些编码具有一定组织和顺序,熵值较低
5.2.2 删除CRT库
- 移除msvcrt.dll/ucrtbase.dll等CRT库依赖
- 避免使用__mainCRTStartup等CRT初始化入口
- 移除C++异常处理结构、TLS回调等
注意事项:
- 需要自行实现基本CRT函数
- 可参考开源实现(如VX-API: https://github.com/vxunderground/VX-API)
- 在Visual Studio中将运行时库选项设置为"多线程(/MT)"
5.2.3 插入无害字符串
- 在代码中插入正常英文字符串
- 平衡整体熵值,降低可疑度
5.2.4 IAT伪装
- 添加无害WinAPI函数调用
- 使用NULL参数初始化WinAPI函数
- 包含在永远不会执行的if语句中(需关闭编译器优化)
6. 编译器设置建议
- 关闭代码优化选项
- 禁用自动优化功能
- 设置运行时库为"多线程(/MT)"
- 移除调试信息
- 考虑使用汇编或低级语言编写关键部分
7. 综合建议
- 混合使用多种编码技术(XOR+UUID+SGN)
- 结合延迟加载和API哈希调用
- 精心控制程序熵值
- 移除不必要的CRT依赖
- 合理伪装IAT表
- 测试不同安全产品的检测规则
- 持续更新技术以应对新的检测方法
8. 免责声明
本文所述技术仅用于安全研究和防御目的。使用者需遵守当地法律法规,任何不当使用造成的后果由使用者自行承担。