【问题标题】:Import address table yields incorrect RVA for import name导入地址表为导入名称生成不正确的 RVA
【发布时间】:2012-01-05 07:41:21
【问题描述】:

我遇到了 Win32 NT 标头给我的导入名称奇怪的 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 中显示的进行了比较,它们是相同的,所以我不确定为什么 IMAGE_IMPORT_DESCRIPTORs 不正确。

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

【问题讨论】:

    标签: c++ winapi portable-executable


    【解决方案1】:

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

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

    importTableRVA - importSectionRVA + importSectionPhysicalAddress + pMemFile
    

    【讨论】:

    • 抱歉,您能进一步解释一下吗?我了解您所说的摘要,但是我不太了解“导入表”和“导入部分”之间的区别。
    • @Dylan:PE 文件分为多个部分,代码、数据、导入、导出等不同的部分。通常导入部分命名为“.idata”。但是文件中的section布局和加载模块的布局不一样,所以要调整地址。我建议阅读微软自己的文档:msdn.microsoft.com/en-us/windows/hardware/gg463125
    • @Dylan:为了澄清,导入部分通常包含导入表以及导入地址表,可能还有一些其他数据。该规范非常精简,因此任何部分都可以包含几乎任何内容。
    • 感谢您的澄清。经过一些快速研究,我似乎可以通过找到导入表 RVA 所在的部分,减去导入部分虚拟地址,然后添加部分 PointerToRawData 来找到表所在的偏移量。我永远不会猜到,谢谢!
    【解决方案2】:

    您的代码给人的印象是您正在检查已虚拟化(加载到内存中)的模块的 IAT,这意味着 IAT 将不包含 RVA,而是由 windows 加载程序将地址调整为所需的动态偏移量。

    然而,话虽如此,LordPE 报告的数据是可疑的,如果二进制模块实际上是有效的(即:windows 可以加载它并运行它),那么您可能正在处理一个混淆文件,否则二进制文件是否损坏或不是 win32 PE 文件。

    【讨论】:

    • 啊,我正在检查的模块作为内存映射文件加载到程序中,并且没有被Windows PE加载程序触及。我正在测试的模块是 notepad.exe,所以它没有被混淆。
    猜你喜欢
    • 2015-12-26
    • 2019-05-18
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多