C/C++ 分配 DWORD 数组的指针地址

C/C++ assign pointer address of DWORD array

本文关键字:指针 地址 数组 DWORD C++ 分配      更新时间:2023-10-16

我正在编写一个C/C++ PE解析库,在其中我使用DLL或exe来提取有关目录和标头的信息。我的 prblem 是当我提取导出地址并获取函数地址时,我不知道如何使用该地址将其指向导出函数数量的数组

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;

更改指针地址?

address_of_functionsaddress_of_names 字段分别是 RVA 数组到实际函数入口点和名称的 RVA,而 address_of_name_ordinals 字段是 WORD 值数组的 RVA,例如:

#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