C / C ++ назначить адрес указателя массива DWORD

Я программирую библиотеку синтаксического анализа C / C ++ PE, где я использую DLL или exe для извлечения информации о каталогах и заголовках. Моя проблема в том, что когда я извлекаю адрес экспорта и получаю адрес функций, я не знаю, как использовать этот адрес, чтобы указать его массиву с количеством экспортируемых функций экспорта

DWORD ExportRVA = PEHeader->optional.data_directory[0].virtual_address;
image_export_directory* Exports = (image_export_directory*)(RVAToOffset(ExportRVA)+BaseAddress);

ExportTable.nNames = Exports->number_of_names;
ExportTable.nFunctions = Exports->number_of_functions;
ExportTable.pFunctions = Exports->address_of_functions;
ExportTable.nNames = Exports->address_of_names;
ExportTable.pNamesOrdinals = Exports->address_of_name_ordinals;

Должен ли я назначить указатель на массив, как

DWORD * AddrFunctions;

изменить адрес указателя?

0

Решение

address_of_functions а также address_of_names поля представляют собой RVA для массивов RVA для фактических точек входа и имен функций, тогда как address_of_name_ordinals Поле представляет собой RVA для массива значений WORD, например:

#define RVAToPtr(RVA) ( ((LPBYTE)BaseAddress) + ((DWORD)(RVA)) )

image_export_directory* Exports = (image_export_directory*) RVAToPtr(PEHeader->optional.data_directory[0].virtual_address);

ExportTable.nFunctions = Exports->number_of_functions;
ExportTable.nNames = Exports->number_of_names;
ExportTable.pFunctions = (PDWORD) RVAToPtr(Exports->address_of_functions);
ExportTable.pNames = (PDWORD) RVAToPtr(Exports->address_of_names);
ExportTable.pNamesOrdinals = (PWORD) RVAToPtr(Exports->address_of_name_ordinals);

for (DWORD i = 0; i < ExportTable.nFunctions; ++i)
{
void *FuncPtr = (void*) RVAToPtr(ExportTable.pFunctions[i]);
char* FuncName = (char*) RVAToPtr(ExportTable.pNames[i]);
WORD FuncOrdinal = ExportTable.Base + ExportTable.pNamesOrdinals[i];
...
}

Ссылаться на MSDN Больше подробностей.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]