В чем разница между «Импортировать адрес таблицы» и «Импортировать адрес таблицы адресов» в директориях даты PE? - PullRequest
7 голосов
/ 27 сентября 2010

alt text

Кто-нибудь знает разницу?

Ответы [ 3 ]

6 голосов
/ 27 сентября 2010

Если вы хотите поиграть с Portable Executables, вы не сможете получить копию спецификации .

Это было какое-то время, но если память мне не изменяет: IT и IAT идентичны, за исключением того, что IAT заполняется PE-загрузчиком при разрешении импорта - но не верьте моему слову это, проверьте спецификации:)

EDIT:

Я быстро просмотрел спецификации и немного освежил мою память: Таблица импорта - это основная структура , с одной записью на DLL, из которой вы импортируете. Каждая запись содержит, помимо прочего, Таблица поиска импорта ( ILT ) и Таблица адресов импорта ( IAT ) указатель (iirc this раньше назывался OriginalFirstThunk и FirstThunk). Таблицы ILT и IAT идентичны на диске, но во время выполнения IAT будет заполняться адресами памяти импортируемых функций.

Поле IAT PE-заголовка, вероятно, нельзя полагаться на 100%, если вы хотите иметь возможность работать с нестандартными EXE-файлами, точно так же, как вы не можете зависеть от кода начала / размера-размера и указателей данных. Лучше игнорировать поле заголовка IAT и вместо этого анализировать IT. Кроме того, при разборе IT в некоторых исполняемых файлах будет отсутствовать ILT, поскольку только IAT - более старые компоновщики borland (iirc) были известны тем, что не генерировали ILT.

РЕДАКТИРОВАТЬ 2: определения

  • IT: таблица импорта (раздел 6.4.1 PeCoff) - таблица per-DLL IMAGE_IMPORT_DESCRIPTOR.
  • ILT: Таблица поиска импорта (раздел 6.4.2 PeCoff) - таблица импорта IMAGE_THUNK_DATA.
  • IAT: таблица адресов импорта (раздел 6.4.4 PeCoff) - на диске: идентично ILT, среда выполнения: заполнена импортированными адресами памяти функций.
2 голосов
/ 25 августа 2015

IMAGE_DIRECTORY_ENTRY_IMPORT в конечном итоге приводит к нескольким группам IAT, которые хранятся в области памяти, которая начинается с [IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress и имеет размер [IMAGE_DIRECTORY_ENTRY_IAT].Size.

Полагаю, это полезно, когда все разделы по умолчанию загружаются только для чтения, и вы можете использовать IMAGE_DIRECTORY_ENTRY_IAT, чтобы сделать записи IAT (но не ILT) записываемыми.

BTW, ILT и IAT могут иметь разное содержимое, когда DLL связана. В этом случае блоки IAT содержат предварительно рассчитанные адреса импортируемых функций.

1 голос
/ 13 января 2015

@ snemarch В основном верно, хотя я думаю, что и он, и документация не правы, что ILT и IAT одинаковы на диске. Я просмотрел байты, они не совпадают.

Хотя он прав насчет определения и назначения таблиц.

ILT (таблица поиска импорта) используется загрузчиком Windows, чтобы связать функции, используемые EXE, с их адресом в DLL. Однако после установления этой связи адрес в DLL записывается в IAT (таблица адресов импорта) в EXE-файле. После загрузки EXE ему больше не нужен ILT, когда он вызывает функцию в DLL, он указывает на IAT.

...