gpt4 book ai didi

windows - PE格式,IAT目录有什么用

转载 作者:可可西里 更新时间:2023-11-01 13:54:43 27 4
gpt4 key购买 nike

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

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

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

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

谢谢

编辑

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

再次感谢

最佳答案

它在您链接的 PE 规范第 5.4.4 章中有很好的描述。它们是相同的表:

The structure and content of the import address table are identical to those of the import lookup table, until the file is bound. During binding, the entries in the import address table are overwritten with the 32-bit (for PE32) or 64-bit (for PE32+) addresses of the symbols that are being imported. These addresses are the actual memory addresses of the symbols, although technically they are still called “virtual addresses.” The loader typically processes the binding

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

  • 可执行文件使用的内存不必由分页文件支持。如果操作系统需要 RAM 用于另一个进程,则可以简单地丢弃映射到可执行文件的页面。当进程产生页面错误时从 PE 文件重新加载。

  • 进程用于其可执行代码的 RAM 可以由进程的任何实例共享。换句话说,当您多次启动 Notepad.exe 时,RAM 中只有 一个 代码副本。每个进程共享相同的页面。这对于 DLL 尤其重要,尤其是在每个进程中使用的操作系统 DLL,例如 ntdll.dll、kernel32.dll 和 user32.dll(等等)。

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

关于windows - PE格式,IAT目录有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20663542/

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