gpt4 book ai didi

c++ - 导入地址表为导入名称生成不正确的 RVA

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:06 26 4
gpt4 key购买 nike

我在使用 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_DESCRIPTOR 不正确。

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

最佳答案

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

所以你想要的实际地址是这样的:

importTableRVA - importSectionRVA + importSectionPhysicalAddress + pMemFile

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com