
Implementazione nativa in Delphi della funzionalità di PE-sieve con una libreria riutilizzabile, CLI e DLL compatibile con PE-sieve per l'integrazione con HollowsHunter.
NativeMirror è un'implementazione indipendente in Object Pascal della funzionalità di PE-sieve, adattata da PE-sieve di hasherezade. Analizza la memoria dei processi, rileva codice modificato o iniettato ed esegue il dump dei file PE.
L'implementazione utilizza API native di Delphi e NativePe come motore PE. Può essere usata direttamente come libreria Delphi, tramite la sua CLI o tramite un'interfaccia DLL compatibile con PE-sieve. Tutte e tre condividono lo stesso core dello scanner. L'obiettivo di compatibilità è il comportamento osservabile esternamente di PE-sieve 0.4.1.5; l'equivalenza comportamentale completa non è stata stabilita.
../NativePe, oppure modificare i percorsi di ricerca di Delphi.NativeMirrorScan.NativeAsm.dproj abilita USE_NATIVEASM. In sua assenza, NativeMirror utilizza il fallback Delphi/LDE. Modificare il percorso di ricerca di NativeASM in base alla propria installazione.py: richiesto per il passaggio post-build della DLL e per i test Python. Gli script utilizzano la libreria standard di Python.Alcune configurazioni di progetto contengono percorsi di dipendenze locali. Verificare i percorsi di ricerca prima di compilare su un'altra macchina.
Aprire NativeMirror.groupproj in Delphi e selezionare il progetto, la piattaforma e la configurazione richiesti.
| Progetto | Output |
|---|---|
tools/NativeMirrorScan/NativeMirrorScan.dproj | NativeMirrorScan.exe |
tools/NativeMirrorDll/pe-sieve.dproj | pe-sieve.dll |
tests/ScannerIntegration/NativeMirrorTestTarget.dproj | Target di test Win64 |
tests/ScannerIntegration/NativeMirrorTestTarget32.dproj | Target di test Win32 |
tests/ScannerIntegration/NativeMirrorScannerTests.dproj | Test runner dello scanner Win64 |
tests/HollowsHunterIntegration/NativeMirrorHollowsHunterTests.dproj | Test runner HollowsHunter Win64 |
Compilare la CLI e la DLL per Win32 e Win64 secondo necessità. Compilare entrambi i target di test prima di eseguire i test di integrazione. Compilare i test runner per Win64.
Gli output vengono generati in bin/<Platform>/<Config>. Gli esempi seguenti utilizzano Debug. Le unit del compilatore vengono generate in dcu/. Mantenere gli eseguibili fuori da tools/.
Eseguire questi comandi dalla radice del progetto. Sostituire 1234 con l'ID del processo da analizzare.
.\bin\Win64\Debug\NativeMirrorScan.exe /help
.\bin\Win64\Debug\NativeMirrorScan.exe /pid 1234
.\bin\Win64\Debug\NativeMirrorScan.exe /pid 1234 /json /quiet /ofilter 2
.\bin\Win64\Debug\NativeMirrorScan.exe /pid 1234 /dir output
/ofilter 2 disabilita l'output del dump. /dir output seleziona la directory di output per i report e i dump. Usa l'eseguibile Win32 in bin/Win32/Debug quando necessario. L'accesso al processo di destinazione dipende dai tuoi permessi di Windows.
Aggiungi src/ e le sue sottodirectory di unit, insieme a NativePe, al percorso di ricerca del tuo progetto. Chiama ScanAndDump con TNativeMirrorOptions. La libreria viene compilata nella tua applicazione; questo utilizzo non richiede né NativeMirrorScan.exe né pe-sieve.dll. Python è necessario solo per la build separata della DLL e per i test Python.
Questo esempio console analizza il PID 1234 e stampa il suo report come JSON:
program ScanExample;
{$APPTYPE CONSOLE}
uses
System.JSON,
NativeMirror.Core.Types,
NativeMirror.Core.Options,
NativeMirror.Core.Engine;
var
Options: TNativeMirrorOptions;
Report: TNativeMirrorReportEx;
Json: TJSONObject;
begin
Options := TNativeMirrorOptions.Default;
Options.Pid := 1234;
Options.Quiet := True;
Options.OutputFilter := nmOutNoDir;
Report := ScanAndDump(Options);
try
Json := Report.ToJson(Options.ResultsFilter, Options.JsonLevel);
try
Writeln(Json.ToJSON);
finally
Json.Free;
end;
finally
Report.Free;
end;
end.
Sostituisci il PID con il tuo target. nmOutNoDir disabilita i file di report e i dump. Ispeziona Report.ErrorReport per gli errori di scansione e Report.ScanReport per i risultati della scansione. Il chiamante è proprietario del report restituito e deve liberarlo.
Scarica pe-sieve32.exe e pe-sieve64.exe dalle release di PE-sieve. Gli script di confronto esistenti utilizzano gli eseguibili v0.4.1.1. Colloca entrambi in bin/Win64/Debug; gli script di test Win64 cercano lì il loro scanner di riferimento. L'eseguibile 32 è il riferimento Win32 originale, anche se è memorizzato insieme agli strumenti di test Win64.
Una configurazione Debug si presenta così:
bin/
Win64/Debug/
NativeMirrorScan.exe
pe-sieve.dll
pe-sieve.dll.exports.json
pe-sieve32.exe
pe-sieve64.exe
NativeMirrorTestTarget.exe
NativeMirrorScannerTests.exe
NativeMirrorHollowsHunterTests.exe
hollows_hunter.exe
Win32/Debug/
NativeMirrorScan.exe
pe-sieve.dll
pe-sieve.dll.exports.json
NativeMirrorTestTarget32.exe
NativeMirror produce la CLI, la DLL, i record di export, i target e i test runner. Gli eseguibili PE-sieve e HollowsHunter sono download separati. HollowsHunter è necessario solo per il suo test di integrazione o per l'uso manuale della DLL.
Scarica hollows_hunter64_dll.zip, v0.4.1.1 dalle release di HollowsHunter. Usa il pacchetto DLL. Con un'architettura host e un contratto API corrispondenti, la pe-sieve.dll finalizzata di NativeMirror sostituisce la DLL PE-sieve originale usata da HollowsHunter. L'eseguibile statico standalone non può utilizzare una DLL sostitutiva. Il test di integrazione fornito copre l'host DLL Win64 v0.4.1.1.
Per un'esecuzione manuale, copia il file hollows_hunter.exe del pacchetto in bin/Win64/Debug, accanto alla pe-sieve.dll compilata da NativeMirror. Non copiare la DLL originale del pacchetto sopra la DLL di NativeMirror. Sia l'host che la DLL devono essere Win64.
.\bin\Win64\Debug\hollows_hunter.exe /pid 1234 /quiet /hooks /ofilter 2 /json /report 7
Per il confronto automatizzato, estrarre l'EXE e la DLL originali non modificati dallo stesso pacchetto in:
tests/HollowsHunterIntegration/fixtures/Win64/pe-sieve-C/
hollows_hunter.exe
pe-sieve.dll
manifest.json
Mantieni il manifest.json esistente. Registra le versioni attese e gli hash SHA-256. Il runner controlla questi file, copia lo stesso host in directory separate di riferimento e NativeMirror, e verifica ciascuna DLL rispetto a processi di test controllati. Non scarica file né sovrascrive la build in bin.
PE-sieve esporta PESieve_version come valore dati a 32 bit. Per la versione 0.4.1.5, quel valore è 0x00040105. Un chiamante si aspetta che l'indirizzo dell'export punti a quei quattro byte, anziché a una funzione che restituisce il numero.
Il compilatore/linker Delphi 12 utilizzato da questo progetto non esporta la variabile direttamente tramite la clausola exports. La DLL contiene quindi il valore di versione contrassegnato ed esporta inizialmente una funzione helper con il nome richiesto.
Dopo il linking, l'evento post-build del progetto esegue: