
Библиотека Object Pascal (Delphi) для парсинга, отображения, загрузки и дампа файлов Windows PE, с релокациями, импортами, TLS и чтением памяти удалённых процессов.
NativePe — это библиотека для работы с Windows Portable Executable, написанная на Object Pascal для Delphi.
Проект сосредоточен на разборе PE, отображении, загрузке, перемещении, обработке импорта и экспорта, дампинге, чтении памяти процессов и связанных внутренних механизмах Windows. Он поддерживает сборки Win32 и Win64 из одного дерева исходников.
NativePe — это исследовательский проект. Он был протестирован на большом наборе обычных, необычных, повреждённых и враждебных PE-файлов, но не претендует на корректную обработку всех возможных PE-файлов.
Часть мотивации личная. Я использовал Delphi примерно в начале 2000-х и хотел вернуться к низкоуровневой разработке под Windows с современным Delphi.
NativePe также является практическим экспериментом, показывающим, что Object Pascal всё ещё можно использовать для исследований PE и внутренних механизмов Windows.
Ядро обработки PE в NativePe — это порт/реализация на Object Pascal проекта libpeconv от hasherezade.
Код был переписан на Object Pascal, но разделение на основные модули и многие публичные операции, пути валидации, решения по управляющему потоку, правила отката, диагностика и тесты были производными от исходного кода libpeconv. Таким образом, NativePe не является реализацией функциональности libpeconv, портированной из неё, созданной в условиях «чистой комнаты» или независимого проектирования.
Ревизия libpeconv, используемая текущим дифференциальным стендом, — коммит 0fc25f680e03699d33ef3b2034a6724365f3d1a4.
Спасибо hasherezade за публикацию libpeconv. См. docs/PROVENANCE.md для описания связи на уровне исходного кода и THIRD-PARTY-NOTICES.md для атрибуции и уведомлений о лицензиях.
NativePe — это больше, чем синтаксический перевод libpeconv. Текущий проект добавляет функциональность, специфичную для NativePe, и интеграцию с Delphi/Windows вокруг портированного ядра.
Это включает разрешение API Set, подключаемые провайдеры памяти WinAPI/NTAPI/прямых системных вызовов, инициализацию security-cookie, вспомогательные средства переработки PE и связанный интеграционный код. У этих частей нет прямого аналога на уровне исходных модулей в зафиксированном ядре libpeconv.
Репозиторий также содержит специфичные для NativePe тестовые проекты Delphi, реальные фикстуры, инструментарий для корпуса и интеграционные тесты Windows.
Более подробно в docs/FEATURES.md.
NativePe отделяет логику PE от выбранных операций с памятью операционной системы через TNativePeMemoryProvider.
Текущие встроенные бэкенды:
TWinApiMemoryProviderTNtApiMemoryProviderTSyscallMemoryProvider на Win64Существующий путь хуков также сохраняет свой опциональный переключатель совместимости UseSyscalls для защиты памяти на основе прямых системных вызовов.
NativePe использует несколько уровней тестирования:
Задокументированный дифференциальный запуск от 25 сентября 2026 года обработал 30 159 идентичных путей корпуса с помощью NativePe и зафиксированного стенда libpeconv. На уровне результатов 30 147 путей совпали и 12 различались. NativePe не зафиксировал ни одного сбоя воркеров в этом запуске; стенд libpeconv зафиксировал шесть. Эти результаты описывают только данный корпус и данные стенды и не устанавливают общего превосходства.
Запуск не был тестом производительности бенчмарк-качества, поэтому его данные о времени не используются для заявлений о производительности. Внешние корпуса и образцы вредоносного ПО не распространяются вместе с NativePe.
См. docs/TESTING.md, docs/CORPUS-RESULTS.md и docs/LIBPECONV-COMPARISON.md.
NativePe разрабатывается с Delphi 12 Athens.
Откройте NativePe.groupproj, чтобы собрать включённые демо, тесты, запуск корпуса, инструмент дампинга процессов и проекты тестов на реальных данных.
Основной исходный код библиотеки находится в src. Проекты также могут использовать NativePe напрямую, добавив src в путь поиска модулей Delphi и ссылаясь на необходимые модули NativePe.*.
Включённые проекты поддерживают как Win32, так и Win64.
Следующий пример отображает образ PE, применяет перемещения и разрешает импорты. Он не вызывает точку входа 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.
Добавьте src в путь поиска модулей Delphi и запустите программу с PE-файлом в качестве единственного аргумента.
Репозиторий содержит несколько исполняемых файлов и вспомогательных скриптов. Основные точки входа описаны в docs/BINARIES.md.
Важно: NativePeDemo.exe загружает и выполняет переданный PE-файл. Используйте его только с доверенными тестовыми файлами. Запуск корпуса предназначен для статической обработки PE и намеренно не выполняет точки входа PE или TLS-колбэки.