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. 编译器设置建议

  1. 关闭代码优化选项
  2. 禁用自动优化功能
  3. 设置运行时库为"多线程(/MT)"
  4. 移除调试信息
  5. 考虑使用汇编或低级语言编写关键部分

7. 综合建议

  1. 混合使用多种编码技术(XOR+UUID+SGN)
  2. 结合延迟加载和API哈希调用
  3. 精心控制程序熵值
  4. 移除不必要的CRT依赖
  5. 合理伪装IAT表
  6. 测试不同安全产品的检测规则
  7. 持续更新技术以应对新的检测方法

8. 免责声明

本文所述技术仅用于安全研究和防御目的。使用者需遵守当地法律法规,任何不当使用造成的后果由使用者自行承担。

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. 免责声明 本文所述技术仅用于安全研究和防御目的。使用者需遵守当地法律法规,任何不当使用造成的后果由使用者自行承担。