
Native Delphi-Implementierung der PE-sieve-Funktionalität mit einer wiederverwendbaren Bibliothek, CLI und einer PE-sieve-kompatiblen DLL für die HollowsHunter-Integration.
NativeMirror ist eine unabhängige Object-Pascal-Implementierung der PE-sieve-Funktionalität, angepasst von PE-sieve von hasherezade. Es scannt den Prozessspeicher, erkennt modifizierten oder injizierten Code und dumpt PE-Dateien.
Die Implementierung verwendet Delphi-native APIs und NativePe als PE-Engine. Sie kann direkt als Delphi-Bibliothek, über ihre CLI oder über eine PE-sieve-kompatible DLL-Schnittstelle verwendet werden. Alle drei teilen denselben Scanner-Kern. Das Kompatibilitätsziel ist das von außen beobachtbare Verhalten von PE-sieve 0.4.1.5; vollständige Verhaltensgleichheit wurde nicht nachgewiesen.
../NativePe oder passen Sie die Delphi-Suchpfade an.NativeMirrorScan.NativeAsm.dproj aktiviert USE_NATIVEASM. Ohne dieses verwendet NativeMirror den Delphi/LDE-Fallback. Passen Sie den NativeASM-Suchpfad an Ihre Installation an.py-Launcher: erforderlich für den DLL-Post-Build-Schritt und die Python-Tests. Die Skripte verwenden die Python-Standardbibliothek.Einige Projektkonfigurationen enthalten lokale Abhängigkeitspfade. Überprüfen Sie die Suchpfade, bevor Sie auf einem anderen Rechner erstellen.
Öffnen Sie NativeMirror.groupproj in Delphi und wählen Sie das erforderliche Projekt, die Plattform und die Konfiguration aus.
| Projekt | Ausgabe |
|---|---|
tools/NativeMirrorScan/NativeMirrorScan.dproj | NativeMirrorScan.exe |
tools/NativeMirrorDll/pe-sieve.dproj | pe-sieve.dll |
tests/ScannerIntegration/NativeMirrorTestTarget.dproj | Win64-Testziel |
tests/ScannerIntegration/NativeMirrorTestTarget32.dproj | Win32-Testziel |
tests/ScannerIntegration/NativeMirrorScannerTests.dproj | Win64-Scanner-Test-Runner |
tests/HollowsHunterIntegration/NativeMirrorHollowsHunterTests.dproj | Win64-HollowsHunter-Test-Runner |
Erstellen Sie die CLI und die DLL für Win32 und Win64 nach Bedarf. Erstellen Sie beide Testziele, bevor Sie Integrationstests ausführen. Erstellen Sie die Test-Runner für Win64.
Die Ausgaben landen in bin/<Platform>/<Config>. Die folgenden Beispiele verwenden Debug. Compiler-Units landen in dcu/. Halten Sie ausführbare Dateien aus tools/ heraus.
Führen Sie diese Befehle aus dem Projektstammverzeichnis aus. Ersetzen Sie 1234 durch die Prozess-ID, die gescannt werden soll.
.\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 deaktiviert die Dump-Ausgabe. /dir output wählt das Ausgabeverzeichnis für Berichte und Dumps. Verwenden Sie bei Bedarf die Win32-Executable unter bin/Win32/Debug. Der Zugriff auf den Zielprozess hängt von Ihren Windows-Berechtigungen ab.
Fügen Sie src/ und seine Unit-Unterverzeichnisse zusammen mit NativePe zum Suchpfad Ihres Projekts hinzu. Rufen Sie ScanAndDump mit TNativeMirrorOptions auf. Die Bibliothek wird in Ihre Anwendung kompiliert; diese Verwendung erfordert weder NativeMirrorScan.exe noch pe-sieve.dll. Python wird nur für den separaten DLL-Build und die Python-Tests benötigt.
Dieses Konsolenbeispiel scannt PID 1234 und gibt seinen Bericht als JSON aus:
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.
Ersetze die PID durch dein Ziel. nmOutNoDir deaktiviert Berichtsdateien und Dumps. Prüfe Report.ErrorReport auf Scanfehler und Report.ScanReport auf Scanergebnisse. Der Aufrufer besitzt den zurückgegebenen Bericht und muss ihn freigeben.
Lade pe-sieve32.exe und pe-sieve64.exe von den PE-sieve releases herunter. Die vorhandenen Vergleichsskripte verwenden die ausführbaren Dateien der Version v0.4.1.1. Platziere beide in bin/Win64/Debug; die Win64-Testskripte suchen dort nach ihrem Referenzscanner. Die ausführbare Datei 32 ist die ursprüngliche Win32-Referenz, obwohl sie zusammen mit den Win64-Testwerkzeugen gespeichert wird.
Ein Debug-Setup sieht so aus:
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 erzeugt die CLI, DLL, Exportdatensätze, Targets und Test-Runner. Die ausführbaren Dateien von PE-sieve und HollowsHunter sind separate Downloads. HollowsHunter wird nur für seinen Integrationstest oder die manuelle DLL-Nutzung benötigt.
Laden Sie hollows_hunter64_dll.zip, v0.4.1.1 von den HollowsHunter-Releases herunter. Verwenden Sie das DLL-Paket. Bei passender Host-Architektur und passendem API-Vertrag ersetzt die von NativeMirror erzeugte pe-sieve.dll die ursprüngliche PE-sieve-DLL, die von HollowsHunter verwendet wird. Die eigenständige statische ausführbare Datei kann keine Ersatz-DLL verwenden. Der mitgelieferte Integrationstest deckt den Win64-DLL-Host v0.4.1.1 ab.
Für einen manuellen Lauf kopieren Sie die hollows_hunter.exe aus dem Paket nach bin/Win64/Debug, neben die von NativeMirror erzeugte pe-sieve.dll. Kopieren Sie nicht die ursprüngliche DLL aus dem Paket über die NativeMirror-DLL. Sowohl der Host als auch die DLL müssen Win64 sein.
.\bin\Win64\Debug\hollows_hunter.exe /pid 1234 /quiet /hooks /ofilter 2 /json /report 7
Für den automatisierten Vergleich extrahieren Sie die unveränderte Original-EXE und -DLL aus demselben Paket nach:
tests/HollowsHunterIntegration/fixtures/Win64/pe-sieve-C/
hollows_hunter.exe
pe-sieve.dll
manifest.json
Behalte die vorhandene manifest.json bei. Sie zeichnet die erwarteten Versionen und SHA-256-Hashes auf. Der Runner prüft diese Dateien, kopiert denselben Host in separate Referenz- und NativeMirror-Verzeichnisse und testet jede DLL gegen kontrollierte Testprozesse. Er lädt keine Dateien herunter und überschreibt nicht den Build in bin.
PE-sieve exportiert PESieve_version als 32-Bit-Datenwert. Für Version 0.4.1.5 ist dieser Wert 0x00040105. Ein Aufrufer erwartet, dass die Exportadresse auf diese vier Bytes zeigt und nicht auf eine Funktion, die die Zahl zurückgibt.