Экспорт объектовЭто механизм, обеспечивающий операцию, обратную к импорту. При помощи него динамические библиотеки предоставляют необходимую служебную информацию о процедурах и функциях, которыми «согласны поделиться» с другими программами. Например, системная библиотека «KERNEL32. DLL» в разных версиях Windows содержит от нескольких сотен до нескольких тысяч таких «общедоступных» функций. Могут ли программы и динамические библиотеки одновременно импортировать и экспортировать функции? Да, могут. Например, исполняемые программы, подготовленные для работы под управлением отладчика, кроме вполне естественного импорта, также экспортируют несколько функций, которыми этот отладчик будет пользоваться. А динамическая библиотека «KERNEL32.DLL» из Windows NT почти все экспортируемые функции предварительно импортирует из другой библиотеки «NTDLL. DLL», где они на самом деле и реализованы. Разбор механизма экспорта следует начинать с оглавления, позиция которого определяется содержимым поля «ExportTableRVA» заголовка программы. Это оглавление и все служебные таблицы, описывающие экспорт, часто компактно располагаются в одной из секций, но существует немало динамических библиотек и программ, в которых это не так. Структура оглавления:

Наиболее важны для нас поля «AddressOfFunctions», «Address — OfNames» и «AddressOfNameOrdinals». Они содержат адреса таблиц, описывающих экспортируемые функции. Взаимодействие данных, размещенных в этих таблицах, можно представить следующим образом: Как было нами рассмотрено ранее, импортирующая программа для доступа к интересующей функции может указать как ее имя, так и ординал. Соответственно, механизм экспорта основан на двух таблицах, одна из которых содержит 32-битовые указатели на строковые имена функций, а другая — 16-битовые порядковые номера. Эти таблицы содержат по «NumberOfNames» записей и «синхронны», то есть записи с одинаковым индексом описывают одну и ту же функцию. Сканируя их параллельно, можно по имени функции узнать ее порядковый номер, а по порядковому номеру — имя. Порядковый номер функции — это ее индекс в «Таблице адресов функций». Именно этот индекс и считается «ординалом», по которому выполняется экспорт функций.

Еще интересные статьи :