Реферат: Вызов функции в другом процессе

Секция экспорта начинается со структуры IMAGE_EXPORT_DIRECTORY.

typedef struct _IMAGE_EXPORT_DIRECTORY {

...

DWORD Base;

DWORD NumberOfFunctions;

DWORD NumberOfNames;

DWORD AddressOfFunctions; // RVA from base of image

DWORD AddressOfNames; // RVA from base of image

DWORD AddressOfNameOrdinals; // RVA from base of image

} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

Здесь:

AddressOfFunctions – RVA (смещение от начала файла) массива, содержащего RVA функций.

AddressOfNames – RVA массива, содержащего RVA имён функций.

AddressOfNameOrdinals – RVA массива индексов функций. Элемент n этого массива содержит индекс в массиве адресов функций, соответствующей n-ному элементу в массиве имён функций.

ПРЕДУПРЕЖДЕНИЕ

Во-первых, элементы этого массива имеют тип WORD и размер 2 байта.

Во-вторых, MSDN и статья Мэтта Питрека «Форматы PE и COFF объектных файлов» содержат одну и туже ошибку, относящуюся к интерпретации содержимого этого массива. Правильно написано в статье Максима М. Гумерова «Загрузчик PE-файлов» и здесь :)

NumberOfFunctions – количество элементов массива адресов функций.

NumberOfNames – количество элементов массива имён функций и массива индексов функций.

Base – базовое значение ординала экспортируемых функций. Для получения индекса функции, экспортируемой по ординалу, надо вычесть из её ординала значение Base.

В результате, для поиска адреса функции, экспортируемой по имени, нужно сделать примерно следующее (в псевдокоде):

// Ищем в массиве имён функций совпадающее имя

int nameIndex = FindFunctionName(AddressOfNames, NumberOfNames, name);

// Получаем соответствующий имени индекс функции

WORD funcIndex = AddressOfNameOrdinals[nameIndex];

// Получаем RVA функции

DWORD funcRVA = AddressOfFunctions[funcIndex];

ПРЕДУПРЕЖДЕНИЕ

По MSDN и Питреку, последняя строчка алгоритма должна выглядеть так:

К-во Просмотров: 370
Бесплатно скачать Реферат: Вызов функции в другом процессе