В чем разница между "Импортировать адрес таблицы" и "Импортировать адрес таблицы адресов" в директориях даты PE?
Кто-нибудь знает разницу?
4 ответа
Если вы хотите поиграть с Portable Executables, вам не удастся получить копию спецификации.
Это было какое-то время, но если память мне не изменяет: IT и IAT идентичны, за исключением того, что IAT заполняется PE-загрузчиком при разрешении импорта - но не поверьте мне на слово, проверьте спецификации:)
РЕДАКТИРОВАТЬ:
Я быстро просмотрел спецификации и немного освежил мою память: Таблица импорта - это основная структура, с одной записью на DLL, из которой вы импортируете. Каждая запись содержит, помимо прочего, указатель таблицы поиска импорта (ILT) и указатель таблицы импорта адреса (IAT) (iirc, который раньше вызывался OriginalFirstThunk
а также FirstThunk
). Таблицы ILT и IAT идентичны на диске, но во время выполнения IAT будет заполняться адресами памяти импортируемых функций.
Поле IAT PE-заголовка, вероятно, нельзя полагаться на 100%, если вы хотите иметь возможность работать с нестандартными EXE-файлами, точно так же, как вы не можете зависеть от кода начала / размера-кода и указателей данных. Лучше игнорировать поле заголовка IAT и вместо этого анализировать IT. Кроме того, при разборе IT в некоторых исполняемых файлах будет отсутствовать ILT, поскольку только IAT - более старые компоновщики borland (iirc) были известны тем, что не генерировали ILT.
РЕДАКТИРОВАТЬ 2: определения
- IT: таблица импорта (раздел 6.4.1 PeCoff) - таблица для каждой DLL
IMAGE_IMPORT_DESCRIPTOR
, - ILT: Таблица поиска импорта (раздел 6.4.2 PeCoff) - таблица импорта
IMAGE_THUNK_DATA
, - IAT: таблица адресов импорта (раздел 6.4.4 PeCoff) - на диске: идентично ILT, среда выполнения: заполнена импортированными адресами памяти функций.
IMAGE_DIRECTORY_ENTRY_IMPORT
в конечном итоге приводит к нескольким IAT thunks, которые хранятся в области памяти, которая начинается в [IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress
и имеет размер [IMAGE_DIRECTORY_ENTRY_IAT].Size
,
Я думаю, это полезно, когда все разделы загружаются по умолчанию только для чтения, и вы можете использовать IMAGE_DIRECTORY_ENTRY_IAT
сделать IAT (но не ILT) громкоговорители для записи.
Кстати, ILT и IAT могут иметь разное содержимое, когда DLL связана. В этом случае блоки IAT содержат предварительно рассчитанные адреса импортируемых функций.
@snemarch в основном прав, хотя я думаю, что и он, и документация не правы, что ILT и IAT одинаковы на диске. Я просмотрел байты, они не совпадают.
Хотя он прав насчет определения и назначения таблиц.
ILT (таблица поиска импорта) используется загрузчиком Windows, чтобы связать функции, используемые EXE-файлом, с их адресом в DLL. Однако после установления этой связи адрес в библиотеке DLL записывается в IAT (таблица адресов импорта) в EXE-файле. После загрузки EXE ему больше не нужен ILT, когда он вызывает функцию в DLL, он указывает на IAT.
Каталог импорта указывает на таблицу каталогов импорта, которая представляет собой таблицу в .rdata, а в таблице импорта есть запись IMAGE_IMPORT_DESCRIPTOR для каждой dll, а запись указывает на строку имени dll, начало части IAT для импорт из этой dll и начало части ILT для импорта из этой dll.
Связанная таблица каталогов импорта обычно находится на странице заголовка и содержит IMAGE_BOUND_IMPORT_DESCRIPTOR для каждого связанного модуля. Каждый дескриптор содержит указатель на строку имени связанного модуля (также в заголовке) и отметку времени, которая является отметкой времени DLL, к которой он привязан.
Таблица импорта задержки обычно находится в формате .rdata и содержит IMAGE_DELAY_IMPORT_DESCRIPTOR для каждого загруженного модуля задержки. IMAGE_DELAY_IMPORT_DESCRIPTOR содержат метку времени, ссылку на имя модуля, ссылку на IAT отложенной загрузки и ILT отложенной загрузки, а также связанную IAT отложенной загрузки и таблицу отложенного импорта выгрузки.
В dwmcore.dll раздел .rdata выглядит примерно так (по порядку): IAT, постоянные переменные области файла, каталог экспорта, EAT, ELT, EOT, имена функций экспорта, более постоянные переменные области файла и строки, таблица импорта задержки, задержка имена модулей импорта, задержка ILT, имена функций импорта задержки, таблица импорта, имена модулей импорта, ILT, имена функций импорта, информация о размотке.
Задержка IAT фактически находится в начале .data. Я не уверен, используют ли модули одни и те же задержки IAT/ILT или они разные. Я не уверен, почему задержка и граница задержки имеют отдельный IAT вместо использования основного IAT.
IAT содержит RVA строки имени функции на диске, если функция не привязана, отложена или связана с задержкой. Если он связан, то IAT содержит адресную подсказку для функции. Если он задержан/связан с задержкой, то он содержит адрес вспомогательной функции. Если вместо привязки используется только подсказка , то IAT содержит подсказку индекса.