輸入表結構如下:
在資料成員目錄的第二項可以找到輸入表的offset
輸入表其實是乙個image_import_descriptor結構陣列,看下winnt.h中的詳細定義
typedef
struct _image_import_descriptor
; 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;
每乙個dll都對應於乙個image_import_descriptor(輸入描述符),以乙個全0的輸入描述符作為結束標誌。
第一項用到的其實只是originalfirstthunk,它指向乙個image_thunk_data結構陣列,每乙個image_thunk_data又與該pe檔案呼叫的每乙個輸入函式有關係,給出image_thunk_data結構。
typedef
struct _image_thunk_data32 u1;
} image_thunk_data32;
typedef image_thunk_data32 * pimage_thunk_data32;
image_thunk_data是乙個dword大小的乙個聯合,它在不同的時候有著不同的含義,跟image_import_descriptor類似,以乙個全0的image_import_descriptor結束。
forwarderstring是轉向它的第乙個索引的函式的名稱的rva(不懂forwarder的可以搜一下中轉函式,了解一下,我本人在dll劫持中用過)
function代表著輸入函式的位址,這個之後再講。
ordinal代表該函式在匯入的dll裡的序號,不過至今很少用了。只有當image_thunk_data的最高位為1時才代表使用序號匯入,此時低31位代表在匯入dll中的該函式的序號。
addressofdata,是乙個指向image_import_by_name的乙個指標,它表示用函式名進行匯入。當image_thunk_data的最高位為0時代表使用函式名進行匯入,此時這個四位元組代表著該image_import_by_name的rva。
image_import_by_name的結構如下:
typedef
struct _image_import_by_name image_import_by_name,
*pimage_import_by_name;
由乙個word型別和乙個可變長的ascii字串組成,因為字串,即匯入函式的函式名長度不定,所以這裡用乙個byte型別粗略代替。
hint用於被pe裝載器快速查詢匯入函式的位置,但該值可有可無。
name陣列是該匯入函式的函式名,是乙個以null結尾的ascii字串。
覺得抽象的根據最上面的那副圖結合著理解。
查詢其餘函式
這裡就不詳細分析了,直接列出
rva 檔案偏移 hint 函式名
211c 51c 01dd postquitmessage
20f4 4f4 0128 getmessagea
20e0 4e0 0094 dispatchmessagea
2150 550 027d translatemessage
2164 564 028b updatewindow
2102 502 0197 loadcursora
20ce 4ce 0083 defwindowproca
20bc 4bc 0058 createwindow***a
212e 52e 01ef registerclas***a
2142 542 0265 showwindow
可以推測下匯出表的這些函式,很像建立乙個視窗並且分發訊息的固有流程,首先registerclas***a,然後createwindows,接著showwindow,然後dispatchmessage分發相應的訊息,所以有時候我們對惡意**進行靜態分析就可以先從匯入表入手。 PE檔案詳解五 PE詳解之輸入表(匯入表)詳解1
首先,我們知道pe 檔案中的資料被載入記憶體後根據不同頁面屬性被劃分成很多區塊 節 並有區塊表 節表 的資料來描述這些區塊。這裡我們需要注意的問題是 乙個區塊中的數 據僅僅只是由於屬性相同而放在一起,並不一定是同一種用途的內容。例如輸入表 輸出表等就有可能和唯讀常量一起被放在同乙個區塊中,因為他們的...
PE檔案詳解五 PE詳解之輸入表(匯入表)詳解1
首先,我們知道pe 檔案中的資料被載入記憶體後根據不同頁面屬性被劃分成很多區塊 節 並有區塊表 節表 的資料來描述這些區塊。這裡我們需要注意的問題是 乙個區塊中的數 據僅僅只是由於屬性相同而放在一起,並不一定是同一種用途的內容。例如輸入表 輸出表等就有可能和唯讀常量一起被放在同乙個區塊中,因為他們的...
C 輸入詳解
c 輸入cin詳解 輸入原理 程式的輸入都建有乙個緩衝區,即輸入緩衝區。一次輸入過程是這樣的,當一次鍵盤輸入結束時會將輸入的資料存入輸入緩衝區,而cin函式直接從輸入緩衝區中取資料。正因為cin函式是直接從緩衝區取資料的,所以有時候當緩衝區中有殘留資料時,cin函式會直接取得這些殘留資料而不會請求鍵...