Вопрос № 100869: Здравствуйте уважаемые эксперты.
Вопрос по поводу РЕ, в часности по таблице импорта.
Таблица импорта начинается с массива структур IMAGE_IMPORT_DESCRIPTOR:
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD Characteristics;...
Вопрос № 100.869
Здравствуйте уважаемые эксперты.
Вопрос по поводу РЕ, в часности по таблице импорта.
Таблица импорта начинается с массива структур IMAGE_IMPORT_DESCRIPTOR:
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD Characteristics; // 0 for terminating null import descriptor
DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
};
DWORD TimeDateStamp; // 0 if not bound,
// -1 if bound, and real date ime stamp
// in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
// O.W. date/time stamp of DLL bound to (Old BIND)
DWORD ForwarderChain; // -1 if no forwarders
DWORD Name;
DWORD FirstThunk; // RVA to IAT (if bound this IAT has actual addresses)
} IMAGE_IMPORT_DESCRIPTOR;
typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
Кол-во структур нигде не указывается,
но каждый эллемент массива соответствует DLL, из которой импортируются функции. Во всей доступной мне документации четко говорится, что первый эллемент последнего члена массива нулевой. Так оно и есть, но в некоторых модулях(по моим наблюдениям это приложения собраные линкерами фирмы Борланд), во всех членах массива первый эллемент нулевой. Вопрос собственно в следующем: как загрузчик определяет какая структура
последняя в массиве.
Отправлен: 05.09.2007, 02:16
Вопрос задал: Egugondiy (статус: 1-ый класс)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Sov
Здравствуйте, Egugondiy!
Конец массива определяет структура с полями заполненными нулями. Т.е. размер структуры IMAGE_IMPORT_DESCRIPTOR 20 байт и в конце массива 20 байт нулей.
Поля OriginalFirstThunk и FirstThunk содержат RVA двух разных массивов структур IMAGE_THUNK_DATA. Оба массива абсолютно одинаковы (OriginalFirstThunk равно нулю, если применялся компоновщик борланд). При загрузке образа в память элементы массива FirstThunk заменяются адресами соответсвующих функций.
http://www.wasm.ru/article.php?article=1002006
Ответ отправил: Sov (статус: 6-ой класс)
Ответ отправлен: 05.09.2007, 07:37 Оценка за ответ: 5 Комментарий оценки: Спасибо большое.
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Egugondiy!
Почитайте статью: Формат РЕ, глава: Импортирование в РЕ-файлах.
Компиляторы Борланд создают только один массив: FirstThunk.
Удачи!
--------- И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Специалист)
Ответ отправлен: 05.09.2007, 14:50 Оценка за ответ: 5 Комментарий оценки: Я уже разобрался но все равно спасибо.