Это полный PE32+ писатель и эмиттер машинного кода, реализованный на чистом ассемблере x64 MASM без зависимостей и без использования CRT. Он генерирует исполняемые Windows-файлы с нуля.
PE-писатель следует подходу бэкенд-дизайна, предоставляя чистый API для:
* Создания контекстов PE-исполняемых файлов
* Добавления импортов с правильными структурами IAT/INT
* Эмиссии машинного кода с управлением секциями
* Записи полных PE-файлов со всеми необходимыми заголовками
* **IMAGE_DOS_HEADER** : Стандартный DOS-заголовок с указателем e_lfanew
* **IMAGE_NT_HEADERS64** : NT-заголовки с файловым заголовком и дополнительным заголовком
* **IMAGE_SECTION_HEADER** : Заголовки секций для .text, .rdata, .idata
* **IMAGE_IMPORT_DESCRIPTOR** : Дескрипторы таблицы импорта
* **PE_CONTEXT** : Внутренняя структура контекста для создания PE-файлов
* **Вход** : RCX = базовый адрес образа (0 = по умолчанию), RDX = RVA точки входа
* **Выход** : RAX = дескриптор контекста PE (0 = ошибка)
* **Назначение** : Выделяет и инициализирует полную структуру контекста PE
* Выделяет память для DOS-заголовка, NT-заголовков, заголовков секций
* Инициализирует DOS-заголовок с правильной сигнатурой и e_lfanew
* Настраивает NT-заголовки с типом машины AMD64 и магией PE32+
* Настраивает дополнительный заголовок с базовым адресом образа, выравниванием секций/файлов
* Устанавливает виртуальные адреса и смещения файлов по умолчанию
* **Вход** : RCX = контекст PE, RDX = имя DLL, R8 = имя функции
* **Назначение** : Создает таблицу импорта с правильными структурами IAT/INT
* Управляет дескрипторами импорта для нескольких DLL
* Создает записи таблицы поиска импорта (INT)
* Настраивает записи таблицы адресов импорта (IAT)
* Обрабатывает структуры импорта по имени
* Отслеживает количество импортов и проверяет ограничения
* **Вход** : RCX = контекст PE, RDX = буфер кода, R8 = размер кода
* **Выход** : RAX = RVA кода (0 = ошибка)
* **Назначение** : Обрабатывает эмиссию машинного кода с правильным управлением секциями
* Копирует машинный код во внутренний буфер
* Проверяет размер кода на соответствие максимальным ограничениям
* **Вход** : RCX = контекст PE, RDX = имя файла
* **Назначение** : Полная запись файла со всеми заголовками, секциями и таблицей импорта
* Создает выходной файл с помощью соответствующих вызовов Win32 API
* Записывает DOS-заголовок и DOS-заглушку
* Вычисляет и обновляет финальные значения NT-заголовка
* Записывает заголовки секций для .text, .rdata, .idata
* Реализует правильное заполнение и выравнивание файла
* Записывает данные секций с таблицей импорта
* Обрабатывает все вычисления RVA и смещения файлов
* **GetProcessHeap()** : Получает кучу текущего процесса
* **HeapAlloc()** : Выделяет память, инициализированную нулями
* **HeapFree()** : Освобождает выделенную память при очистке
Все выделения памяти включают правильную обработку ошибок и очистку.
0x1000: .text section (SECTION_ALIGNMENT)
* **Базовый адрес образа** : 0x140000000 (по умолчанию для x64)
* **Выравнивание секций** : 0x1000 (4 КБ)
* **Выравнивание файла** : 0x200 (512 байт)
* **Подсистема** : Консольное приложение (IMAGE_SUBSYSTEM_WINDOWS_CUI)
1. Убедитесь, что MASM64 и Windows SDK установлены
2. Запустите `build.bat` для компиляции PE-писателя и примера
3. Выполните `PE_Writer_Example.exe` для генерации `hello.exe`
4. Протестируйте сгенерированный исполняемый файл
Все функции возвращают 0 при ошибке и ненулевое значение при успехе. Реализация включает:
* Максимальный размер кода 64 КБ (MAX_CODE_SIZE)
* Три фиксированные секции (.text, .rdata, .idata)
Реализация предоставляет прочную основу для:
* Чистый ассемблер x64 MASM - без зависимостей CRT
* Использует кучу Windows для управления памятью
* Совместим с Windows Vista и более поздними версиями
* Нулевые зависимости от внешних библиотек, кроме kernel32.dll
Эта реализация предоставляет полный, готовый к использованию PE32+ писатель, подходящий для бэкендов генерации кода, пользовательских компиляторов и упаковщиков исполняемых файлов.
The full story
This article is one source in a clustered incident — the cluster page carries the summary, timeline and every other outlet covering it.
