导入表与导入地址表

逆向工程 二元分析 x86 聚乙烯
2021-06-29 20:37:50

导入表和导入地址表有什么区别?

2个回答

一般来说,我建议阅读MSDN 上关于 PE 结构PE 格式文档

导入表

导入表实际上称为“导入目录表”,其中包含可执行文件加载的每个 DLL 的条目。每个条目都包含导入查找表 (ILT) 和导入地址表 (IAT)

引用有关导入目录表的 PE 格式规范

导入目录表
导入信息从导入目录表开始,它描述了导入信息的其余部分。导入目录表包含用于解析对 DLL 映像中入口点的修复引用的地址信息。导入目录表由一组导入目录条目组成,映像引用的每个 DLL 对应一个条目。最后一个目录条目为空(填充空值),表示目录表结束。每个导入目录条目具有以下格式:

Offset    Size    Field
0         4       Import Lookup Table RVA
4         4       Time/Date Stamp
8         4       Forwarder Chain
12        4       Name RVA
16        4       Import Address Table RVA

导入地址表

导入地址表由函数指针组成,ans 用于在加载 DLL 时获取函数的地址。一个编译的应用程序被设计成所有 API 调用都不会使用直接的硬编码地址,而是通过函数指针工作。通过直接-指针表可以通过几种方式来访问调用[pointer address]或由“导入查找表”“提示/名称表”

让我们再次引用 PE 规范中关于“导入地址表”的内容

导入地址表 导入地址表
的结构和内容与导入查找的结构和内容相同,直到文件被绑定。在绑定期间,导入地址表中的条目将被导入符号的 32 位(对于 PE32)或 64 位(对于 PE32+)地址覆盖。这些地址是符号的实际内存地址,尽管在技术上它们仍被称为“虚拟地址”。加载程序通常处理绑定。


参考:

首先,除了“你的”两个表,我介绍第三个,导入查找表

导入地址表并排,这两个表在这张简化图中看起来像:

在此处输入图片说明

这张图显示了你在磁盘上的可执行文件的情况它们完全相同,具有完全相同的 API 函数名称列表(更准确地说,是指向显示名称的指针),顺序完全相同。


现在,加载程序加载您的可执行文件并将所有需要的 DLL(动态链接库)映射到您的虚拟内存空间。

完成它并进行一些计算后,加载程序已经知道所有导入函数的地址。

所以它把你在第二个表(Import Address Table)中导入的函数名称替换为它们的地址,内存中的情况就变得不一样了:

在此处输入图片说明


另一方面,导入表,更准确地说是导入目录表,是这两个表的入口。

它是一个条目数组(一个表),每个导入的库一个条目(一行)。
它的简化图片在这里:

在此处输入图片说明

每行由 5 个双字(指针)组成。重要的是其中只有 3 个,第一个(指向 ILT 的指针),最后一个(指向 IAT 的指针),以及最后一个(通过 DLL 的名称标识行;因此它是指向 DLL 名称的指针)在第四个涉及的表中,提示/名称表)。

所以它与另外两个表的合作是这样的:

在此处输入图片说明

(我省略了第四个表,提到的提示/名称表,其中包含所有导入函数的名称和所有导入库的名称。)


注意:我故意省略了图片中的零填充分隔行,并且我没有按序处理导入(为了简单强调想法)。