
Libreria Object Pascal (Delphi) per il parsing, la mappatura, il caricamento e il dump di file PE di Windows, con rilocazioni, importazioni, TLS e lettura della memoria dei processi remoti.
NativePe è una libreria per Windows Portable Executable scritta in Object Pascal per Delphi.
Il progetto si concentra sul parsing, la mappatura, il caricamento, la rilocazione, la gestione delle importazioni ed esportazioni, il dumping, la lettura della memoria dei processi e le relative funzionalità interne di Windows. Supporta build Win32 e Win64 dallo stesso albero dei sorgenti.
NativePe è un progetto di ricerca. È stato testato con un ampio insieme di file PE normali, insoliti, malformati e ostili, ma non pretende di gestire correttamente ogni possibile file PE.
Parte della motivazione è personale. Ho usato Delphi intorno ai primi anni 2000 e volevo rivisitare lo sviluppo Windows di basso livello con Delphi moderno.
NativePe è anche un esperimento pratico per dimostrare che Object Pascal può ancora essere utilizzato per la ricerca su PE e sulle funzionalità interne di Windows.
Il core di elaborazione PE di NativePe è un port/reimplementazione in Object Pascal di libpeconv di hasherezade.
Il codice è stato riscritto in Object Pascal, ma la suddivisione dei moduli principali e molte operazioni pubbliche, percorsi di validazione, decisioni di flusso di controllo, regole di fallback, diagnostica e test sono stati derivati dal sorgente di libpeconv. NativePe non è quindi un'implementazione clean-room o progettata in modo indipendente della funzionalità di libpeconv che porta.
La revisione di libpeconv utilizzata dall'attuale harness differenziale è il commit 0fc25f680e03699d33ef3b2034a6724365f3d1a4.
Grazie a hasherezade per aver pubblicato libpeconv. Vedi docs/PROVENANCE.md per la relazione a livello di sorgente e THIRD-PARTY-NOTICES.md per le attribuzioni e le note di licenza.
NativePe è più di una traduzione sintattica di libpeconv. Il progetto attuale aggiunge funzionalità specifiche di NativePe e integrazione con Delphi/Windows attorno al core portato.
Questo include la risoluzione di API Set, provider di memoria WinAPI/NTAPI/direct-syscall pluggable, inizializzazione del security cookie, helper per il riciclo dei PE e codice di integrazione correlato. Queste parti non hanno un corrispettivo diretto a livello di modulo sorgente nel core di libpeconv fissato.
Il repository contiene anche progetti di test Delphi specifici di NativePe, fixture reali, strumenti per il corpus e test di integrazione Windows.
Maggiori dettagli sono in docs/FEATURES.md.
NativePe separa la logica PE dalle operazioni di memoria del sistema operativo selezionate tramite TNativePeMemoryProvider.
I backend integrati attuali sono:
TWinApiMemoryProviderTNtApiMemoryProviderTSyscallMemoryProvider su Win64Il percorso di hook esistente mantiene anche il suo switch di compatibilità opzionale UseSyscalls per la protezione della memoria basata su direct syscall.
Vedi docs/MEMORY-PROVIDERS.md.
NativePe utilizza diversi livelli di test:
La run differenziale documentata del 25 settembre 2026 ha elaborato 30.159 percorsi di corpus identici con NativePe e l'harness di libpeconv fissato. A livello di esito, 30.147 percorsi corrispondevano e 12 differivano. NativePe non ha registrato crash dei worker in quella run; l'harness di libpeconv ne ha registrati sei. Questi risultati descrivono solo questo corpus e questi harness e non stabiliscono una superiorità generale.
La run non era una run prestazionale di qualità benchmark, quindi i suoi dati di timing non vengono utilizzati per affermazioni sulle prestazioni. Corpus esterni e campioni di malware non sono distribuiti con NativePe.
Vedi docs/TESTING.md, docs/CORPUS-RESULTS.md e docs/LIBPECONV-COMPARISON.md.
NativePe è sviluppato con Delphi 12 Athens.
Apri NativePe.groupproj per compilare la demo inclusa, i test, il runner di corpus, lo strumento di dump dei processi e i progetti di test reali.
Il sorgente principale della libreria è sotto src. I progetti possono anche utilizzare NativePe direttamente aggiungendo src al percorso di ricerca delle unit di Delphi e referenziando le unit NativePe.* richieste.
Sia Win32 che Win64 sono supportati dai progetti inclusi.
L'esempio seguente mappa un'immagine PE, applica le rilocazioni e risolve le importazioni. Non chiama il punto di ingresso del 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.
Aggiungi src al percorso di ricerca delle unit di Delphi ed esegui il programma con un file PE come unico argomento.
Il repository contiene diversi eseguibili e script di supporto. I punti di ingresso principali sono documentati in docs/BINARIES.md.
Importante: NativePeDemo.exe carica ed esegue il file PE fornito. Usalo solo con file di test attendibili. Il runner di corpus è progettato per l'elaborazione statica dei PE e non esegue intenzionalmente punti di ingresso PE o callback TLS.