Дизайн таблицы экспорта PE - PullRequest
3 голосов
/ 28 ноября 2011

Я только что прошел [1] и заметил следующую выдержку:

"требования для экспорта функции - это имя, адрес и порядковый номер экспорта. Можно подумать, что дизайнеры формата PE поместил бы все эти три элемента в структуру, а затем иметь массив этих структур. "" Вместо этого, каждый компонент экспортированная запись является элементом в массиве. Есть три из них массивы (AddressOfFunctions, AddressOfNames, AddressOfNameOrdinals), и все они параллельны друг другу. "

Мне любопытно, почему он реализован как три разных массива, а не как структура из трех указателей.

Спасибо!

[1] [http://msdn.microsoft.com/en-us/library/ms809762.aspx][1]

1 Ответ

2 голосов
/ 28 ноября 2011

Да, эта структура несколько сложна. Помимо исторических причин, он, вероятно, был оптимизирован для доступа к импортированным символам по порядковым номерам (а не по именам).

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

OTOH, если у вас есть только имя символа, AddressOfNames - это RVA для массива, содержащего указатели на имена символов строки ascii. Вы должны найти символ, а затем использовать найденный индекс в массиве, указанном AddressOfNameOrdinals, это даст вам порядковый номер символа.

...