Portable Executable (РЕ, «переносимый исполняемый») — общепринятый формат исполняемых файлов, объектного кода и динамических библиотек, используемый в 32- и 64-разрядных версиях операционной системы Microsoft Windows. Формат РЕ представляет собой структуру данных, содержащую всю информацию, необходимую PE-загрузчику для отображения файла в память. Исполняемый код включает в себя ссылки для связывания динамически загружаемых библиотек, таблицы экспорта и импорта API функций, данные для управления ресурсами и данные локальной памяти потока (TLS). В операционных системах семейства Windows NT формат РЕ используется для EXE, DLL, SYS (драйверов устройств) и других типов исполняемых файлов [1–8].
Формат РЕ также используется системой ReactOS, поскольку ReactOS предназначена для того, чтобы быть полностью совместимой с Windows на уровне кода. Кроме того, он исторически использовался и многими другими операционными системами, включая SkyOS и BeOS R3. Однако как известно, и SkyOS, и BeOS в конечном счёте перешли на формат ELF.
Поскольку широко используемая платформа разработки Mono намеревается быть по определению совместимой с Microsoft.NET, она использует тот же формат РЕ, что и в реализации Microsoft.
Надо отметить, что на платформе х86 в Unix-подобных операционных системах некоторые двоичные файлы Windows (в формате РЕ) могут быть выполнены с помощью Wine. НХ DOS Extender также использует формат РЕ для собственных 32-разрядных двоичных файлов DOS, кроме того, может в некоторой степени выполнить существующие двоичные файлы Windows в DOS, действуя, таким образом, как Wine для DOS.
Mac OS X 10.5 также имеет возможность загружать и интерпретировать PE-файлы, однако они не являются полностью совместимыми с Windows.
РЕ представляет собой модифицированную версию COFF формата файла для Unix. PE/COFF — это часто используемые альтернативный термин при разработке Windows.
На операционных системах семейства Windows NT формат РЕ поддерживает следующие архитектуры наборов команд: IA-32, IA-64, и х86-64 (AMD64/Intel64). До Windows 2000 Windows NT (таким образом, и РЕ) поддерживал MIPS, Alpha, и PowerPC. Поскольку РЕ используется на Windows СЕ, он продолжает поддерживать несколько разновидностей MIPS, ARM (включая Thumb), и SuperH.
Основные «конкуренты» РЕ — ELF (используемый в Linux и большинстве других версий Unix) и Mach-O (используемый в Mac OS X).
С появлением операционной системы очередного поколения Windows NT 3.1 Microsoft перешла на формат РЕ. Все более поздние версии Windows, включая Windows 95/98/МЕ, поддерживают этот формат. Формат сохранил ограниченную поддержку существующего (MZ) для преодоления разрыва между системами, основанными на DOS, и системами NT. Например, заголовки РЕ/COFF всё ещё включают исполняемую программу MS-DOS, которая по умолчанию является заглушкой, выводящей на экран простое сообщение «This program cannot be run in DOS mode» — «Эта программа не может быть выполнена в режиме DOS» (или подобное). РЕ продолжает служить изменяющейся платформе Windows. Некоторые расширения включают формат PE.NET (см. ниже), 64-разрядную версию под названием РЕ32+ (иногда РЕ+), и спецификацию для Windows СЕ.
А теперь рассмотрим основные технические детали, касающиеся назначения и структуры этих PE-файлов. На рис х.х. представлена упрощенная структура стандартных 32-разрядных РЕ-файлов.
Здесь первые 2 байта РЕ файла содержат сигнатуру 0x4D 0x5 А-«MZ» (как наследник MZ-формата). Далее двойное слово по смещению 0x3 С содержит адрес PE-заголовка. Последний начинается с сигнатуры 0x50 0x45 — «РЕ».
Типовая структура файл РЕ состоит из нескольких заголовков и секций, которые указывают динамическому компоновщику, как отображать файл в память. Исполняемый образ состоит из нескольких различных областей (секций), каждая из которых требует различных прав доступа к памяти; таким образом, начало каждой секции должно быть выровнено по границе страницы. Например, обычно секция. text, которая содержит код программы, отображена как ис-полняемая/доступная только для чтения, а секция. data, содержащая глобальные переменные, отображена как неисполняемая/доступная для чтения и записи. Однако, чтобы не тратить впустую пространство на жёстком диске, различные секции на нём на границу страницы не выровнены. Часть работы динамического компоновщика состоит в том, чтобы отобразить каждую секцию в память отдельно и присвоить корректные права доступа получившимся областям согласно указаниям, содержащимся в заголовках.
Надо отметить, что Платформа. NET корпорации Microsoft расширила формат РЕ с помощью функций, которые поддерживают общеязыковую среду исполнения (Common Language Runtime — CLR). Среди дополнений — заголовок CLR и секция данных CLR. После загрузки двоичного файла загрузчик ОС приводит к выполнению CLR через ссылку в таблице импорта PE/COFF. Затем CLR загружает заголовок CLR и секции данных.