Открыть сервис

Portable Executable

Portable Executable (PE) — это формат исполняемых файлов, объектных файлов и динамических библиотек, используемый в операционных системах семейства Windows (начиная с Windows 95 и Windows NT 3.1). Он представляет собой структуру данных, которая содержит всю информацию, необходимую загрузчику операционной системы для управления кодом, данными и ресурсами исполняемого процесса. PE является развитием формата COFF (Common Object File Format), используемого в Unix-подобных системах, и был разработан компанией Microsoft для обеспечения переносимости (portability) между различными версиями Windows и архитектурами процессоров (x86, x64, ARM, IA-64).

История и происхождение

Формат Portable Executable был введён в 1993 году с выходом Windows NT 3.1. Его создание было частью усилий Microsoft по унификации форматов исполняемых файлов для всех будущих версий Windows, в отличие от более ранних 16-битных форматов (например, NE — New Executable, используемый в Windows 3.x). Название «Portable» отражает намерение сделать формат независимым от конкретной аппаратной платформы, что было важно для поддержки многопроцессорных и многоплатформенных систем (MIPS, Alpha, PowerPC, Intel x86), на которые изначально ориентировалась Windows NT.

Стандартизация формата PE была закреплена в спецификации Microsoft Portable Executable and Common Object File Format Specification (PE/COFF), которая публикуется и обновляется компанией. В 1999 году формат был принят как стандарт для исполняемых файлов в Windows 9x (Windows 95, 98, Me), заменив старый 16-битный формат NE. Начиная с Windows 2000, PE стал единственным форматом для 32- и 64-разрядных приложений.

Структура формата

Файл в формате PE состоит из нескольких последовательных разделов (секций), каждая из которых имеет заголовок и данные. Основные компоненты структуры:

1. Заголовок MS-DOS (MZ-заголовок)

Первые 64 байта файла содержат традиционный заголовок MS-DOS, начинающийся с сигнатуры «MZ» (0x4D 0x5A). Этот заголовок необходим для обратной совместимости: при запуске файла в среде MS-DOS или в старых версиях Windows выводится сообщение «This program cannot be run in DOS mode» (или аналогичное). В конце заголовка находится поле e_lfanew (4 байта), указывающее смещение (offset) до начала PE-заголовка.

2. PE-заголовок (IMAGE_NT_HEADERS)

Начинается с сигнатуры «PE\0\0» (0x50 0x45 0x00 0x00). Состоит из двух частей:

  • IMAGE_FILE_HEADER — содержит основные метаданные: количество секций, временную метку, указатель на таблицу символов (для отладки), размер необязательного заголовка, флаги характеристик (например, является ли файл DLL, исполняемым или системным).
  • IMAGE_OPTIONAL_HEADER — несмотря на название, является обязательным для исполняемых файлов. Включает: адрес точки входа (Entry Point), размеры кода и данных, базовый адрес загрузки (Image Base), размер стека и кучи, версию подсистемы (консольная, графическая, драйверная), а также таблицы импорта и экспорта.

3. Заголовки секций (Section Headers)

Каждая секция описывается 40-байтовым заголовком, содержащим:

  • Имя секции (8 байт, например .text, .data, .rdata, .rsrc)
  • Виртуальный размер (размер в памяти)
  • Виртуальный адрес (смещение относительно базового адреса)
  • Размер и смещение в файле
  • Флаги (разрешён ли код, данные, возможность записи, выполнения)

4. Секции (Section Data)

Фактические данные, загружаемые в память. Типичные секции:

  • .text — исполняемый код (машинные инструкции)
  • .data — инициализированные глобальные и статические переменные
  • .rdata — константы, строки, таблицы импорта/экспорта
  • .rsrcресурсы (иконки, меню, диалоговые окна, строки, версии)
  • .reloc — таблица перемещений (базовых адресов) для динамической загрузки
  • .tls — данные для локального хранилища потоков (Thread Local Storage)

Ключевые механизмы

Таблица импорта (Import Address Table, IAT)

Используется для связывания вызовов функций из внешних DLL (например, kernel32.dll, user32.dll). Загрузчик Windows, анализируя IAT, находит адреса функций в памяти и подставляет их в код. Это позволяет программам динамически загружать библиотеки.

Таблица экспорта (Export Address Table, EAT)

Содержит адреса функций, которые DLL предоставляет другим модулям. Используется в основном для системных библиотек.

Релокация (Base Relocation)

Если файл не может быть загружен по предпочтительному базовому адресу (например, из-за конфликта с другой DLL), загрузчик применяет таблицу перемещений (.reloc), корректируя адреса в коде и данных. Это необходимо для поддержки Address Space Layout Randomization (ASLR) — механизма защиты от эксплуатации уязвимостей.

Разновидности

Формат PE используется для нескольких типов файлов, различающихся расширением и структурой:

  • .exe — исполняемые файлы (приложения)
  • .dll — динамически подключаемые библиотеки
  • .sys — драйверы устройств (загружаются в режиме ядра)
  • .ocx — элементы управления ActiveX
  • .cpl — элементы панели управления
  • .scr — заставки (скринсейверы)
  • .efi — файлы для загрузчиков UEFI (используют PE-заголовок)

Применение и значение

Portable Executable является основой для всех современных приложений Windows, включая системные процессы, драйверы, библиотеки и компоненты .NET Framework (которые компилируются в PE-файлы с управляемым кодом, но с особым заголовком). Формат обеспечивает:

  • Переносимость между архитектурами (x86, x64, ARM) за счёт поддержки разных форматов машинного кода и таблиц релокаций.
  • Безопасностьконтроль целостности через цифровые подписи (Authenticode), проверку подлинности (Code Integrity) и механизмы защиты от внедрения кода.
  • Гибкость — возможность загрузки как в пользовательском, так и в режиме ядра, а также поддержка отладки и профилирования.

Критика и ограничения

Несмотря на широкое распространение, формат PE подвергается критике за:

  • Сложность — избыточность структуры (например, наличие MZ-заголовка) и множество устаревших полей.
  • Уязвимости — возможность манипуляции с таблицами импорта и экспорта для внедрения вредоносного кода (например, DLL-хеджекинг). Многие вредоносные программы (вирусы, трояны) используют PE-файлы для маскировки и обхода антивирусных средств.
  • Несовместимость — файлы PE не могут быть запущены в операционных системах, не поддерживающих Windows (например, в Linux или macOS) без использования эмуляторов (Wine) или кросс-компиляции.

Интересные факты

  • Формат PE используется не только в Windows, но и в некоторых встраиваемых системах и загрузчиках UEFI (Unified Extensible Firmware Interface), где он служит стандартом для исполняемых файлов прошивки.
  • В Windows 10 и Windows 11 появилась поддержка PE-файлов для архитектуры ARM64, что позволило запускать приложения x86 через эмуляцию.
  • Существуют инструменты для анализа и модификации PE-файлов, такие как PEview, CFF Explorer, LordPE, а также библиотеки (например, pefile для Python).

Источники

  • Microsoft Portable Executable and Common Object File Format Specification (PE/COFF)
  • «Windows Internals» (Part 1, 7th Edition) — Mark Russinovich, David A. Solomon, Alex Ionescu
  • «The Art of Memory Forensics» — Michael Hale Ligh, Andrew Case, Jamie Levy, Aaron Walters
  • Документация Microsoft по разработке на Win32 API
  • Статья «Portable Executable» в англоязычной Википедии (версия от 2023 года)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →