每个地方的解释都是导入函数的进程的IAT用它想要的dll中的导出函数的地址填充。
但是这些指向导入函数的地址空间是什么?如果它是一个虚拟地址,那就没有意义,因为导入过程有自己的虚拟空间,而那些dll函数不在其中。
但保护模式不允许物理寻址,因此它也不能成为物理地址。是什么给了什么?
答案 0 :(得分:1)
IAT的全部原因正是因为DLL在虚拟地址空间中的某个未知偏移处加载。有了ASLR,它实际上是故意无法预测的。 IAT用作跳转表在固定位置到不可预知位置的功能。
显然,只有在DLL加载到进程空间后才能填充IAT。这实际上是LoadLibrary
执行的关键操作。实际上加载DLL可能会在以后发生,因为它是需求分页的。