在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目录。
再次感谢
在您链接的PE规范中,第5.4.4章对此进行了详细描述。它们是相同的表格:
导入地址表的结构和内容与导入查找表的结构和内容相同,直到绑定文件为止。在绑定期间,导入地址表中的条目将被正在导入的符号的32位(对于PE32)或64位(对于PE32 +)地址覆盖。这些地址是符号的实际内存地址,尽管从技术上讲它们仍称为“虚拟地址”。加载器通常处理绑定
也许解释为什么这样做是很重要的。 PE文件通过将其直接映射到内存而加载到进程中。底层操作系统原语是内存映射文件。这提供了几个重要的优化:
当加载程序使用导入函数的实际地址填充IAT时,操作系统将重新映射IAT的页面并使其由页面文件支持。因此,每个进程都可以拥有自己的一组导入地址。包含代码和导入表的其余页面仍然是共享的。
根据PE的文档,IAT / IMAGE_DIRECTORY_ENTRY_IAT似乎用于DLL的延迟加载
https://docs.microsoft.com/en-us/windows/desktop/Debug/pe-format#delay-import-address-table
IMAGE_DIRECTORY_ENTRY_IMPORT
最终导致多个IAT thunk,它存储在一个内存区域,从[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress
开始,并且大小为[IMAGE_DIRECTORY_ENTRY_IAT].Size
。
我想当默认情况下将所有部分加载为只读时,它很有用,你可以使用IMAGE_DIRECTORY_ENTRY_IAT
使IAT(但不是ILT)thunk可写。
以下文章及其第一部分是有关PE可执行文件的信息的良好来源:
从2002年3月的MSDN杂志:Inside Windows
An In-Depth Look into the Win32 Portable Executable File Format, Part 2