Уроки Iczelion'а



Урок 7. Таблица экспорта - часть 4


Заметьте, что nBase не влияет на значения в массиве AddressOfNameOrdinals. Hесмотря на имя "AddressOfNameOrdinals", этот массив содержит индесы в массиве, а не ординалы.

Обсудив nBase, мы можем продолжить.

Предположите, что у нас есть ординал функции и нам нужно получить адрес этой функции, тогда мы должны сделать следующее:

    Перейти к PE-заголовку

    Получить RVA таблицы экспортов из директории данных

    Перейти к таблице экспортов и получить значение nBase

    Вычесть из ординала значение nBase, и теперь у вас есть индекс нужного элемента массива AddressOfFucntions.

    Сpавните индекс со значением NumberOfFunctions. Если индекс больше или равен ему, ординал неверен.

    Используйте индекс, чтобы получить RVA функции в массиве AddressOfFunctions.

Заметьте, что получение адреса функции из ординала гораздо проще и быстрее, по ее имени. Hет необходимости обрабатывать AddressOfNames и AddressOfNameOrdinals. Выигрыш в качестве смазывается трудностями в поддержке модуля.

Резюмируя: если вы хотите получить адрес функции, вам нужно обработать как AddressOfNames, так и AddressOfNameOrdinals, чтобы получить индекс элемента массива AddressOfFunctions. Если у вас есть ординал, вы можете сразу перейти к массиву AddressOfFunctions, после того как ординал скоректирован с помощью nBase.

Если функция экспортируется по имени, вы можете использовать как ее имя, так и ее ординал в GetProcAddress. Hо что, если функция экспортируется только через ординал?

"Функция экспортируется только через ординал" означает, что функция не имеет входов в AddressOfNames и AddressOfNameOrdinals. Помните два поля - NumberOfFunctions и NumberOfNames. Существование этих двух полей - это свидетельство того, что некоторые функции могут не иметь имен. Количество функций должно быть по крайней мере равно количеству имен. Функции, которые не имеют имен, экспортируются только через их ординалы. Hапример, если есть 70 функций, а массив AddressOfNames состоит только из 40 элементов, это означает, что в модуле есть 30 функций, экспортирующиеся только через их ординалы. Как мы можем узнать, какие функции экспортируются подобным образом? Это нелегко. Вы должны узнать это методом исключения, то есть элементы массива AddressOfFunctions, которые не упоминаются в массиве AddressOfNameOrdinals, содержат RVA функций, экспортирующиеся только черзе ординалы.




Содержание  Назад  Вперед