xec412/Vex-PE-Loader

GitHub: xec412/Vex-PE-Loader

一款专为红队设计的 Windows x64 PE 加载器,通过模块重载、API 代理、IAT 伪装和反分析技术实现多层 EDR 绕过。

Stars: 0 | Forks: 0

# Vex PE 加载器 一个使用 C++ 和 MASM 编写的 Windows x64 PE loader,实现了多种现代免杀技术,专为授权的红队交战而设计。

Vex PE Loader Banner

## ⚠️ 免责声明 本项目仅供**教育和研究目的**使用。 未经授权将其用于您不拥有的系统是非法的。 ## 概述 Vex PE Loader 是 [XeraLdr](https://github.com/xec412/XeraLdr) 的继任者,采用 C++ 从头重写,具有模块化架构和完整的 PE payload 支持。 它是一个基于 module overloading 的 PE loader,通过覆盖映射到当前进程的牺牲 DLL 来执行 PE payload,使用 C++20 和 x64 MASM 编写,没有 CRT 依赖。该项目专注于多层免杀:通过代理进行 API 调用混淆、IAT 伪装,以及针对调试器和沙箱环境的反分析检查。 **测试环境:** Microsoft Defender for Endpoint **结果:** 🟢 成功绕过 **视频演示:** [YouTube](https://www.youtube.com/watch?v=Wbv7ygb23-A) **注意:** 目前处于测试目的,payload 是通过 `MapPeFileFromDisk` 从磁盘加载的。如果在实际交战中使用,强烈建议对 payload 进行加密并将其嵌入到 `.rsrc` 节中,或者在运行时从远程获取。此外,在构建发布版本之前,请务必注释掉 `Debug.hpp` 中的 `#define DEBUG`。 ## 核心技术及其选择原因 ### 1. 通过 RtlQueueWorkItem 进行 API 代理 - **为什么?** 在 2025/2026 年,直接 syscall 调用越来越容易被察觉,并且当返回地址未落在合法栈帧时,会触发调用栈异常。敏感的 NT API(`NtProtectVirtualMemory`、`NtMapViewOfSection`、`NtCreateSection`、`NtGetContextThread`、`NtSetContextThread`、`NtOpenThread`、`NtSuspendThread`、`NtResumeThread`、`NtAllocateVirtualMemory`)通过自定义的 x64 MASM stub 分发到 `RtlQueueWorkItem` 工作线程中执行。每个 stub 接收一个包含目标函数指针及其参数的上下文结构,然后直接跳转到该 NT 函数。 - **优势:** 这使得敏感 syscall 的调用栈源自由 `ntdll!TppWorkerThread` 支持的工作线程,而不是主线程——这是 EDR 常见的检测向量。通过工作线程进行代理,可以将调用混入正常的线程池活动中。 ### 2. 模块重载 - **为什么?** Module overloading 避免了使用带有 `PAGE_EXECUTE_READWRITE` 的 `VirtualAlloc`/`VirtualAllocEx`,因为这些 API 受到严格监控。PE payload 是通过覆盖映射到当前进程的牺牲 DLL(`ole32.dll`)来注入的,使用了 `NtCreateSection` + `NtMapViewOfSection`。payload 的节被复制到临时 heap 缓冲区中,修复 IAT 和基址重定位,然后将缓冲区写入映射的 DLL 内存区域。每个节的内存权限都会被修正,随后调用入口点。 - **优势:** payload 在内存中运行,而该内存看起来属于一个合法的、已加载的系统 DLL。 ### 3. IAT 伪装 - **为什么?** 许多 EDR 会监控可疑的 Import Address Table 和 API 解析。本项目使用从 `__TIME__` 派生的编译时随机种子,有条件地调用一组无害的 Windows API(`MessageBoxA`、`SetCriticalSectionSpinCount`、`GetWindowLongPtrW`、`RegisterClassW` 等),这些 API 是 loader 通常不会使用的。 - **优势:** 这会在 Import Address Table 中填充相关条目,使二进制文件在静态分析工具和沙箱分类器看来像是一个合法的 GUI 应用程序。 ### 4. 高级反分析 - **为什么?** loader 在执行 payload 之前会执行关键检查,如果触发了任何检查,它将调用 `ExitProcess(0)`,以防止在虚拟机、调试器和沙箱中执行。 - **包含的检查:** - 通过 `NtQueryInformationProcess` 进行调试器检测(查询 `ProcessDebugPort` 和 `ProcessDebugObjectHandle`)。 - 通过 `NtGetContextThread` 进行硬件断点检测(读取调试寄存器 `Dr0`–`Dr3`)。 - 硬件规格检查(检测 CPU 核心数 ≤2 以及总物理内存 ≤2GB)。 - 显示器分辨率检查(标记自动化环境中常见的非标准分辨率)。 - BIOS 字符串检测(查询 `HKLM\HARDWARE\DESCRIPTION\System\BIOS` 以获取已知的虚拟机/hypervisor 指标,如 `VMware`、`VBOX`、`Virtual`、`Xen`、`innotek`、`QEMU`)。 - **参考:** [Sandbox-Detection-Techniques](https://github.com/arxhr007/Sandbox-Detection-Techniques) ## 截图 ### 1. IAT 伪装 ![IAT 伪装](https://raw.githubusercontent.com/xec412/Vex-PE-Loader/main/docs/screenshots/IatCamouflage.png) ## 构建说明 1. 环境要求: - Visual Studio 2026 - 启用 MASM 构建定制 2. 在 Visual Studio 中打开解决方案。 3. 选择 **Release | x64** 配置。 4. 构建解决方案。 在构建发布版本之前,请注释掉 `include/Debug.hpp` 中的 `#define DEBUG`。 ## 学习资源 - [Maldev Academy](https://maldevacademy.com) ## 参考文献 - [Sandbox-Detection-Techniques](https://github.com/arxhr007/Sandbox-Detection-Techniques)
标签:C++, DNS 反向解析, PE加载器, 反分析, 数据擦除, 端点可见性