270 likes | 941 Views
Структура PE файла. Доклад подготовили : Родионов Евгений Б7-04 Рыськов Олег Б5-04. Для чего нужны знания о PE- файле?. Для понимания архитектуры процессора и операционной системы. Каждый уважающий системный программист должен знать о структуре PE- файла
E N D
Структура PE файла Доклад подготовили: Родионов Евгений Б7-04 Рыськов Олег Б5-04
Для чего нужны знания о PE-файле? • Для понимания архитектуры процессора и операционной системы. • Каждый уважающийсистемный программист должен знать о структуре PE-файла • Для написания защит программного обеспечения (упаковщика, протектора, криптора и т.д.) • Для дизассемблирования программного обеспечения, в частности вредоносного кода • Для написания линковщика, компилятора и т.д.
Значение PE-файла в ОС Windows • Все исполняемые файлы, динамические библиотеки и драйверы имеют одну и ту же структуру • Экспорт и импорт библиотечных функций непосредственно построен на структуре PE-файла • Управляемый код также находиться в PE-файле • Вся служебная информация о создании загрузчика находиться внутри структуры PE-файла
Виртуальная память • Каждому процессу в ОС линейки Windows NT имеет 4 гигабайта виртуальной памяти • Всё адресное пространство процесса, обычно, делится на две части: • 0x00000000-0x7fffffff -пользовательское • 0x80000000-0xffffffff – системное • Виртуальный адрес транслируется процессором в физический, причем разным виртуальным адресам может соответствовать один и тот же физический. • Механизм виртуальной памяти обеспечивается как процессором, так и самой ОС • У каждой страницы виртуальной памяти есть атрибуты защиты (на чтение, запись и исполнениеи т.д).
Основные понятия • Image Base – база образа (виртуальный адрес, соответствующий первому байту образа) • VA (Virtual Adress) - виртуальный адрес • RVA (Relative Virtual Adress) – относительный виртуальный адрес (VA-Image Base) • FO (File offset) – Файловое смещение • Секция
Pe-файл на диске и в памяти Перед загрузкой PE-файл подвергается обработке загрузчиком Поэтому PE-файл на диске и памяти – это не одно и то же! WinLoader
Структура PE-файла • Dos MZ Header – старый заголовок, оставленный для совместимости • Dos Stub – минипрограмма под DOS • PE File Header – файловый заголовок PE-файла • Image_Optional_Header – опциональный заголовок • Таблица секций • Секции
Как определить, что перед нами PE-файл? • Расширение (exe, dll, scr, sys) не гарантирует, что перед нами исполняемый файл • Единственная гарантия – это его внутренняя структура. • Необходимое условие – наличие сигнатур “0x4D5A” “0x5045”
MZ - заголовок • Любой PE файл начинается с этой структуры. • MZ заголовок содержит маленькую программу, называемую Dosstub. • Самое главное поле в этой структуре это: e_lfanew – смещение от начала файла до PE заголовка
Файловый заголовок PE-файла • Число, идентифицирующее тип и архитектуру процессора. • Количество секций в образе (определяет размер таблицы секций) • Информация о времени, когда был собран данный PE-файл • Указатель на COFF-таблицу символов PE-формата • Количество символов в COFF-таблице символов • Размер опционального заголовка • Атрибуты специфичные для данного PE-файла
Опциональный заголовок • Это слово служит, чтобы проверить для какой версии спецификации PE этот опциональный заголовок (64-х или 32-х разрядная версия) • Старшее и младшее слово версии линковщика, создавшего данный файл. • Размер секции кода или сумма всех секций кода. (Не используется загрузчиком) • Размер секции с инициализированными данными. (Не используется загрузчиком) • Размер секции с неинициализированными данными. (Не используется загрузчиком) • Адрес, с которого начинают считываться инструкции для выполнения. Адрес является RVA. Чтобы указать на адрес ниже базового можно использовать отрицательные значения, т.е. в дополнительном коде. • RVAоткуда начинаются секция(и) кода исполняемого файла (Не используется загрузчиком) • RVA, откуда начинаются секция(и) данных исполняемого файла. (Не используется загрузчиком)
Опциональный заголовок • Image Base – обычно значение 0x00400000 • Значение на которое выравнивается адрес по которому секция будет загружена в адресное пространство или смещение её в файле • Версия операционной системы для которой предназначается данный исполняемый файл • Версия исполняемого файла • Версия подсистемы, позволяющая загружать данный образ • Зарезервировано • Общий размер образа • Общий размер заголовков • Контрольная сумма • Подсистема для данного образа • Атрибуты DLL • Объём памяти выделяемой и резервируемой под стек • Объём памяти выделяемой и резервируемой под кучу • Устарело • Количество элементов в массиве DataDirectory
Директории • Это массив DataDirectory, каждый элемент которого состоит из двух полей (по 4 байта) • RVA директории • Её размер • Количество элементов в данном массиве не фиксировано и определяется значением поля NumberOfRvaAndSizes опционального заголовка
Таблица секций • Таблица секций наиболее важная часть PE файла, она следует сразу за опциональным заголовком. • Каждая строка в данной таблице описывает ровно одну секцию. • Их количество определяется полем NumberOfSections в FileHeader
Основные директории • Таблица экспорта • Таблица импорта • Таблица базовых поправок • TLS • IAT
Таблица экспорта содержит информацию символах, которые доступны другим модулям, через динамическое связывание. Основные термины: Таблица экспортируемых адресов – это массив RVA экспортируемых символов Таблица указателей на имена – массив указателей на открытые экспортируемые имена Таблица ординалов – массив ординалов, идёт параллельно массиву указателей на открытые экспортируемые имена Таблица экспортируемых имён – массив ASCII-строк, на них указывают элементы массива указателей на открытые экспортируемые имена Таблица экспорта
Таблица экспорта • Таблица экспорта начинается со следующей структуры: • Поле зарезервировано • Это поле содержит дату создания файла • Старший и младший номер версии, может быть установлен пользователем • RVA ASCII-строки содержащей имя данного исполняемого модуля • Стартовый номер символа с которого начинается экспорт • Количество экспортируемых символов • Количество элементов в массиве указателей на экспортируемые имена (в таблице ординалов) • RVA массива экспортируемых символов • RVA таблицы указателей на строки, соответствующие экспортируемым символам • RVA таблицы ординалов
Таблица импорта начинается с массива элементов типа IMAGE_IMPORT_DESCRIPTOR. Количество элементов массива нигде не указывается, но вместо этого первый элемент последнего члена массива - нулевой. IMAGE_IMPORT_DESCRIPTOR: RVA таблицы, содержащий имя или ординал каждого импортируемого символа Временная отметка, когда был создан данный файл Это поле связано с передачей экспорта Имя DLL, откуда импортируются функции RVA массива элементов типа IMAGE_THUNK_DATA (идентично Import Lookup Table) Таблица Импорта
IMAGE_THUNK_DATA: Если 1, то импорт по ординалу, иначе по имени Если импорт по ординалу, то это ординал Если импорт по имени, то укороченный идентификатор точки входа и имя импортируемой функции Таблица Импорта
Таблица базовых поправок • Если PE-файл не загружается по ImageBase, то применяются базовые поправки. • Для данной секции применим особый термин – дельта. Дельта - это разница между базовым адресом для PE-файла и значением ImageBase в опциональном заголовке. • Если файл загрузился по базовому адресу, то базовые поправки не нужны. • Базовые поправки – это набор смещений, по которым нужно прибавить дельту. • Поправки упаковываются сериями смежных кусков различной длины. Каждый кусок описывает поправки для одной четырехкилобайтовой страницы.
Каждый блок базовых поправок начинается со структуры: Затем следует другая структура: Начальный RVA для данного куска поправок Общий размер данной поправки, включая размер данной структуры Тип поправки Смещение относительно Page RVA, указывает на место к которому надо применить поправку Таблица базовых поправок
Thread Local Storage • TLS – это специальное хранилище, используемое ОС MS Windows NT, для хранения не автоматических (хранящихся не в стеке) данных. • Это индивидуальное хранилище для каждого потока.
Крипторы/Упаковщики и структура PE-файла • Упаковщики и протекторы различным образом преобразуют PE-файл. Но можно выделить следующие особенности: • Те поля, которые не используются загрузчиком изменяют, пытаясь таким образом затруднить статический анализ программы. • Изменяют количество и атрибуты (имя, параметры) секций в файле • Модифицируют точку входа файла таким образом, чтобы мы вначале попадали на код распаковщика/расшифровщика • Таблица импорта обычно состоит из двух-трех функций: LoadLibrary, GetProcAdress, ExitProcess • Очень «трепетно» относятся к секции ресурсов • В конце своего кода обязательно переходят на оригинальную точку входа.
Источники • 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
Спасибо за внимание! Вопросы?