В чем разница между таблицей импорта, таблицей адресов импорта и таблицей имен импорта?

При разборке / выгрузке 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+) адресами импортируемых символов: эти адреса являются фактическими адресами памяти самих символов (хотя технически они все еще называется "виртуальные адреса"). Обработка привязки обычно выполняется загрузчиком.

Рекомендации

  1. Википедия о переносимых исполняемых файлах
  2. Официальная документация
  3. Полезные диаграммы Эро Карреры

Все приведенные выше цитаты и таблицы взяты из руководства 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. в таблице Подсказка / Имя).

Таким образом, его взаимодействие с двумя другими таблицами выглядит так:

(На этом рисунке я пропустил взаимодействие с третьей таблицей, уже упомянутой таблицей подсказок / имен .)


Примечание:

Я намеренно опускал разделительные строки с нулями на своих фотографиях для простоты и подчеркивания принципов.

Другие вопросы по тегам