
Bibliothèque Object Pascal (Delphi) pour l'analyse, le mapping, le chargement et le dumping de fichiers PE Windows, avec relocations, imports, TLS et lecture de la mémoire des processus distants.
NativePe est une bibliothèque Windows Portable Executable écrite en Object Pascal pour Delphi.
Le projet se concentre sur l'analyse PE, le mapping, le chargement, la relocalisation, la gestion des imports et exports, le dumping, la lecture de mémoire de processus et les mécanismes internes Windows associés. Il prend en charge les builds Win32 et Win64 à partir de la même arborescence source.
NativePe est un projet de recherche. Il a été testé contre un large ensemble de fichiers PE normaux, inhabituels, malformés et hostiles, mais il ne prétend pas gérer correctement tous les fichiers PE possibles.
Une partie de la motivation est personnelle. J'ai utilisé Delphi vers le début des années 2000 et je souhaitais revisiter le développement Windows de bas niveau avec Delphi moderne.
NativePe est également une expérience pratique visant à montrer qu'Object Pascal peut encore être utilisé pour la recherche sur les PE et les mécanismes internes Windows.
Le cœur de traitement PE de NativePe est un portage/réimplémentation en Object Pascal de libpeconv par hasherezade.
Le code a été réécrit en Object Pascal, mais la découpe des modules principaux et de nombreuses opérations publiques, chemins de validation, décisions de flux de contrôle, règles de repli, diagnostics et tests ont été dérivés du code source de libpeconv. NativePe n'est donc pas une implémentation clean-room ou conçue indépendamment de la fonctionnalité libpeconv qu'il porte.
La révision de libpeconv utilisée par le harnais différentiel actuel est le commit 0fc25f680e03699d33ef3b2034a6724365f3d1a4.
Merci à hasherezade pour la publication de libpeconv. Voir docs/PROVENANCE.md pour la relation au niveau source et THIRD-PARTY-NOTICES.md pour les attributions et mentions de licence.
NativePe est plus qu'une traduction syntaxique de libpeconv. Le projet actuel ajoute des fonctionnalités spécifiques à NativePe et une intégration Delphi/Windows autour du cœur porté.
Cela inclut la résolution des API Set, des fournisseurs de mémoire WinAPI/NTAPI/appel système direct enfichables, l'initialisation du security cookie, des helpers de recyclage de PE et du code d'intégration associé. Ces parties n'ont pas de contrepartie directe en module source dans le cœur libpeconv épinglé.
Le dépôt contient également des projets de test Delphi spécifiques à NativePe, des fixtures réelles, des outils de corpus et des tests d'intégration Windows.
Plus de détails dans docs/FEATURES.md.
NativePe sépare la logique PE des opérations mémoire du système d'exploitation sélectionné via TNativePeMemoryProvider.
Les backends intégrés actuels sont :
TWinApiMemoryProviderTNtApiMemoryProviderTSyscallMemoryProvider sur Win64Le chemin de hook existant conserve également son commutateur de compatibilité optionnel UseSyscalls pour la protection mémoire basée sur les appels système directs.
Voir docs/MEMORY-PROVIDERS.md.
NativePe utilise plusieurs couches de tests :
L'exécution différentielle documentée du 25 septembre 2026 a traité 30 159 chemins de corpus identiques avec NativePe et le harnais libpeconv épinglé. Au niveau des résultats, 30 147 chemins correspondaient et 12 différaient. NativePe n'a enregistré aucun crash de worker lors de cette exécution ; le harnais libpeconv en a enregistré six. Ces résultats ne décrivent que ce corpus et ces harnais et n'établissent pas de supériorité générale.
L'exécution n'était pas une exécution de performance de qualité benchmark, donc ses données de timing ne sont pas utilisées pour des affirmations de performance. Les corpus externes et les échantillons de malware ne sont pas distribués avec NativePe.
Voir docs/TESTING.md, docs/CORPUS-RESULTS.md et docs/LIBPECONV-COMPARISON.md.
NativePe est développé avec Delphi 12 Athens.
Ouvrez NativePe.groupproj pour compiler la démo incluse, les tests, l'exécuteur de corpus, l'outil de dump de processus et les projets de test réels.
Le code source de la bibliothèque principale se trouve sous src. Les projets peuvent également utiliser NativePe directement en ajoutant src au chemin de recherche des unités Delphi et en référençant les unités NativePe.* requises.
Win32 et Win64 sont tous deux pris en charge par les projets inclus.
L'exemple suivant mappe une image PE, applique les relocalisations et résout les imports. Il n'appelle pas le point d'entrée du 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.
Ajoutez src au chemin de recherche des unités Delphi et exécutez le programme avec un fichier PE comme unique argument.
Le dépôt contient plusieurs exécutables et scripts auxiliaires. Les principaux points d'entrée sont documentés dans docs/BINARIES.md.
Important : NativePeDemo.exe charge et exécute le fichier PE fourni. Utilisez-le uniquement avec des fichiers de test de confiance. L'exécuteur de corpus est conçu pour le traitement statique de PE et n'exécute pas intentionnellement les points d'entrée PE ni les callbacks TLS.