
Object Pascal(Delphi)ライブラリ。Windows PEファイルの解析、マッピング、読み込み、ダンプを行い、リロケーション、インポート、TLS、リモートプロセスのメモリ読み取りをサポートします。
NativePeは、Delphi向けにObject Pascalで書かれたWindows Portable Executableライブラリです。
本プロジェクトは、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です。
libpeconvを公開してくれたhasherezadeに感謝します。ソースレベルの関係についてはdocs/PROVENANCE.mdを、帰属表示とライセンス通知についてはTHIRD-PARTY-NOTICES.mdを参照してください。
NativePeはlibpeconvの単なる構文翻訳ではありません。現在のプロジェクトは、移植されたコアの周囲にNativePe固有の機能とDelphi/Windows統合を追加しています。
これにはAPI Set解決、プラグイン可能なWinAPI/NTAPI/直接システムコールのメモリプロバイダ、セキュリティクッキーの初期化、PEリサイクルヘルパー、および関連する統合コードが含まれます。これらの部分には、固定されたlibpeconvコアに対応する直接のソースモジュールはありません。
リポジトリにはNativePe固有のDelphiテストプロジェクト、実世界のフィクスチャ、コーパスツール、およびWindows統合テストも含まれています。
詳細はdocs/FEATURES.mdにあります。
NativePeはTNativePeMemoryProviderを通じて、PEロジックと選択されたオペレーティングシステムのメモリ操作を分離しています。
現在の組み込みバックエンドは次のとおりです:
TWinApiMemoryProviderTNtApiMemoryProviderTSyscallMemoryProvider既存のフックパスは、直接システムコールベースのメモリ保護のためのオプションのUseSyscalls互換スイッチも保持しています。
docs/MEMORY-PROVIDERS.mdを参照してください。
NativePeはいくつかのテスト層を使用しています:
2026年9月25日に文書化された差分実行では、30,159の同一コーパスパスをNativePeと固定されたlibpeconvハーネスで処理しました。結果レベルでは、30,147のパスが一致し、12が異なりました。その実行でNativePeはワーカークラッシュを記録しませんでしたが、libpeconvハーネスは6件を記録しました。これらの結果はこのコーパスとこれらのハーネスにのみ当てはまり、一般的な優位性を確立するものではありません。
この実行はベンチマーク品質のパフォーマンス実行ではなかったため、そのタイミングデータはパフォーマンスの主張には使用されません。外部コーパスとマルウェアサンプルはNativePeに同梱されていません。
docs/TESTING.md、docs/CORPUS-RESULTS.md、およびdocs/LIBPECONV-COMPARISON.mdを参照してください。
NativePeはDelphi 12 Athensで開発されています。
NativePe.groupprojを開いて、含まれているデモ、テスト、コーパスランナー、プロセスダンプツール、および実世界のテストプロジェクトをビルドします。
メインライブラリのソースはsrcの下にあります。プロジェクトは、Delphiのユニット検索パスにsrcを追加し、必要な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.
Delphiのユニット検索パスにsrcを追加し、PEファイルを唯一の引数としてプログラムを実行します。
リポジトリにはいくつかの実行ファイルとヘルパースクリプトが含まれています。主なエントリポイントはdocs/BINARIES.mdに文書化されています。
重要: NativePeDemo.exeは、指定されたPEファイルをロードして実行します。信頼できるテストファイルでのみ使用してください。コーパスランナーは静的PE処理用に設計されており、PEエントリポイントやTLSコールバックを意図的に実行することはありません。
NativePeは研究およびテストプロジェクトとして活発に使用されています。新しいPEのエッジケースが見つかるにつれて、APIと実装の詳細はまだ変更される可能性があります。
広範なテストはリスクを軽減しますが、完全な正確性の証明ではありません。信頼できないPEファイルは信頼できない入力として扱い、マルウェアを扱う際には適切な分離を使用してください。
NativePeの独自の貢献はMIT Licenseの下でリリースされています。
サードパーティプロジェクトに由来するコードは、THIRD-PARTY-NOTICES.mdに記載されている該当する上流の通知とライセンス条件を保持します。