
Implementación nativa en Delphi de la funcionalidad de PE-sieve con una biblioteca reutilizable, CLI y DLL compatible con PE-sieve para la integración con HollowsHunter.
NativeMirror es una implementación independiente en Object Pascal de la funcionalidad de PE-sieve, adaptada de PE-sieve de hasherezade. Escanea la memoria de procesos, detecta código modificado o inyectado y vuelca archivos PE.
La implementación utiliza APIs nativas de Delphi y NativePe como su motor PE. Puede usarse directamente como una biblioteca Delphi, a través de su CLI, o mediante una interfaz DLL compatible con PE-sieve. Las tres comparten el mismo núcleo del escáner. El objetivo de compatibilidad es el comportamiento observable externamente de PE-sieve 0.4.1.5; no se ha establecido una equivalencia de comportamiento completa.
../NativePe, o ajusta las rutas de búsqueda de Delphi.NativeMirrorScan.NativeAsm.dproj habilita USE_NATIVEASM. Sin él, NativeMirror utiliza el fallback de Delphi/LDE. Ajusta la ruta de búsqueda de NativeASM a tu instalación.py de Windows: requerido para el paso posterior a la compilación de la DLL y para las pruebas de Python. Los scripts utilizan la biblioteca estándar de Python.Algunas configuraciones de proyecto contienen rutas de dependencias locales. Verifica las rutas de búsqueda antes de compilar en otra máquina.
Abre NativeMirror.groupproj en Delphi y selecciona el proyecto, la plataforma y la configuración requeridos.
| Proyecto | Salida |
|---|---|
tools/NativeMirrorScan/NativeMirrorScan.dproj | NativeMirrorScan.exe |
tools/NativeMirrorDll/pe-sieve.dproj | pe-sieve.dll |
tests/ScannerIntegration/NativeMirrorTestTarget.dproj | Objetivo de prueba Win64 |
tests/ScannerIntegration/NativeMirrorTestTarget32.dproj | Objetivo de prueba Win32 |
tests/ScannerIntegration/NativeMirrorScannerTests.dproj | Ejecutor de pruebas del escáner Win64 |
tests/HollowsHunterIntegration/NativeMirrorHollowsHunterTests.dproj | Ejecutor de pruebas de HollowsHunter Win64 |
Compila la CLI y la DLL para Win32 y Win64 según sea necesario. Compila ambos objetivos de prueba antes de ejecutar las pruebas de integración. Compila los ejecutores de pruebas para Win64.
Las salidas van a bin/<Platform>/<Config>. Los ejemplos a continuación usan Debug. Las unidades del compilador van a dcu/. Mantén los ejecutables fuera de tools/.
Ejecuta estos comandos desde la raíz del proyecto. Reemplaza 1234 con el ID del proceso a escanear.
.\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 desactiva la salida de volcado. /dir output selecciona el directorio de salida para informes y volcados. Utilice el ejecutable Win32 en bin/Win32/Debug cuando sea necesario. El acceso al proceso objetivo depende de sus permisos de Windows.
Añada src/ y sus subdirectorios de unidades, junto con NativePe, a la ruta de búsqueda de su proyecto. Llame a ScanAndDump con TNativeMirrorOptions. La biblioteca se compila en su aplicación; este uso no requiere ni NativeMirrorScan.exe ni pe-sieve.dll. Python solo es necesario para la compilación separada de la DLL y las pruebas de Python.
Este ejemplo de consola escanea el PID 1234 e imprime su informe como 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.
Sustituya el PID por su objetivo. nmOutNoDir desactiva los archivos de informe y los volcados. Inspeccione Report.ErrorReport para los errores de escaneo y Report.ScanReport para los resultados del escaneo. El llamador es propietario del informe devuelto y debe liberarlo.
Descargue pe-sieve32.exe y pe-sieve64.exe desde las versiones de PE-sieve. Los scripts de comparación existentes utilizan los ejecutables de la v0.4.1.1. Coloque ambos en bin/Win64/Debug; los scripts de prueba de Win64 buscan allí su escáner de referencia. El ejecutable 32 es la referencia original de Win32, aunque se almacena junto a las herramientas de prueba de Win64.
Una configuración de Debug tiene este aspecto:
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, los registros de exportación, los targets y los ejecutores de pruebas. Los ejecutables de PE-sieve y HollowsHunter son descargas separadas. HollowsHunter solo es necesario para su prueba de integración o para el uso manual de la DLL.
Descarga hollows_hunter64_dll.zip, v0.4.1.1 desde las versiones de HollowsHunter. Usa el paquete de la DLL. Con una arquitectura de host y un contrato de API coincidentes, el pe-sieve.dll finalizado de NativeMirror reemplaza la DLL original de PE-sieve utilizada por HollowsHunter. El ejecutable estático independiente no puede usar una DLL de reemplazo. La prueba de integración incluida cubre el host de la DLL Win64 v0.4.1.1.
Para una ejecución manual, copia el hollows_hunter.exe del paquete en bin/Win64/Debug, junto al pe-sieve.dll compilado por NativeMirror. No copies la DLL original del paquete sobre la DLL de NativeMirror. Tanto el host como la DLL deben ser Win64.
.\bin\Win64\Debug\hollows_hunter.exe /pid 1234 /quiet /hooks /ofilter 2 /json /report 7
Para la comparación automatizada, extraiga el EXE y la DLL originales sin cambios del mismo paquete en:
tests/HollowsHunterIntegration/fixtures/Win64/pe-sieve-C/
hollows_hunter.exe
pe-sieve.dll
manifest.json
Mantén el manifest.json existente. Registra las versiones esperadas y los hashes SHA-256. El runner verifica estos archivos, copia el mismo host en directorios separados de referencia y NativeMirror, y prueba cada DLL contra procesos de prueba controlados. No descarga archivos ni sobrescribe la compilación en bin.
PE-sieve exporta PESieve_version como un valor de datos de 32 bits. Para la versión 0.4.1.5, ese valor es 0x00040105. Un llamador espera que la dirección de exportación apunte a esos cuatro bytes, en lugar de a una función que devuelva el número.