我在使用Win32 NT header 时遇到麻烦,给我输入名称的奇数RVA。这是给我这个问题的相关代码:

//Get a pointer to the import table
PIMAGE_IMPORT_DESCRIPTOR piidImportTableAddr;
piidImportTableAddr = (PIMAGE_IMPORT_DESCRIPTOR)(pImgNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + (DWORD)pMemFile);

while(piidImportTableAddr->Name != 0)
{
    //Itterate over every IMAGE_IMPORT_DESCRIPTOR structure, extracting the names of the DLLs to import
    char* name = (char*)((DWORD)piidImportTableAddr->Name + (DWORD)pMemFile);

    //Do nothing for now

    piidImportTableAddr++;
}

但是,piidImportTableAddr结构的成员包含的地址是错误的指针,这是成员的表:
Characteristics 0x42746553
OriginalFirstThunk 0x42746553
TimeDateStamp 0x646f4d6b
ForwarderChain 0x02260065
Name 0x54746547
FirstThunk 0x4d747865

这些都是不良的RVA和内存位置。通过这种方法查找DLL名称时,我做错什么了吗?我已经将导入表的RVA与PE Lord中显示的RVA进行了比较,它们是相同的,所以我不确定为什么IMAGE_IMPORT_DESCRIPTORs不正确。

这是完整的源代码链接:http://pastebin.com/32MBEvWU

最佳答案

您具有导入表的RVA,但是由于尚未加载模块,因此各节仍位于其物理位置。导入节的物理偏移量通常与RVA不同。您将必须遍历节标题(_IMAGE_SECTION_HEADER),并使用VirtualAddressVirtualSize值找到包含导入表的节。然后从PointerToRawData获取该部分的物理地址。

因此,您想要的实际地址是这样的:

importTableRVA - importSectionRVA + importSectionPhysicalAddress + pMemFile

关于c++ - 导入地址表产生不正确的RVA输入名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8251936/

10-11 22:14