typedef struct _image_import_descriptor ;
dword timedatestamp;
dword forwarderchain;
dword name; //庫名稱字串位址
dword firstthunk; //iat的位址
typedef struct _image_data_directory image_data_directory,*pimage_data_directory;
用來說明iat的image_ import_ descriptor 結構體以陣列形式存在,且擁有多個成員。這樣是因為pe檔案可以同時匯入多個庫。
從庫中獲得函式位址的api為getprocaddress()函式。該api引用eat來獲取指定api的位址。通過getprocaddress() 獲取的函式位址的函式擁有函式名稱.
對於沒有函式名稱的匯出函式,可以通過ordinal 查詢到它們的位址。從ordinal值中減去image export_ directory.base 成員後得到乙個值,使用該值作為「函式位址陣列」的索引,即可查詢到相應函式的位址。
getprocaddress()原理:
(1)利用addressofnames成員轉到「函式名稱陣列」。
(2)「函式名稱陣列」中儲存著字串位址。通過比較( strcmp)字串,查詢指
定的函式名稱(此時陣列的索引稱為name_index)。
(3)利用addressofnameordinals成員,轉到orinal陣列。
(4)在ordinal 陣列中通過name_ index 查詢相應ordinal 值。
(5)利用addressoffunctions成員轉到「 函式位址陣列」( eat )。
(6)在「函式位址陣列」中將剛剛求得的ordinal用作陣列索引,獲得指定函式的起
始位址。
PE檔案(2)匯出表
匯出表就是記載著動態鏈結庫的一些匯出資訊。通過匯出表,dll 檔案可以向系統提供匯出函式的名稱 序號和入口位址等資訊,windows 載入器通過這些資訊來完成動態連線的整個過程。擴充套件名為.exe 的pe 檔案中一般不存在匯出表,而大部分的.dll 檔案中都包含匯出表。但這並不是絕對的。例如純粹用...
PE檔案結構詳解(三)PE匯出表
上篇文章 pe檔案結構詳解 二 可執行檔案頭 的結尾出現了乙個大陣列,這個陣列中的每一項都是乙個特定的結構,通過函式獲取陣列中的項可以用rtlimagedirectoryentrytodata函式,datadirectory中的每一項都可以用這個函式獲取,函式原型如下 base 模組基位址。dire...
PE檔案結構詳解(三)PE匯出表
上篇文章 pe檔案結構詳解 二 可執行檔案頭 的結尾出現了乙個大陣列,這個陣列中的每一項都是乙個特定的結構,通過函式獲取陣列中的項可以用rtlimagedirectoryentrytodata函式,datadirectory中的每一項都可以用這個函式獲取,函式原型如下 base 模組基位址。dire...