Portable Executable
Формат Portable Executable ( PE ) — це формат файлів для виконуваних файлів, об’єктного коду, бібліотек динамічного компонування (DLL) і двійкових файлів, які використовуються в 32-розрядних і 64-розрядних операційних системах Windows, а також у середовищах UEFI . [3] Це стандартний формат для бінарних програмних файлів у системах на базі Windows NT: виконуваних програм ( Відповідно до специфікації Unified Extensible Firmware Interface (UEFI), формат PE також є прийнятним стандартом для виконуваних файлів у середовищах EFI. [4] У системах Windows NT він підтримує набори інструкцій IA-32, x86-64 (AMD64/Intel 64), IA-64, ARM і ARM64. Старіші версії Windows NT, що могли працювати на архітерктурах MIPS, DEC Alpha і PowerPC, також використовували формат PE. Крім того, завдяки використанню в Windows CE PE зберіг сумісність із декількома варіантами MIPS, ARM (включно з ARM Thumb) і SuperH.[5] Функціонально формат PE подібний до інших форматів виконуваних файлів для певної платформи, таких як формат ELF, який використовується в Linux і більшості Unix-подібних систем, а також формат Mach-O, який існує в macOS і iOS . ІсторіяКорпорація Microsoft вперше представила формат PE у Windows NT 3.1, замінивши старий 16-розрядний формат New Executable (NE). Незабаром після цього Windows 95, 98, ME та розширення Win32s для Windows 3.1x прийняли структуру PE. Кожен PE-файл містить заголовок виконуваного файлу DOS, який зазвичай відображає повідомлення « Цю програму неможливо запустити в режимі DOS ». Однак цей розділ DOS можна замінити повнофункціональною програмою DOS, як показано в інсталяторі Windows 98 SE. Розробники можуть додати таку програму за допомогою параметра З часом формат PE розширився разом із платформою Windows. Відомими розширеннями є .NET PE для керованого коду, PE32+ для підтримки 64-розрядного адресного простору та спеціалізована версія для Windows CE . Щоб визначити, чи PE-файл призначений для 32-розрядної чи 64-розрядної архітектури, можна перевірити поле Machine в Технічні деталіМакетФайл PE складається з кількох заголовків і розділів, які вказують динамічному компонувальнику, як відобразити файл у пам’яті. Виконуваний образ складається з кількох різних областей, кожна з яких потребує різних атрибутів захисту пам’яті. Щоб забезпечити правильне вирівнювання, початок кожного розділу має бути вирівняно за межею сторінки. [7] Наприклад, розділ .text, який містить програмний код, зазвичай відображається як виконання/лише читання. І навпаки, розділ .data, який містить глобальні змінні, відображається як заборонений на виконання/читання і запис. Однак для економії місця розділи не вирівнюються на диску таким чином. Динамічний компонувальник відображає кожен розділ у пам’яті окремо та призначає правильні дозволи на основі інформації в заголовках. [8] Таблиця імпортівТаблиця адрес імпорту (IAT) використовується як таблиця пошуку, коли програма викликає функцію в іншому модулі. Імпорт можна вказати за порядковим номером або за назвою. Оскільки скомпільована програма не може заздалегідь знати розташування залежних від неї бібліотек, для викликів API необхідний непрямий перехід. Оскільки динамічний компонувальник утримує модулі та вирішує залежності, він заповнює слоти IAT фактичними адресами відповідних функцій бібліотеки. Незважаючи на те, що це додає додаткову інструкцію jmp, спричиняючи погіршення продуктивності порівняно з міжмодульними викликами, це мінімізує кількість сторінок пам’яті, для яких потрібні зміни копіювання під час запису, таким чином зберігаючи пам’ять і зменшуючи обсяг дискового вводу-виводу. Якщо заздалегідь відомо, що виклик є міжмодульним (якщо це вказано атрибутом dllimport ), компілятор може створити оптимізований код за допомогою простого коду операції непрямого виклику. [8] Рандомізація розташування адресного простору (ASLR)Файли PE за замовчуванням не залежать від позиції ; вони скомпільовані для роботи за певною фіксованою адресою пам’яті. Сучасні операційні системи використовують рандомізацію адресного простору (ASLR), щоб зловмисникам було важче використовувати вразливості, пов’язані з пам’яттю. ASLR працює шляхом випадкової зміни адреси пам’яті важливих частин програми кожного разу, коли вона завантажується. Це включає базову адресу самої програми, спільні бібліотеки (DLL) і області пам’яті, такі як купа та стек. ASLR змінює позиції в адресному просторі ключових областей даних процесу, включаючи базу виконуваного файлу та позиції стека, купи та бібліотек . Шляхом рандомізації цих адрес пам’яті кожного разу, коли процес завантажується програма, ASLR не дозволяє зловмисникам надійно передбачити розташування пам’яті. .NET, метадані та формат PEУ .NET, розділ коду PE містить заглушку, яка викликає запис запуску віртуальної машини CLR, Дані, пов’язані з CLR, включно з власне кореневою структурою, зазвичай містяться в розділі загального коду Використання в інших операційних системахФормат PE також використовується ReactOS, операційною системою з відкритим початковим кодом, створеною для бінарної сумісності з Windows. Історично він також використовувався іншими операційними системами, такими як SkyOS і BeOS R3. Однак і SkyOS, і BeOS з часом перейшли на ELF.[джерело?] Платформа розробки Mono, яка прагне бути бінарно сумісною з Microsoft .NET Framework використовує той самий формат PE, що й реалізація Microsoft. Те саме стосується власної кросплатформеності Microsoft .NET Core . У x86 (-64) Unix-подібних операційних системах двійкові файли Windows (у форматі PE) можна виконати за допомогою Wine . HX DOS Extender також використовує формат PE для власних 32-розрядних двійкових файлів DOS і може виконувати деякі двійкові файли Windows у DOS, таким чином діючи як еквівалент Wine для DOS. Mac OS X 10.5 має можливість завантажувати та аналізувати файли PE, хоча вона не підтримує бінарну сумісність із Windows. [10] Мікропрограмне забезпечення UEFI та EFI використовує PE-файли, а також угоду про виклик Windows ABI x64 для програм. PE використовується навіть на платформах, для яких Windows не існує (наприклад, RISC-V). Див. також
Примітки
Джерела
Зовнішні посилання
|