1 / 25

Структура PE файла

Структура PE файла. Доклад подготовили : Родионов Евгений Б7-04 Рыськов Олег Б5-04. Для чего нужны знания о PE- файле?. Для понимания архитектуры процессора и операционной системы. Каждый уважающий системный программист должен знать о структуре PE- файла

mele
Download Presentation

Структура PE файла

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Структура PE файла Доклад подготовили: Родионов Евгений Б7-04 Рыськов Олег Б5-04

  2. Для чего нужны знания о PE-файле? • Для понимания архитектуры процессора и операционной системы. • Каждый уважающийсистемный программист должен знать о структуре PE-файла • Для написания защит программного обеспечения (упаковщика, протектора, криптора и т.д.) • Для дизассемблирования программного обеспечения, в частности вредоносного кода • Для написания линковщика, компилятора и т.д.

  3. Значение PE-файла в ОС Windows • Все исполняемые файлы, динамические библиотеки и драйверы имеют одну и ту же структуру • Экспорт и импорт библиотечных функций непосредственно построен на структуре PE-файла • Управляемый код также находиться в PE-файле • Вся служебная информация о создании загрузчика находиться внутри структуры PE-файла

  4. Виртуальная память • Каждому процессу в ОС линейки Windows NT имеет 4 гигабайта виртуальной памяти • Всё адресное пространство процесса, обычно, делится на две части: • 0x00000000-0x7fffffff -пользовательское • 0x80000000-0xffffffff – системное • Виртуальный адрес транслируется процессором в физический, причем разным виртуальным адресам может соответствовать один и тот же физический. • Механизм виртуальной памяти обеспечивается как процессором, так и самой ОС • У каждой страницы виртуальной памяти есть атрибуты защиты (на чтение, запись и исполнениеи т.д).

  5. Основные понятия • Image Base – база образа (виртуальный адрес, соответствующий первому байту образа) • VA (Virtual Adress) - виртуальный адрес • RVA (Relative Virtual Adress) – относительный виртуальный адрес (VA-Image Base) • FO (File offset) – Файловое смещение • Секция

  6. Pe-файл на диске и в памяти Перед загрузкой PE-файл подвергается обработке загрузчиком Поэтому PE-файл на диске и памяти – это не одно и то же! WinLoader

  7. Структура PE-файла • Dos MZ Header – старый заголовок, оставленный для совместимости • Dos Stub – минипрограмма под DOS • PE File Header – файловый заголовок PE-файла • Image_Optional_Header – опциональный заголовок • Таблица секций • Секции

  8. Как определить, что перед нами PE-файл? • Расширение (exe, dll, scr, sys) не гарантирует, что перед нами исполняемый файл • Единственная гарантия – это его внутренняя структура. • Необходимое условие – наличие сигнатур “0x4D5A” “0x5045”

  9. MZ - заголовок • Любой PE файл начинается с этой структуры. • MZ заголовок содержит маленькую программу, называемую Dosstub. • Самое главное поле в этой структуре это: e_lfanew – смещение от начала файла до PE заголовка

  10. Файловый заголовок PE-файла • Число, идентифицирующее тип и архитектуру процессора. • Количество секций в образе (определяет размер таблицы секций) • Информация о времени, когда был собран данный PE-файл • Указатель на COFF-таблицу символов PE-формата • Количество символов в COFF-таблице символов • Размер опционального заголовка • Атрибуты специфичные для данного PE-файла

  11. Опциональный заголовок • Это слово служит, чтобы проверить для какой версии спецификации PE этот опциональный заголовок (64-х или 32-х разрядная версия) • Старшее и младшее слово версии линковщика, создавшего данный файл. • Размер секции кода или сумма всех секций кода. (Не используется загрузчиком) • Размер секции с инициализированными данными. (Не используется загрузчиком) • Размер секции с неинициализированными данными. (Не используется загрузчиком) • Адрес, с которого начинают считываться инструкции для выполнения. Адрес является RVA. Чтобы указать на адрес ниже базового можно использовать отрицательные значения, т.е. в дополнительном коде. • RVAоткуда начинаются секция(и) кода исполняемого файла (Не используется загрузчиком) • RVA, откуда начинаются секция(и) данных исполняемого файла. (Не используется загрузчиком)

  12. Опциональный заголовок • Image Base – обычно значение 0x00400000 • Значение на которое выравнивается адрес по которому секция будет загружена в адресное пространство или смещение её в файле • Версия операционной системы для которой предназначается данный исполняемый файл • Версия исполняемого файла • Версия подсистемы, позволяющая загружать данный образ • Зарезервировано • Общий размер образа • Общий размер заголовков • Контрольная сумма • Подсистема для данного образа • Атрибуты DLL • Объём памяти выделяемой и резервируемой под стек • Объём памяти выделяемой и резервируемой под кучу • Устарело • Количество элементов в массиве DataDirectory

  13. Директории • Это массив DataDirectory, каждый элемент которого состоит из двух полей (по 4 байта) • RVA директории • Её размер • Количество элементов в данном массиве не фиксировано и определяется значением поля NumberOfRvaAndSizes опционального заголовка

  14. Таблица секций • Таблица секций наиболее важная часть PE файла, она следует сразу за опциональным заголовком. • Каждая строка в данной таблице описывает ровно одну секцию. • Их количество определяется полем NumberOfSections в FileHeader

  15. Основные директории • Таблица экспорта • Таблица импорта • Таблица базовых поправок • TLS • IAT

  16. Таблица экспорта содержит информацию символах, которые доступны другим модулям, через динамическое связывание. Основные термины: Таблица экспортируемых адресов – это массив RVA экспортируемых символов Таблица указателей на имена – массив указателей на открытые экспортируемые имена Таблица ординалов – массив ординалов, идёт параллельно массиву указателей на открытые экспортируемые имена Таблица экспортируемых имён – массив ASCII-строк, на них указывают элементы массива указателей на открытые экспортируемые имена Таблица экспорта

  17. Таблица экспорта • Таблица экспорта начинается со следующей структуры: • Поле зарезервировано • Это поле содержит дату создания файла • Старший и младший номер версии, может быть установлен пользователем • RVA ASCII-строки содержащей имя данного исполняемого модуля • Стартовый номер символа с которого начинается экспорт • Количество экспортируемых символов • Количество элементов в массиве указателей на экспортируемые имена (в таблице ординалов) • RVA массива экспортируемых символов • RVA таблицы указателей на строки, соответствующие экспортируемым символам • RVA таблицы ординалов

  18. Таблица импорта начинается с массива элементов типа IMAGE_IMPORT_DESCRIPTOR. Количество элементов массива нигде не указывается, но вместо этого первый элемент последнего члена массива -  нулевой. IMAGE_IMPORT_DESCRIPTOR: RVA таблицы, содержащий имя или ординал каждого импортируемого символа Временная отметка, когда был создан данный файл Это поле связано с передачей экспорта Имя DLL, откуда импортируются функции RVA массива элементов типа IMAGE_THUNK_DATA (идентично Import Lookup Table) Таблица Импорта

  19. IMAGE_THUNK_DATA: Если 1, то импорт по ординалу, иначе по имени Если импорт по ординалу, то это ординал Если импорт по имени, то укороченный идентификатор точки входа и имя импортируемой функции Таблица Импорта

  20. Таблица базовых поправок • Если PE-файл не загружается по ImageBase, то применяются базовые поправки. • Для данной секции применим особый термин – дельта. Дельта - это разница между базовым адресом для PE-файла и значением ImageBase в опциональном заголовке. • Если файл загрузился по базовому адресу, то базовые поправки не нужны. • Базовые поправки – это набор смещений, по которым нужно прибавить дельту. • Поправки упаковываются сериями смежных кусков различной длины. Каждый кусок описывает поправки для одной четырехкилобайтовой страницы.

  21. Каждый блок базовых поправок начинается со структуры: Затем следует другая структура: Начальный RVA для данного куска поправок Общий размер данной поправки, включая размер данной структуры Тип поправки Смещение относительно Page RVA, указывает на место к которому надо применить поправку Таблица базовых поправок

  22. Thread Local Storage • TLS – это специальное хранилище, используемое ОС MS Windows NT, для хранения не автоматических (хранящихся не в стеке) данных. • Это индивидуальное хранилище для каждого потока.

  23. Крипторы/Упаковщики и структура PE-файла • Упаковщики и протекторы различным образом преобразуют PE-файл. Но можно выделить следующие особенности: • Те поля, которые не используются загрузчиком изменяют, пытаясь таким образом затруднить статический анализ программы. • Изменяют количество и атрибуты (имя, параметры) секций в файле • Модифицируют точку входа файла таким образом, чтобы мы вначале попадали на код распаковщика/расшифровщика • Таблица импорта обычно состоит из двух-трех функций: LoadLibrary, GetProcAdress, ExitProcess • Очень «трепетно» относятся к секции ресурсов • В конце своего кода обязательно переходят на оригинальную точку входа.

  24. Источники • Microsoft Portable Executable and Common Object File Format Specification • http://wasm.ru/article.php?article=green2red02#_Toc100906478 • http://rsdn.ru/article/baseserv/pe_coff.xml

  25. Спасибо за внимание! Вопросы?

More Related