PE格式,IAT目录有什么用

问题描述 投票:4回答:4

在PE格式中,我们有导入表目录(由IMAGE_DIRECTORY_ENTRY_IMPORT访问)和IAT目录(由IMAGE_DIRECTORY_ENTRY_IAT访问)都是可选标题数据目录的一部分。

使用Import Table,加载器可以动态加载和解析必要的库和函数。这是通过迭代导入地址表RVA(Thunk Table)来完成的,该表是导入表的一部分。

那么,如果我们使用导入目录进行导入解析,我们需要哪些IAT目录?

我一直在阅读Microsoft PE specification,但找不到答案。此外,SO中也存在一些问题,但大多数问题都使用IAT来引用Thunk表而不是IAT目录。

谢谢

编辑

我认为导入地址表(导入表目录中的字段)和导入地址表(称为IAT目录)之间存在混淆。我的问题是关于IAT目录。

再次感谢

windows portable-executable
4个回答
4
投票

在您链接的PE规范中,第5.4.4章对此进行了详细描述。它们是相同的表格:

导入地址表的结构和内容与导入查找表的结构和内容相同,直到绑定文件为止。在绑定期间,导入地址表中的条目将被正在导入的符号的32位(对于PE32)或64位(对于PE32 +)地址覆盖。这些地址是符号的实际内存地址,尽管从技术上讲它们仍称为“虚拟地址”。加载器通常处理绑定

也许解释为什么这样做是很重要的。 PE文件通过将其直接映射到内存而加载到进程中。底层操作系统原语是内存映射文件。这提供了几个重要的优化:

  • 可执行文件使用的内存不必由页面文件支持。如果操作系统需要另一个进程的RAM,则可以简单地丢弃映射到可执行文件的页面。当进程生成页面错误时,再从PE文件重新加载。
  • 进程用于其可执行代码的RAM可以由进程的任何实例共享。换句话说,当您多次启动Notepad.exe时,RAM中只有一个代码副本。每个进程共享相同的页面。这对于DLL来说尤为重要,特别是在每个进程中使用的操作系统DLL,如ntdll.dll,kernel32.dll和user32.dll(等等)。

当加载程序使用导入函数的实际地址填充IAT时,操作系统将重新映射IAT的页面并使其由页面文件支持。因此,每个进程都可以拥有自己的一组导入地址。包含代码和导入表的其余页面仍然是共享的。


2
投票

根据PE的文档,IAT / IMAGE_DIRECTORY_ENTRY_IAT似乎用于DLL的延迟加载

https://docs.microsoft.com/en-us/windows/desktop/Debug/pe-format#delay-import-address-table


1
投票

IMAGE_DIRECTORY_ENTRY_IMPORT最终导致多个IAT thunk,它存储在一个内存区域,从[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress开始,并且大小为[IMAGE_DIRECTORY_ENTRY_IAT].Size

我想当默认情况下将所有部分加载为只读时,它很有用,你可以使用IMAGE_DIRECTORY_ENTRY_IAT使IAT(但不是ILT)thunk可写。


0
投票

以下文章及其第一部分是有关PE可执行文件的信息的良好来源:

从2002年3月的MSDN杂志:Inside Windows

An In-Depth Look into the Win32 Portable Executable File Format, Part 2

© www.soinside.com 2019 - 2024. All rights reserved.