8

替代文字

有谁知道区别?

4

3 回答 3

7

如果你想玩 Portable Executables,就没有办法获取specs的副本。

已经有一段时间了,但如果我没有记错的话:IT 和 IAT 是相同的,除了 IAT 在解析导入时由 PE-loader 填充- 但不要相信我的话,请检查规格 :)

编辑:

快速浏览了规范,并刷新了我的记忆:导入表是主结构,每个要从中导入的 DLL 都有一个条目。除其他外,每个条目都包含一个导入查找表( ILT ) 和导入地址表( IAT ) 指针(iirc 这些过去被称为OriginalFirstThunkand FirstThunk)。ILT 和 IAT 表在磁盘上是相同的,但在运行期间 IAT 将填充导入函数的内存地址。

如果您希望能够处理非标准的 EXE,PE 标头 IAT 字段可能不能 100% 依赖,就像您不能依赖代码和数据指针的开始/大小一样。最好忽略 IAT 标头字段并改为解析 IT。此外,在解析 IT 时,某些可执行文件会缺少 ILT,只有 IAT - 旧的 bo​​rland (iirc) 链接器因不生成 ILT 而臭名昭著。

编辑 2:定义

  • IT:导入表(PeCoff 第 6.4.1 节)- 每个 DLL 的表IMAGE_IMPORT_DESCRIPTOR
  • ILT:导入查找表(PeCoff 第 6.4.2 节)- 每次导入的表IMAGE_THUNK_DATA
  • IAT:导入地址表(PeCoff 第 6.4.4 节) - 磁盘上:与 ILT 相同,运行时:填充导入的函数内存地址。
于 2010-09-27T06:58:14.843 回答
2

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

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

BTW,ILT 和 IAT 在绑定 DLL 时可以有不同的内容。在这种情况下,IAT thunk 包含导入函数的预先计算的地址。

于 2015-08-25T04:29:40.247 回答
1

@snemarch 基本上是正确的,尽管我认为他和文档都是错误的,即 ILT 和 IAT 在磁盘上是相同的。我查看了字节,它们不一样。

不过,他对表格的定义和用途是正确的。

Windows 加载程序使用 ILT(导入查找表)将 EXE 使用的函数与它们在 DLL 中的地址相关联。但是,一旦建立这种关联,DLL 中的地址就会被写入 EXE 中的 IAT(导入地址表)。加载 EXE 后,它不再需要 ILT,当它调用 DLL 中的函数时,它指向 IAT。

于 2015-01-13T13:39:09.210 回答