
Нативная реализация функциональности PE-sieve на Delphi с переиспользуемой библиотекой, CLI и DLL, совместимой с PE-sieve, для интеграции с HollowsHunter.
NativeMirror — это независимая реализация функциональности PE-sieve на Object Pascal, адаптированная из PE-sieve от hasherezade. Она сканирует память процесса, обнаруживает модифицированный или внедрённый код и выполняет дамп PE-файлов.
Реализация использует нативные API Delphi и NativePe в качестве PE-движка. Её можно использовать напрямую как библиотеку Delphi, через CLI или через DLL-интерфейс, совместимый с PE-sieve. Все три варианта используют одно и то же ядро сканера. Цель совместимости — внешне наблюдаемое поведение PE-sieve 0.4.1.5; полная поведенческая эквивалентность не установлена.
../NativePe или скорректируйте пути поиска Delphi.NativeMirrorScan.NativeAsm.dproj включает USE_NATIVEASM. Без него NativeMirror использует резервный вариант Delphi/LDE. Скорректируйте путь поиска NativeASM в соответствии с вашей установкой.py: требуется для пост-сборочного шага DLL и тестов Python. Скрипты используют стандартную библиотеку Python.Некоторые конфигурации проектов содержат локальные пути зависимостей. Проверьте пути поиска перед сборкой на другой машине.
Откройте NativeMirror.groupproj в Delphi и выберите нужный проект, платформу и конфигурацию.
| Проект | Выходной файл |
|---|---|
tools/NativeMirrorScan/NativeMirrorScan.dproj | NativeMirrorScan.exe |
tools/NativeMirrorDll/pe-sieve.dproj | pe-sieve.dll |
tests/ScannerIntegration/NativeMirrorTestTarget.dproj | Тестовая цель Win64 |
tests/ScannerIntegration/NativeMirrorTestTarget32.dproj | Тестовая цель Win32 |
tests/ScannerIntegration/NativeMirrorScannerTests.dproj | Тестовый раннер сканера Win64 |
tests/HollowsHunterIntegration/NativeMirrorHollowsHunterTests.dproj | Тестовый раннер HollowsHunter Win64 |
Соберите CLI и DLL для Win32 и Win64 по мере необходимости. Соберите обе тестовые цели перед запуском интеграционных тестов. Соберите тестовые раннеры для Win64.
Выходные файлы размещаются в bin/<Platform>/<Config>. В примерах ниже используется Debug. Модули компилятора размещаются в dcu/. Не размещайте исполняемые файлы в tools/.
Выполняйте эти команды из корня проекта. Замените 1234 на идентификатор процесса для сканирования.
.\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 отключает вывод дампа. /dir output выбирает выходной каталог для отчётов и дампов. При необходимости используйте исполняемый файл Win32 в bin/Win32/Debug. Доступ к целевому процессу зависит от ваших разрешений Windows.
Добавьте src/ и его подкаталоги модулей вместе с NativePe в путь поиска вашего проекта. Вызовите ScanAndDump с TNativeMirrorOptions. Библиотека компилируется в ваше приложение; это использование не требует ни NativeMirrorScan.exe, ни pe-sieve.dll. Python нужен только для отдельной сборки DLL и тестов на Python.
Этот консольный пример сканирует PID 1234 и выводит свой отчёт в формате 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.
Замените PID на целевой. nmOutNoDir отключает файлы отчётов и дампы. Проверяйте Report.ErrorReport на ошибки сканирования, а Report.ScanReport — на результаты сканирования. Возвращённый отчёт принадлежит вызывающей стороне, и она должна освободить его.
Скачайте pe-sieve32.exe и pe-sieve64.exe из релизов PE-sieve. Существующие скрипты сравнения используют исполняемые файлы v0.4.1.1. Поместите оба в bin/Win64/Debug; тестовые скрипты Win64 ищут там свой эталонный сканер. Исполняемый файл 32 — это оригинальный эталон Win32, хотя он хранится вместе с тестовыми инструментами Win64.
Конфигурация Debug выглядит так:
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 создаёт CLI, DLL, записи экспорта, цели и средства запуска тестов. Исполняемые файлы PE-sieve и HollowsHunter загружаются отдельно. HollowsHunter нужен только для его интеграционного теста или ручного использования DLL.
Загрузите hollows_hunter64_dll.zip, v0.4.1.1 со страницы релизов HollowsHunter. Используйте пакет DLL. При совпадающей архитектуре хоста и контракте API финальный pe-sieve.dll от NativeMirror заменяет оригинальную DLL PE-sieve, используемую HollowsHunter. Автономный статический исполняемый файл не может использовать заменяющую DLL. Прилагаемый интеграционный тест охватывает хост Win64 DLL v0.4.1.1.
Для ручного запуска скопируйте hollows_hunter.exe из пакета в bin/Win64/Debug, рядом с pe-sieve.dll, собранной NativeMirror. Не копируйте оригинальную DLL из пакета поверх DLL NativeMirror. И хост, и DLL должны быть Win64.
.\bin\Win64\Debug\hollows_hunter.exe /pid 1234 /quiet /hooks /ofilter 2 /json /report 7
Для автоматического сравнения извлеките неизменённые оригинальные EXE и DLL из того же пакета в:
tests/HollowsHunterIntegration/fixtures/Win64/pe-sieve-C/
hollows_hunter.exe
pe-sieve.dll
manifest.json
Оставьте существующий manifest.json. В нём записаны ожидаемые версии и хэши SHA-256. Средство запуска проверяет эти файлы, копирует один и тот же хост в отдельные каталоги reference и NativeMirror и тестирует каждую DLL на контролируемых тестовых процессах. Оно не скачивает файлы и не перезаписывает сборку в bin.
PE-sieve экспортирует PESieve_version как 32-битное значение данных. Для версии 0.4.1.5 это значение равно 0x00040105. Вызывающая сторона ожидает, что адрес экспорта указывает на эти четыре байта, а не на функцию, возвращающую это число.
Компилятор/компоновщик Delphi 12, используемый в этом проекте, не экспортирует переменную напрямую через предложение exports. Поэтому DLL содержит помеченное значение версии и изначально экспортирует вспомогательную функцию под требуемым именем.
После компоновки событие после сборки проекта запускает:
py tools/NativeMirrorDll/finalize_exports.py bin/Win64/Debug/pe-sieve.dll