NativePe 是一个使用 Object Pascal 为 Delphi 编写的 Windows 可移植可执行文件(PE)库。
该项目专注于 PE 解析、映射、加载、重定位、导入与导出处理、转储、进程内存读取以及相关的 Windows 内部机制。它支持从同一源码树构建 Win32 和 Win64 版本。
NativePe 是一个研究项目。它已经针对大量正常、异常、畸形和恶意的 PE 文件进行了测试,但并不声称能够正确处理所有可能的 PE 文件。
部分动机是个人原因。我在 2000 年代初使用过 Delphi,想用现代 Delphi 重新审视底层 Windows 开发。
NativePe 也是一个实践性实验,旨在表明 Object Pascal 仍然可以用于 PE 和 Windows 内部机制研究。
NativePe 的 PE 处理核心是 hasherezade 的 libpeconv 的 Object Pascal 移植/重新实现。
代码已用 Object Pascal 重写,但核心模块划分以及许多公共操作、验证路径、控制流决策、回退规则、诊断和测试均源自 libpeconv 源码。因此,NativePe 并非其所移植的 libpeconv 功能的净室或独立设计实现。
当前差分测试框架所使用的 libpeconv 修订版本为提交 0fc25f680e03699d33ef3b2034a6724365f3d1a4。
感谢 hasherezade 发布 libpeconv。有关源码级关系,请参见 docs/PROVENANCE.md;有关署名和许可声明,请参见 THIRD-PARTY-NOTICES.md。
NativePe 不仅仅是 libpeconv 的语法翻译。当前项目在移植核心的基础上增加了 NativePe 特有的功能以及 Delphi/Windows 集成。
这包括 API Set 解析、可插拔的 WinAPI/NTAPI/直接系统调用内存提供程序、安全 Cookie 初始化、PE 回收辅助工具以及相关集成代码。这些部分在固定版本的 libpeconv 核心中没有直接对应的源码模块。
该仓库还包含 NativePe 特有的 Delphi 测试项目、真实场景测试夹具、语料库工具以及 Windows 集成测试。
更多详情请参见 docs/FEATURES.md。
NativePe 通过 TNativePeMemoryProvider 将 PE 逻辑与选定的操作系统内存操作分离。
当前内置后端包括:
TWinApiMemoryProviderTNtApiMemoryProviderTSyscallMemoryProvider现有的钩子路径还保留了其可选的 UseSyscalls 兼容开关,用于基于直接系统调用的内存保护。
NativePe 使用多个测试层:
2026 年 9 月 25 日记录的差分运行使用 NativePe 和固定版本的 libpeconv 测试框架处理了 30,159 个相同的语料库路径。在结果层面,30,147 个路径匹配,12 个不同。NativePe 在该次运行中未记录到工作进程崩溃;libpeconv 测试框架记录了六次。这些结果仅描述该语料库和这些测试框架,并不构成普遍优越性的证明。
该次运行并非基准测试级别的性能运行,因此其计时数据不用于性能声明。外部语料库和恶意软件样本不随 NativePe 分发。
请参见 docs/TESTING.md、docs/CORPUS-RESULTS.md 和 docs/LIBPECONV-COMPARISON.md。
NativePe 使用 Delphi 12 Athens 开发。
打开 NativePe.groupproj 以构建包含的演示、测试、语料库运行器、进程转储工具和真实场景测试项目。
主库源码位于 src 下。项目也可以通过将 src 添加到 Delphi 单元搜索路径并引用所需的 NativePe.* 单元来直接使用 NativePe。
包含的项目同时支持 Win32 和 Win64。
以下示例映射一个 PE 映像、应用重定位并解析导入。它不会调用 PE 入口点。
program PeLoaderMinimal;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
NativePe.BufferUtil,
NativePe.PeLoader;
var
Image: TAlignedBuf;
ImageSize: NativeUInt;
begin
if ParamCount <> 1 then
Halt(1);
Image := LoadPeExecutable(ParamStr(1), ImageSize);
if Image = nil then
Halt(1);
try
Writeln('Loaded at: 0x', IntToHex(NativeUInt(Image), SizeOf(Pointer) * 2));
Writeln('Virtual size: ', ImageSize);
finally
FreePeBuffer(Image, ImageSize);
end;
end.
将 src 添加到 Delphi 单元搜索路径,并以一个 PE 文件作为唯一参数运行该程序。
该仓库包含多个可执行文件和辅助脚本。主要入口点在 docs/BINARIES.md 中有文档说明。
重要提示:NativePeDemo.exe 会加载并执行所提供的 PE 文件。请仅将其用于受信任的测试文件。语料库运行器设计用于静态 PE 处理,不会有意执行 PE 入口点或 TLS 回调。
NativePe 被积极用作研究和测试项目。随着新的 PE 边缘情况被发现,API 和实现细节可能仍会发生变化。
广泛的测试可以降低风险,但并不能证明完全正确。请将不受信任的 PE 文件视为不受信任的输入,并在处理恶意软件时使用适当的隔离措施。
NativePe 的原创贡献在 MIT 许可证 下发布。
源自第三方项目的代码保留 THIRD-PARTY-NOTICES.md 中所述适用的上游声明和许可条件。