Сверхбыстрый импорт API-функций

       

Коварство и любовь от Microsoft


Рассмотрим устройство стандартной таблицы импорта. На вершине иерархии находится структура ImportDirectory Table, представляющая собой массив структур IMAGE_IMPORT_DESCRIPTOR, завершаемых нулевым элементом. Каждый IMAGE_IMPORT_DESCRIPTOR содержит ссылки на две подчиненные структуры – lookup-таблицу, содержащую имена и/или ординалы импортируемых функций (Import Name Table), и таблицу импортируемых адресов (Import Address Table), так же известную как Thunk Table. В процессе загрузки файла сюда записываются эффективные адреса импортируемых функций.

Обе таблицы представляют собой массив 32-битных элементов, индексы которых взаимно соответствуют друг другу. То есть, если необходимая нам функция some_func находится в i?элементе lookup-таблицы, тогда (после загрузки файла в память) i-индекс таблицы импортируемых адресов будет содержать эффективный виртуальный адрес some_func.

typedef struct _IMAGE_IMPORT_DESCRIPTOR {

union {

       DWORD  Characteristics;     // 0 for terminating null import descriptor

       DWORD  OriginalFirstThunk;  // RVA to original unbound IAT

       };

       DWORD  TimeDateStamp;             // 0 if not bound,

                                  // -1 if bound, and real date\time stamp

                                  // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new)

                                  // O.W. date/time stamp of DLL bound to (old)

       DWORD  ForwarderChain;      // -1 if no forwarders

       DWORD  Name;

       DWORD  FirstThunk;          // RVA to IAT

} IMAGE_IMPORT_DESCRIPTOR;



Содержание раздела