
Object Pascal (Delphi)-Bibliothek zum Parsen, Mapping, Laden und Dumpen von Windows-PE-Dateien, mit Relocations, Imports, TLS und Lesen von Remote-Prozessspeicher.
NativePe ist eine Windows-Portable-Executable-Bibliothek, geschrieben in Object Pascal für Delphi.
Das Projekt konzentriert sich auf PE-Parsing, Mapping, Laden, Relokation, Import- und Export-Verarbeitung, Dumping, Lesen von Prozessspeicher und verwandte Windows-Interna. Es unterstützt Win32- und Win64-Builds aus demselben Quellbaum.
NativePe ist ein Forschungsprojekt. Es wurde gegen eine große Menge normaler, ungewöhnlicher, fehlerhafter und feindseliger PE-Dateien getestet, erhebt jedoch keinen Anspruch darauf, jede mögliche PE-Datei korrekt zu verarbeiten.
Ein Teil der Motivation ist persönlich. Ich habe Delphi um die frühen 2000er Jahre herum verwendet und wollte die Low-Level-Windows-Entwicklung mit modernem Delphi wieder aufgreifen.
NativePe ist außerdem ein praktisches Experiment, um zu zeigen, dass Object Pascal noch immer für PE- und Windows-Interna-Forschung verwendet werden kann.
Der NativePe-PE-Verarbeitungskern ist ein Object-Pascal-Port/Reimplementierung von libpeconv von hasherezade.
Der Code wurde in Object Pascal neu geschrieben, aber die Kernmodulaufteilung und viele öffentliche Operationen, Validierungspfade, Kontrollflussentscheidungen, Fallback-Regeln, Diagnosen und Tests wurden aus dem libpeconv-Quellcode abgeleitet. NativePe ist daher keine Clean-Room- oder unabhängig entworfene Implementierung der libpeconv-Funktionalität, die es portiert.
Die von der aktuellen Differential-Harness verwendete libpeconv-Revision ist Commit 0fc25f680e03699d33ef3b2034a6724365f3d1a4.
Dank an hasherezade für die Veröffentlichung von libpeconv. Siehe docs/PROVENANCE.md für die Beziehung auf Quellcodeebene und THIRD-PARTY-NOTICES.md für Attributions- und Lizenzhinweise.
NativePe ist mehr als eine Syntaxübersetzung von libpeconv. Das aktuelle Projekt fügt NativePe-spezifische Funktionalität und Delphi/Windows-Integration um den portierten Kern hinzu.
Dazu gehören API-Set-Auflösung, austauschbare WinAPI/NTAPI/Direct-Syscall-Speicheranbieter, Security-Cookie-Initialisierung, PE-Recycling-Helfer und verwandter Integrationscode. Diese Teile haben kein direktes Quellmodul-Gegenstück im gepinnten libpeconv-Kern.
Das Repository enthält außerdem NativePe-spezifische Delphi-Testprojekte, Real-World-Fixtures, Corpus-Tooling und Windows-Integrationstests.
Weitere Details finden sich in docs/FEATURES.md.
NativePe trennt die PE-Logik von ausgewählten Betriebssystem-Speicheroperationen durch TNativePeMemoryProvider.
Die aktuellen integrierten Backends sind:
TWinApiMemoryProviderTNtApiMemoryProviderTSyscallMemoryProvider unter Win64Der bestehende Hook-Pfad behält außerdem seinen optionalen UseSyscalls-Kompatibilitätsschalter für Direct-Syscall-basierten Speicherschutz.
Siehe docs/MEMORY-PROVIDERS.md.
NativePe verwendet mehrere Testebenen:
Der dokumentierte Differential-Lauf vom 25. September 2026 verarbeitete 30.159 identische Corpus-Pfade mit NativePe und der gepinnten libpeconv-Harness. Auf Ergebnis-Ebene stimmten 30.147 Pfade überein und 12 unterschieden sich. NativePe verzeichnete in diesem Lauf keine Worker-Abstürze; die libpeconv-Harness verzeichnete sechs. Diese Ergebnisse beschreiben nur diesen Corpus und diese Harnesses und belegen keine allgemeine Überlegenheit.
Der Lauf war kein Performance-Lauf in Benchmark-Qualität, daher werden seine Timing-Daten nicht für Performance-Aussagen verwendet. Externe Corpora und Malware-Samples werden nicht mit NativePe verteilt.
Siehe docs/TESTING.md, docs/CORPUS-RESULTS.md und docs/LIBPECONV-COMPARISON.md.
NativePe wird mit Delphi 12 Athens entwickelt.
Öffnen Sie NativePe.groupproj, um die enthaltenen Demo-, Test-, Corpus-Runner-, Prozess-Dump-Tool- und Real-World-Testprojekte zu erstellen.
Der Hauptbibliotheksquellcode befindet sich unter src. Projekte können NativePe auch direkt verwenden, indem sie src zum Delphi-Unit-Suchpfad hinzufügen und die erforderlichen NativePe.*-Units referenzieren.
Sowohl Win32 als auch Win64 werden von den enthaltenen Projekten unterstützt.
Das folgende Beispiel mappt ein PE-Image, wendet Relokationen an und löst Importe auf. Es ruft den PE-Einstiegspunkt nicht auf.
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.
Fügen Sie src zum Delphi-Unit-Suchpfad hinzu und führen Sie das Programm mit einer PE-Datei als einzigem Argument aus.
Das Repository enthält mehrere ausführbare Dateien und Hilfsskripte. Die wichtigsten Einstiegspunkte sind in docs/BINARIES.md dokumentiert.
Wichtig: NativePeDemo.exe lädt und führt die übergebene PE-Datei aus. Verwenden Sie es nur mit vertrauenswürdigen Testdateien. Der Corpus-Runner ist für statische PE-Verarbeitung ausgelegt und führt absichtlich keine PE-Einstiegspunkte oder TLS-Callbacks aus.