Таблица импорта¶
Таблица импорта — это структура данных в формате исполняемых файлов Windows (PE/COFF), которая содержит список динамически подключаемых библиотек (DLL) и имена функций (или ординалы), используемых программой при запуске. Таблица импорта является обязательным компонентом большинства исполняемых файлов Windows и служит связующим звеном между кодом приложения и экспортируемыми функциями системных или сторонних библиотек.
¶Назначение и принцип работы
При загрузке исполняемого файла операционная система Windows анализирует таблицу импорта, чтобы определить, какие библиотеки необходимо загрузить в адресное пространство процесса. Для каждой указанной DLL загрузчик выполняет поиск файла библиотеки по стандартному алгоритму (сначала каталог приложения, затем системные каталоги), загружает её в память и связывает адреса импортируемых функций с соответствующими точками входа в коде программы.
Таблица импорта решает задачу разрешения внешних ссылок на этапе загрузки. Это позволяет программам использовать общий код из библиотек без статического копирования, что уменьшает размер исполняемых файлов и упрощает обновление компонентов системы.
¶Структура таблицы импорта
Таблица импорта состоит из нескольких ключевых элементов:
- IMAGE_IMPORT_DESCRIPTOR — массив структур, по одной на каждую импортируемую DLL. Каждая структура содержит поля: имя библиотеки (DLLName), указатели на массивы функций (OriginalFirstThunk и FirstThunk), дату/время, порядковый номер.
- IMAGE_THUNK_DATA — массив записей, каждая из которых описывает одну импортируемую функцию. Запись может содержать либо имя функции (через указатель на структуру IMAGE_IMPORT_BY_NAME), либо порядковый номер (ординал).
- IMAGE_IMPORT_BY_NAME — структура, содержащая порядковый номер функции и её имя в виде ASCII-строки.
Поле FirstThunk играет особую роль: загрузчик Windows модифицирует этот массив в памяти, заменяя записи реальными адресами импортированных функций. Таким образом, код программы обращается к функциям через косвенный вызов по адресу из таблицы.
¶Типы импорта
Различают два основных способа импорта функций:
- Импорт по имени — наиболее распространённый способ. В таблице указывается текстовое имя функции (например,
MessageBoxW). Загрузчик сопоставляет имя с экспортом DLL. - Импорт по ординалу — используется реже, предполагает указание числового номера функции в экспортной таблице DLL. Такой способ быстрее, но менее устойчив к изменениям в библиотеке.
Кроме того, существует отложенный импорт (delay-load import), реализуемый через специальную вспомогательную функцию. В этом случае библиотека загружается не при старте процесса, а при первом обращении к импортируемой функции, что ускоряет запуск приложения.
¶Значение для безопасности
Таблица импорта является важным объектом анализа в области информационной безопасности. По ней специалисты определяют, какие API-функции использует вредоносная программа, что позволяет выявить её поведение (например, работа с сетью, шифрование, манипуляции с процессами). Многие антивирусные продукты и статические анализаторы (такие как PEiD, CFF Explorer, Dependency Walker) используют данные таблицы импорта для быстрой эвристической оценки файла.
Существует техника обфускации, называемая импорт-адресация (import address table hooking) или скрытие импорта, когда вредоносное ПО динамически получает адреса функций через GetProcAddress, чтобы затруднить статический анализ. Также применяется ручное восстановление таблицы импорта после упаковки исполняемого файла.
¶Отличие от таблицы экспорта
Таблица импорта тесно связана с таблицей экспорта, но выполняет противоположную функцию. Если таблица импорта описывает, что программа берёт из внешних DLL, то таблица экспорта определяет, какие функции сама DLL предоставляет другим модулям. В совокупности эти две таблицы образуют интерфейс взаимодействия между компонентами Windows.
¶Применение в разработке
Для разработчиков таблица импорта формируется автоматически компоновщиком при сборке проекта. Управление импортом осуществляется через директивы #pragma comment(lib, ...) в Visual C++ или параметры компоновщика в других инструментах. Существуют утилиты для редактирования таблицы импорта готовых файлов (например, ImpREC, Scylla), применяемые при восстановлении упакованных или повреждённых исполняемых файлов.
¶Источники
- Русскоязычная документация Microsoft по формату PE/COFF.
- Материалы сайта MSDN (Microsoft Developer Network) о структурах IMAGE_IMPORT_DESCRIPTOR и IMAGE_THUNK_DATA.
- Книга М. Руссиновича и Д. Соломона «Внутреннее устройство Microsoft Windows».
- Статьи по анализу вредоносного ПО (OpenNET, Habr) о методах восстановления таблиц импорта.