PE的日期目录中的“导入表地址”和“导入地址表地址”有什么区别?

时间:2010-09-27 06:33:36

标签: portable-executable datadirectory

alt text

任何人都知道其中的差异吗?

2 个答案:

答案 0 :(得分:6)

如果您想使用Portable Executables,则无法获取the specs的副本。

已经有一段时间了,但是如果内存正确地为我服务: IT和IAT是相同的,除了在解析导入时由PE-loader填充IAT - 但是不接受我的话为此,检查规格:)

编辑:

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

如果您希望能够处理非标准EXE,那么PE头IAT字段可能不能依赖于100%,就像您不能依赖于代码和数据指针的起始/大小一样。最好忽略IAT头字段并解析IT。此外,在解析IT时,ILT将在某些可执行文件中丢失,只有IAT - 较旧的borland(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相同,运行时:填充导入的功能存储器地址。

答案 1 :(得分:1)

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

尽管如此,他对表格的定义和目的是正确的。

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