2014-10-02 83 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可能會稍後發生,因爲它是按需分頁的。