Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ОС рулез.doc
Скачиваний:
0
Добавлен:
22.12.2019
Размер:
630.27 Кб
Скачать

.Idata bfc0847d .Text jmp dword ptr [00040042 … call 00014408 (Вызов GetMessage) Прикладная программа

User32.dll

BFC0847D

GetMessage(…)

00040042

00014408

Сделано так для того, чтобы загрузчику не приходилось изменять каждую инструкцию, вызывающую какую-либо функцию из модуля. Теоретически загрузка происходит быстрее, так как всё находится в одной секции. На этом методе основан метод работы программы шпиона.

Импортирование ре файлов.

Рассмотрим структуру секции .idata. Перед загрузкой в память в секции .idata хранится информация, необходимая для того, чтобы загрузчик мог определить адреса целевых функций и пристыковать их к исполняемому файлу. После загрузки секция .idata содержит указатели функций, импортируемых ехе файлом. Секция .idata имеет следующую структуру:

Список функций Таблица адресов

Characteristics

TimeDataStamp

Name

FirstThunk

  1. GetMessage(…)

  1. LoadIcon(…)

  1. Translate(…)

… …

HintName

//////////

О пределяются

* .dll

User32.dll

80000112

Программа в таблице импорта должна указать список внешних dll и функций, вызываемых из этих dll. Для каждой внешней dll в секции импорта создаётся структура, которая состоит из следующих полей:

Name – имя внешней dll, причём имя указывается не в таблице, а указатель на RVA, содержащей имя внешней dll. Имя представляет строку символов, заканчивающихся 0.

TimeDataStamp – отметка о времени и дате создания этой dll. Перед загрузкой в этом поле 0. После загрузки записывается конкретная дата и время создания.

Остальные два поля используются для определения функций данной dll, которые используются ехе файлами.

Characteristics – представляет RVA, указывающий на массив двойных слов, каждое двойное слово соответствует одной функции, импортируемой из этой dll. С помощью четырёх байт функции могут вызываться по номеру и по имени. Если старший байт двойного слова установлен 1, то импортирование производится по номре и младший 31 бит используется для определения номера страницы, то есть если в какой-либо ячейке записано 80000112, значит, что импортируется 112-я функция модуля user32.dll. Если старший бит 0, то это значит, что младший 31 бит является RVA, который указывает на строку символов ASCII, содержащей имя функции.

FirstThunk – указывает на массив двойных слов, который заполняется загрузчиком. До загрузки этот массив пустой. После загрузки в него записывается массив функций внешних dll.

Структура таблицы импорта не является жёсткой. Некоторые компоновщики не используют поле FIrstThunk.

Эскпорт ре файлов.

Информация об экспортируемых функциях хранится в секции .edata (обычно в dll файлах). Таблица экспорта имеет следующую структуру:

характеристики

Base

NumberOfFunction

3

NumberOfNames

2

AddressOfFunctions

AddressOfNames

AddressOfNameOrdinals

Таблица адресов

400042 400085 400197

Т аблица

э кспорта

MyFunc1 MyFunc3

Таблица имён функций

1 3

Таблица номеров функций

Из dll экспортируется 3 функции, причём 2 из них по имени. Рассмотрим структуру таблицы экспорта.

Характеристики – в нём указывается время и дата создания dll, в них находится RVA, который указывает на строку с именем этой dll.

? Зачем дублируется имя dll?

Ответ: чтобы ускорить, чтобы все данные, которые необходимы, брались из таблицы экспорта.

Начальный номер экспорта для функций, экспортируемый данным модулем, например, если модуль экспортирует с 10, 11, 15, то начальный номер 10.

NumberOfFunction – количество элементов в таблице адресов.

NumberOfNames – количество элементов в таблице имён.

Следующие три поля указывают на соответствующие таблицы.