Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
zig-pe — 用Zig编写的反射式PE加载器。直接从内存加载并执行本机PE和.NET PE文件。 | Kitploit
工具/GitHubGitHub/thoxy67/zig-pe
漏洞利用后渗透利用渗透测试红队Payload 开发二进制利用
GitHubthoxy67/zig-pe

zig-pe

用Zig编写的反射式PE加载器。直接从内存加载并执行本机PE和.NET PE文件。

查看仓库
6775个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

zig-pe

用Zig编写的反射式PE加载器。直接从内存加载并执行原生和.NET PE文件。

特性

PE加载流水线

  • 解析DOS和NT头(运行时支持PE32和PE32+)
  • 将节映射到分配的内存
  • 解析导入(按名称和序号,PE32 4字节/PE32+ 8字节跳转表)
  • 应用基址重定位(HIGHLOW, DIR64, ARM_MOV32, THUMB_MOV32)
  • 解析延迟导入(DataDirectory[13],现代RVA格式)
  • 注册异常处理程序(仅x64/ARM64的RtlAddFunctionTable)
  • 设置每节的内存保护
  • 调用TLS回调(DLL_PROCESS_ATTACH)
  • 通过CreateThread执行入口点
  • 清理(注销异常表,释放内存)

高级安全特性

  • 安全Cookie初始化(用于/GS缓冲区安全的__security_cookie)
  • CFG(控制流防护)- 通过SetProcessValidCallTargets注册有效调用目标
  • SxS/激活上下文 - 为GUI应用程序激活嵌入的清单
  • 绑定导入目录失效

导出表解析

用于从已加载的PE映像中解析导出表的实用函数:

  • getExportByName(base, ntheaders, name) — 按名称解析
  • getExportByOrdinal(base, ntheaders, ordinal) — 按序号解析

通过加载目标DLL自动处理转发导出(例如,"NTDLL.RtlAllocateHeap"解析为ntdll.dll中的实际函数)。

API集解析

使用PEB ApiSetMap自动将Windows API集(api-ms-win-*、ext-ms-win-*)解析到其实际的主机DLL。这使得能够加载从虚拟API集DLL导入的PE。

工具函数

  • utils.detect_platform(buffer) — 检测PE是32位还是64位
  • utils.is_dotnet_assembly(ntheaders) — 检查PE是否为.NET程序集
  • utils.getDotNetVersion(buffer) — 从元数据中提取.NET运行时版本字符串
  • utils.rvaToFileOffset(buffer, rva) — 将RVA转换为原始文件偏移

兼容性

  • 原生编译二进制执行(x86、x86_64、ARM、ARM64)
  • 通过CLR宿主执行.NET编译二进制
  • 向原生和.NET可执行文件传递命令行参数
  • 架构验证(PE位数必须与宿主进程匹配)

支持的机器类型

前提条件

  • Zig编译器(推荐最新版本)
  • Windows操作系统(该项目使用特定于Windows的API)

构建项目

  1. 克隆仓库:

    root@kitploit:~
    git clone https://github.com/Thoxy67/zig-pe.git
    cd zig-pe
    
  2. 构建项目:

    root@kitploit:~
    zig build
    

构建选项

root@kitploit:~
zig build -Ddotnet=false  # 禁用.NET支持(默认启用)

构建目标

root@kitploit:~
zig build                 # 构建所有目标
zig build run-putty64     # 运行64位原生PE示例
zig build run-putty32     # 运行32位原生PE示例
zig build run-dotnet      # 运行.NET程序集示例
zig build test            # 运行单元测试

用法

基本用法(内嵌PE)

root@kitploit:~
const pe = @import("pe");

pub fn main() !void {
    // Load and execute an embedded PE file
    try pe.RunPE.init(@embedFile("bin/app.exe")).run();
}

带命令行参数

root@kitploit:~
const pe = @import("pe");

pub fn main() !void {
    var loader = pe.RunPE.init(@embedFile("bin/app.exe"));
    try loader.runWithArgs(&.{ "arg1", "arg2", "arg3" });
}

从文件加载

root@kitploit:~
const std = @import("std");
const pe = @import("pe");

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const allocator = gpa.allocator();

    const file_content = try std.fs.cwd().readFileAlloc(
        allocator,
        "path/to/executable.exe",
        std.math.maxInt(usize),
    );
    defer allocator.free(file_content);

    try pe.RunPE.init(file_content).run();
}

从已加载的PE中解析导出

root@kitploit:~
const pe = @import("pe");

// 将DLL加载到内存后...
const base: [*]const u8 = @ptrCast(loaded_base);
const ntheaders = // ... 获取NT头

// 按名称解析
if (pe.getExportByName(base, ntheaders, "ExportedFunction")) |func_ptr| {
    const func: *const fn () void = @ptrCast(@alignCast(func_ptr));
    func();
}

// 按序号解析
if (pe.getExportByOrdinal(base, ntheaders, 42)) |func_ptr| {
    // 使用函数指针
}

参数传递方式

  • 原生PE:通过修补PEB的命令行来传递参数,因此GetCommandLineW()返回提供的参数
  • .NET程序集:通过CLR调用直接将参数传递给Main(string[] args)

安全注意事项

该项目涉及加载和执行任意代码,具有潜在危险性。请仅在受信任的PE文件和受控环境中使用此加载器。作者对因使用本软件造成的任何误用或损坏不承担责任。

贡献

欢迎为zig-pe做出贡献!请随时提交拉取请求、创建问题或传播此项目。

  1. 复刻项目
  2. 创建你的特性分支(git checkout -b feature/AmazingFeature)
  3. 提交你的更改(git commit -m 'Add some AmazingFeature')
  4. 推送到分支(git push origin feature/AmazingFeature)
  5. 开启一个拉取请求

许可证

本项目采用MIT许可证授权 - 详见LICENSE文件。

致谢

  • Zig编程语言社区
  • PE文件格式文档的贡献者

免责声明

本项目仅供教育目的。在加载和执行任何PE文件前,请确保你拥有必要的权利和权限。

下载工具
架构机器代码位数
i3860x014c32-bit
AMD640x866464-bit
IA640x020064-bit
ARM (ARMNT)0x01C432-bit
ARM640xAA6464-bit