IMAGE_EXPORT_DIRECTORY и iertutil.dll (IE 8).
От: IRabinovich  
Дата: 12.12.14 16:31
Оценка:
Всем доброго времени суток!

Наблюдаю странное явление с экспортом iertutil.dll (IE8)- кроме того, что её Base не равен единице, так и размер AddressOfNameOrdinals явно меньше заявленного в NumberOfFunctions, а само поле NumberOfFunctions явно как-то великовато, согласно HIEW, ну нету там 681 экспортируемой функции, их значительно меньше. Порядок ординалов тоже какой-то странный. Как такое может быть? Стандартные методы работы с экспортом этой dll-ки терпят крах (в прямом смысле этого слова).
Re: IMAGE_EXPORT_DIRECTORY и iertutil.dll (IE 8).
От: ononim  
Дата: 12.12.14 20:07
Оценка:
IR>Наблюдаю странное явление с экспортом iertutil.dll (IE8)- кроме того, что её Base не равен единице, так и размер AddressOfNameOrdinals явно меньше заявленного в NumberOfFunctions, а само поле NumberOfFunctions явно как-то великовато, согласно HIEW, ну нету там 681 экспортируемой функции, их значительно меньше. Порядок ординалов тоже какой-то странный. Как такое может быть? Стандартные методы работы с экспортом этой dll-ки терпят крах (в прямом смысле этого слова).
Когда ищете ф-ю по имени — вначале идете по AddressOfNames в цикле от 0 до NumberOfNames, если находите совпадающую по имени запись, идете и берете AddressOfNameOrdinals[найденный индекс], этот дворд — индекс в таблице AddressOfFunctions, т.е. итоговый RVA будет AddressOfFunctions[AddressOfNameOrdinals[найденный в AddressOfNames индекс]], то есть факт того что NumberOfFunctions>NumberOfNames совершенно не должен вам мешанть.
Как много веселых ребят, и все делают велосипед...
Re[2]: IMAGE_EXPORT_DIRECTORY и iertutil.dll (IE 8).
От: IRabinovich  
Дата: 13.12.14 13:42
Оценка:
Здравствуйте, ononim, Вы писали:

O>Когда ищете ф-ю по имени


Если бы мне нужно было экспортировать по имени, то проблем бы не было, именно так я и написал бы свой код. Однако, мне нужно перечислить все экспортируемые функции из dll, многие из них вообще не имеют экспорта по имени только по ординалу. Так что вопрос всё ещё актуален.
Re[3]: IMAGE_EXPORT_DIRECTORY и iertutil.dll (IE 8).
От: Jordev  
Дата: 19.01.15 17:50
Оценка: 8 (2)
Здравствуйте, IRabinovich, Вы писали:

IR>Здравствуйте, ononim, Вы писали:


O>>Когда ищете ф-ю по имени


IR>Если бы мне нужно было экспортировать по имени, то проблем бы не было, именно так я и написал бы свой код. Однако, мне нужно перечислить все экспортируемые функции из dll, многие из них вообще не имеют экспорта по имени только по ординалу. Так что вопрос всё ещё актуален.


Постараюсь объяснить по-порядку:

>AddressOfNameOrdinals явно меньше заявленного в NumberOfFunctions

В экспорте есть 4 вида функций:
1. Экспортируемые по имени
2. Экспортируемые по ординалу
3. Форварды
4. Бекварды

1. Как находится функция по имени вам описали постом выше.
2. Функция по ординалу находится еще проще. Мы просто перем нужный ординал, и, используя его в качестве индекса считываем указатель с таблицы адресов.
3. Форвард — ситуация, когда экспортируемая апи не имеет собственного адреса, а является заглушкой-переходником на другую АПИ. Многочисленные xxxGetLastError являются форвардами на GetLastError из kernel32.dll, а та в свою очередь на RtlGetLastWin32Error в ntdll.dll
Форвард обнаруживается просто. Если адрес функции >= начала таблицы экспорта, но < окончания таблицы экспорта — то там форвард.
Форвард-запись хранится в формате modname.funcname. Например NTDLL.RtlGetLastWin32Error
4. Беквард — ситуация обратная форварду. Экспорт заполняется позже сторонним модулем.


При перечислении функций в особо-запущенных случаях корректно сделать следующим образом:
1. Пройтись по таблице имен и составить список функций (ординалы, адреса)
2. Пройтись по таблице ординалов и добавить в уже составленный список отсутсвующие функции

Если встречаете на пути форвард, то парсите строчку (до точки — имя модуля, после — имя функции), подгружаете модуль и получаете адрес с подгруженного модуля.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.