任何人都知道其中的差异吗?
答案 0 :(得分:6)
如果您想使用Portable Executables,则无法获取the specs的副本。
已经有一段时间了,但是如果内存正确地为我服务: IT和IAT是相同的,除了在解析导入时由PE-loader填充IAT - 但是不接受我的话为此,检查规格:)
快速浏览一下规格,并稍微刷新我的记忆:
导入表是主结构,每个DLL导入一个条目。除其他外,每个条目都包含导入查找表( ILT )和导入地址表( IAT )指针(iirc这些曾经被称为OriginalFirstThunk
和FirstThunk
)。 ILT和IAT表在磁盘上是相同的,但在运行期间,IAT将填充导入函数的内存地址。
如果您希望能够处理非标准EXE,那么PE头IAT字段可能不能依赖于100%,就像您不能依赖于代码和数据指针的起始/大小一样。最好忽略IAT头字段并解析IT。此外,在解析IT时,ILT将在某些可执行文件中丢失,只有IAT - 较旧的borland(iirc)链接器因不生成ILT而臭名昭着。
IMAGE_IMPORT_DESCRIPTOR
的表。IMAGE_THUNK_DATA
。答案 1 :(得分:1)
@snemarch大多是正确的,虽然我认为他和文档都是错误的,ILT和IAT在磁盘上是相同的。我查看了字节,它们不一样。
尽管如此,他对表格的定义和目的是正确的。
Windows Loader使用ILT(导入查找表)将EXE使用的函数与DLL中的地址相关联。但是,一旦建立了这种关联,DLL中的地址就会被写入EXE中的IAT(导入地址表)。加载EXE后,它不再需要ILT,当它调用DLL中的函数时,它指向IAT。