2012-09-26 32 views
0

我正在编写一个C/C++ PE解析库,我使用DLL或exe来提取有关目录和头文件的信息。我prblem是当我解压的出口地址,并得到函数的地址,我不知道如何使用该地址指向它与导出功能数量阵列导出C/C++分配DWORD数组的指针地址

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; 

更改指针地址?

回答

1

address_of_functionsaddress_of_names字段的RVAs到的RVAs的阵列以分别实际函数入口点和名称,而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了解更多详情。

+0

你是否认为PDWORD * pFunctions; \t PDWORD * pNames; \t PWORD * pNamesOrdinals; ? –

+1

不,我没有。 'pFunctions'和'pNames'需要是'PDWORD'而不是'PDWORD *','pNamesOrdinals'需要'PWORD'而不是'PWORD *'。 –

+0

FuncName不打印函数名称:/ –