2014-10-02 61 views
0

无处不在的解释是,进程导入函数的IAT填充了它希望从中导出的函数的地址。IAT-物理地址中的dll指针?

但在什么地址空间这些指向导入函数的指针?如果它是一个虚拟地址,那么这将毫无意义,因为导入过程有自己的虚拟空间,而这些dll不起作用。

但保护模式不允许物理寻址,因此它也不能是物理地址。是什么赋予了?

+1

http://msdn.microsoft.com/en-us/magazine/bb985992.aspx – 2014-10-02 00:19:49

+0

这是什么意思?“这些DLL函数不是它”?当进程加载DLL时发生的第一件事是将DLL映射到进程地址空间! – 2014-10-02 00:22:42

+1

你误解了虚拟地址的概念。虚拟地址空间为整个进程创建,并为所有加载的映像共享,并在此过程中分配内存。 – 2014-10-02 00:31:28

回答

1

IAT的全部原因正是因为DLL在虚拟地址空间中的某个未知偏移处加载。有了ASLR,它实际上是故意不可预测的。 IAT作为跳转表固定位置在不可预测位置的功能。

显然,只有在DLL被加载到进程空间后才能填充IAT。这实际上是由LoadLibrary执行的关键操作。实际上加载DLL可能会稍后发生,因为它是按需分页的。