PE文件:綁定導入表

0x00 作用

綁定導入表是爲了加快程序的加載程序,因爲正常PE加載的時候,要去檢查導入表並將相關的DLL映射到進程空間地址,並將導入表的FirstThunk指向的數組填入函數的真實地址,這一步需要花費很多時間,綁定導入表就是爲了解決此環節的問題,綁定導入表中保存了導入函數的真實地址,PE加載的時候系統會檢測是否有綁定導入表,就會直接將函數地址寫入FirstThunk。
但是綁定導入表的生效,有兩個前提條件:
1.程序初始化時,導入的DLL都加載到了首選基址中
2.程序執行了綁定導入操作以後,導入DLL中引用的符號位置一直沒有變化

倆個條件有一個不符合的話,就不可以綁定,

0x01 結構

數據目錄表( DataDirectory )的第12個成員
它包含了可以讓加載器判斷綁定的地址是否合法的信息。描述它的數據結構是IMAGE_BOUND_IMPORT_DESCRIPTOR,目錄表就是這種結構的數組,每一項都對應一個被綁定過的DLL。

typedef	    struct _IMAGE_BOUND_IMPORT_DESCRIPTOR { 
		DWORD TimeDateStamp; 
		WORD OffsetModuleName;
 		WORD NumberOfModuleForwarderRefs; 
		} IMAGE_BOUND_IMPORT_DESCRIPTOR, *PIMAGE_BOUND_IMPORT_DESCRIPTOR;

結構成員:

OffsetModuleName:偏移,指向dll名稱,基址是IMAGE_BOUND_IMPORT_DESCRIPTOR的開端,對應上圖的0x00a0,0x280+0xa0就是dll名稱的位置
NumberOfModuleForwarderRefs。是緊接着本結構後的另一個IMAGE_BOUND_FORWARDER_REF結構數組的元素個數。

 typedef struct _IMAGE_BOUND_FORWARDER_REF {
	DWORD TimeDateStamp;
	WORD OffsetModuleName;
	WORD Reserved;
} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;

這個結構數組幹什麼用的?
某些情況下,動態鏈接庫中的某些函數的實現代碼會被轉移到別的動態鏈接庫中。(一個導入函數將涉及多個動態鏈接庫函數的調用)。這個結構將所有涉及的動態鏈接庫都列舉出來。
這裏的IMAGE_BOUND_FORWARDER_REF結構就是用來記錄接受轉發的另一個DLL的校驗信息,如果這個DLL還有導出轉發,那麼在該DLL中也有IMAGE_BOUND_FORWARDER_REF結構描述第三個DLL的校驗信息。
在這裏插入圖片描述
此數據項兩個作用:
1、根據TimeDateStamp和OffsetModuleName字段的值我們就可以判斷IAT表中的信息是否已經過期。
2、解決DLL轉發問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章