動態連接庫須要導入表html
typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; // 0 for terminating null import descriptor DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA) } DUMMYUNIONNAME; DWORD TimeDateStamp; // 0 if not bound, // -1 if bound, and real date\time stamp // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND) // O.W. date/time stamp of DLL bound to (Old BIND) DWORD ForwarderChain; // -1 if no forwarders DWORD Name; DWORD FirstThunk; // RVA to IAT (if bound this IAT has actual addresses) } IMAGE_IMPORT_DESCRIPTOR;
OriginalFirstThunk:指向導入名稱表函數
FirstThunk:指向導入地址表this
Name:指向導入的dll名稱code
IMAGE_THUNK_DATA最高位爲1剩下的表示序號,最高位0剩下的表示RVA指向IMAGE_import_BY_NAME,裏面存着名字。htm
(圖片來源https://www.cnblogs.com/guanlaiy/archive/2012/04/28/2474504.html)blog
OriginalFirstThunk,FirstThunk在文件中同樣,只有PE加載的時候系統會根據INT表內容用GetProcAddress()或相似函數將IAT表中內容替換成DLL重載調整好位置的真實導入函數地址。它讀的是導出表函數的RVA加上調整好後的DLL的ImageBase。圖片
至此導入表、導出表、重定位表功能就連起來了,重定位表只改本PE內容和別的PE無關,PE加載後大部分DLL須要重定位,這個時候imageBase也是真實的了,那麼導出函數的真實地址就能經過導出表的導出函數RVA加上真實的該PE的imageBase得到了。GetProcAddress返回給導入表刷新用。ip