В чем разница между таблицей импорта, таблицей адресов импорта и таблицей имен импорта?
При разборке / выгрузке exe я получаю три таблицы в разделе импорта.idata:
- таблица импорта (IT)
- таблица импортных адресов (IAT)
- таблица имен импорта (INT)
Я понимаю, что такое IAT и INT, но что это более точно?
Может ли кто-нибудь дать объяснение, так как различные уроки PE запутывают. Я не совсем понимаю, какие названия официальных структур они описывают здесь, на этих конкретных данных.
Подсказки / ответы здесь будут полезны
Пример раздела PE-файла
SECTION .idata align=4 noexecute ; section number 3, data
Import_table: ; dword
db 50H, 30H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403000 _ P0......
db 00H, 00H, 00H, 00H, 0ACH, 30H, 00H, 00H ; 00403008 _ .....0..
db 68H, 30H, 00H, 00H, 58H, 30H, 00H, 00H ; 00403010 _ h0..X0..
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403018 _ ........
db 0C0H, 30H, 00H, 00H, 70H, 30H, 00H, 00H ; 00403020 _ .0..p0..
db 60H, 30H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403028 _ `0......
db 00H, 00H, 00H, 00H, 0D0H, 30H, 00H, 00H ; 00403030 _ .....0..
db 78H, 30H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403038 _ x0......
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403040 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403048 _ ........
db 80H, 30H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403050 _ .0......
db 8EH, 30H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403058 _ .0......
db 98H, 30H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403060 _ .0......
Import_address_table: ; dword
imp_ExitProcess: ; import from KERNEL32.dll
dd 00003080H, 00000000H ; 00403068 _ 12416 0
imp_printf: ; import from msvcrt.dll
dd 0000308EH, 00000000H ; 00403070 _ 0000308E 00000000
imp_MessageBoxA: ; import from USER32.dll
dd 00003098H, 00000000H ; 00403078 _ 00003098 00000000
Import_name_table: ; byte
db 17H, 01H, 45H, 78H, 69H, 74H, 50H, 72H ; 00403080 _ ..ExitPr
db 6FH, 63H, 65H, 73H, 73H, 00H, 0B1H, 02H ; 00403088 _ ocess...
db 70H, 72H, 69H, 6EH, 74H, 66H, 00H, 00H ; 00403090 _ printf..
db 0B2H, 01H, 4DH, 65H, 73H, 73H, 61H, 67H ; 00403098 _ ..Messag
db 65H, 42H, 6FH, 78H, 41H, 00H, 00H, 00H ; 004030A0 _ eBoxA...
db 00H, 30H, 00H, 00H, 4BH, 45H, 52H, 4EH ; 004030A8 _ .0..KERN
db 45H, 4CH, 33H, 32H, 2EH, 64H, 6CH, 6CH ; 004030B0 _ EL32.dll
db 00H, 00H, 00H, 00H, 14H, 30H, 00H, 00H ; 004030B8 _ .....0..
db 6DH, 73H, 76H, 63H, 72H, 74H, 2EH, 64H ; 004030C0 _ msvcrt.d
db 6CH, 6CH, 00H, 00H, 28H, 30H, 00H, 00H ; 004030C8 _ ll..(0..
db 55H, 53H, 45H, 52H, 33H, 32H, 2EH, 64H ; 004030D0 _ USER32.d
db 6CH, 6CH, 00H, 00H, 00H, 00H, 00H, 00H ; 004030D8 _ ll......
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004030E0 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004030E8 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004030F0 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004030F8 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403100 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403108 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403110 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403118 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403120 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403128 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403130 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403138 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403140 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403148 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403150 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403158 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403160 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403168 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403170 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403178 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403180 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403188 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403190 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403198 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004031A0 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004031A8 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004031B0 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004031B8 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004031C0 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004031C8 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004031D0 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004031D8 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004031E0 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004031E8 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004031F0 _ ........
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 004031F8 _ ........
2 ответа
Таблица импорта
Из руководства раздела 6.4.1:
Информация об импорте начинается с таблицы каталогов импорта, которая описывает оставшуюся часть информации об импорте. Таблица каталогов импорта содержит адресную информацию, которая используется для разрешения ссылок исправления на точки входа в образе DLL.
Каждая запись таблицы каталога импорта имеет вид
Offset Size Field
0 4 Import Lookup Table RVA
4 4 Time/Date Stamp
8 4 Forwarder Chain
12 4 Name RVA
16 4 Import Address Table RVA
Примечание: поскольку DLL могут быть загружены в разных местах памяти RVA
обозначает Относительный виртуальный адрес, который является адресом содержимого, после загрузки, относительно базы изображения
Импортировать таблицу поиска
Опять из документации:
Коллекция этих записей описывает весь импорт из изображения в данную DLL.
Эти поля содержат информацию о том, как должен обрабатываться импорт (порядковый номер против имени). Если он указывает импорт по порядковому номеру, то остальная часть записи в таблице содержит порядковый номер, в противном случае он содержит RVA для записи таблицы подсказок / имен.
Подсказка / Имя таблицы
Записи в таблице "Подсказка / Имя" имеют следующий формат:
Offset Size Field Notes
0 2 Hint Index into the Export Name Pointer Table
2 varies Name Null terminated ASCII string
* 0 or 1 Pad Each entry must be on an even boundary
Импорт таблицы адресов
Структура и содержание таблицы адресов импорта идентичны структуре таблицы поиска импорта, пока файл не будет связан. Во время связывания записи в таблице адресов импорта перезаписываются 32-битными (или 64-битными для PE32+) адресами импортируемых символов: эти адреса являются фактическими адресами памяти самих символов (хотя технически они все еще называется "виртуальные адреса"). Обработка привязки обычно выполняется загрузчиком.
Рекомендации
- Википедия о переносимых исполняемых файлах
- Официальная документация
- Полезные диаграммы Эро Карреры
Все приведенные выше цитаты и таблицы взяты из руководства Microsoft PE/COFF, указанного в ссылке 2.
Начнем с сильно упрощенной картинки:
На этом рисунке показана ситуация с вашим исполняемым файлом на диске . Они полностью идентичны, с одними и теми же списками имен функций API в одном и том же порядке.
(Хорошо, вы можете спросить: «Как можно разместить такие длинные имена в 4 байта?» Продолжайте читать, чтобы получить ответ; как я уже писал, мы начинаем с упрощенной картины.)
Теперь загрузчик загружает ваш исполняемый файл в память, поэтому изначально эти таблицы, скопированные в память, остаются идентичными. Но:
После загрузки / сопоставления всех необходимых DLL (динамически подключаемых библиотек) в память он уже знает адреса всех ваших импортированных функций, поэтому
он заменяет имена вашей импортированной функции во второй таблице (Import Address Table) на их адреса (только тогда имя «Import Address Table» соответствует ее содержимому).
Так ситуация в памяти становится иной:
Теперь ответ на (мой собственный) вопрос выше:
Как можно разместить такие длинные имена в 4 байта?
Конечно, это невозможно. В таблице поиска импорта есть только указатели (адреса) на имена.
И здесь вступает в игру третья таблица, таблица Import Hint / Name , цели этих указателей, поэтому реальность (вместо упрощения на первых двух картинках) выглядит так (я использовал адреса, соответствующие тем, что в вашем листинге):
До этого я отвечал только на свой вопрос, пора ответить на ваш:
Я понимаю, что такое IAT и INT, но что такое IT?
Таблица импорта, точнее таблица импорта записей, представляет собой массив (таблица) записей, одна запись (строка) для каждой импортированной библиотеки (в вашем случае 3 библиотеки, поэтому таблица имеет 3 строки).
Упрощенное изображение здесь:
Каждая строка состоит из 5 двойных слов (указателей). Важны только три из них: первая (указатель на ILT), последняя (указатель на IAT) и предпоследняя (идентифицирующая строку по имени DLL; так что это указатель на имя DLL. в таблице Подсказка / Имя).
Таким образом, его взаимодействие с двумя другими таблицами выглядит так:
(На этом рисунке я пропустил взаимодействие с третьей таблицей, уже упомянутой таблицей подсказок / имен .)
Примечание:
Я намеренно опускал разделительные строки с нулями на своих фотографиях для простоты и подчеркивания принципов.