Вопрос Как работает импорт в exe файлах ?


yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
50
Репутация
3
Привет всем ! Кто может подсказать, на каком моменте записываются адреса в Import Table ? И как это вообще происходит ? Вот допустим , я написал свой код, который использует MessageBox для вывода сообщения "Hello World!" , далее линукуются либы , для MessageBox ликуется user32.dll. Дальше , что ? Загрузчик достает адреса через Export Table ? Он их записывает в IAT ?
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 182
Репутация
8 316
При линковке динамических библиотек (DLL), линковщик ничего не линкует, линковка происходит только со статическими библиотеками.
Но...

В процессе линковки линкер не знает фактические адреса функций из внешних DLL (например, user32.dll), поэтому он создает таблицу импортов (Import Table) в исполняемом файле.
Эта таблица содержит список всех функций и DLL, которые необходимо импортировать.

Вот...

Когда запускается исполняемый файл, загрузчик операционной системы (Windows Loader) начинает процесс загрузки образа приложения в память.
Загрузчик анализирует Import Table исполняемого файла, чтобы определить, какие DLL необходимо загрузить.

Да и есть ещё Import Address Table (IAT) - Это секция в исполняемом файле, предназначена для хранения адресов функций после их разрешения, изначально она заполнена нулями.
После того как адрес функции найден, загрузчик записывает этот адрес в соответствующую запись в IAT вашего процесса.

И когда прога исполняется, она обращается к адресам в IAT и тем самым узнаёт адрес нужной функции.
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 182
Репутация
8 316
Это называется позиционно независимый код.)
 

yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
50
Репутация
3
Загрузчик анализирует Import Table исполняемого файла, чтобы определить, какие DLL необходимо загрузить.
Получается , когда загрузчик, загружает образ в память, он анализирует таблицу импорта, видит какие функции и DLL нужно загрузить, записывает адреса в IAT ( если я правильно понял ), потом эти адреса резолвятся к нужным функциям , и все работает ? Поправь , если я правильно все понял
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 182
Репутация
8 316
Да всё правильно.

В ассеблере что-то такое будет, через косвенный вызов:

Код:
; Вызов MessageBox через IAT
call [__imp__MessageBoxA]

Вот __imp__MessageBoxA указатель на нужный адрес в таблице IAT, изначально это какой-то невалидный адрес (Нулевой будет), пока загрузчик не найдет адрес функции.
 

yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
50
Репутация
3
Да всё правильно.

В ассеблере что-то такое будет, через косвенный вызов:

Код:
; Вызов MessageBox через IAT
call [__imp__MessageBoxA]

Вот __imp__MessageBoxA указатель на нужный адрес в таблице IAT, изначально это какой-то невалидный адрес (Нулевой будет), пока загрузчик не найдет адрес функции.
Супер! Спасибо большое
 

Spectrum735

Просветленный
Просветленный
Регистрация
21.02.2019
Сообщения
297
Репутация
175

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 182
Репутация
8 316
А если намеренно исказить IAT, поломается всё?
Да, произойдет переход либо на невалидный адрес, либо можно специально подменить на нужный адрес.
Так кстати иногда через уязвимости исполняют вредоносный код.)
 
Верх Низ