简体   繁体   English

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

[英]C/C++ assign pointer address of DWORD array

I am programming a C/C++ PE Parsing library where I use DLL or exe to extract info about directories and headers. 我正在编程一个C / C ++ PE解析库,在其中使用DLL或exe提取有关目录和标头的信息。 My prblem is when I extract the export address and get the address of functions, I don't know how to use that address to point it to the array with the number of export functions exported 我的问题是当我提取导出地址并获取函数的地址时,我不知道如何使用该地址将其指向具有导出的导出函数数量的数组

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;

Do I have to assign a pointer to array like 我是否必须分配一个指向数组的指针,例如

DWORD * AddrFunctions;

changing the pointer address? 改变指针地址?

The address_of_functions and address_of_names fields are RVAs to arrays of RVAs to the actual function entry points and names, respectively, whereas the address_of_name_ordinals field is an RVA to an array of WORD values, eg: 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]; 
    ...
}

Refer to MSDN for more details. 有关更多详细信息,请参考MSDN

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM