匯入表是防毒軟體廠商非常關注的部位尤其是啟發式掃瞄。所以,了解匯入表的結構對免殺技術是必不可少的。
下文我們從大家最常用的notepad.exe的分析來揭開匯入表的神秘面紗。
首先用loadpe工具載入notepad.exe。檢視其區段表和目錄表資訊。
第一步:計算轉換因子
從目錄表的輸入表的rva(相對虛擬位址)查詢在區段表中的位置。這裡的rva是0x7604對應的是區段表的.text區段。
轉換因子 = voffeset - roffset
1000 - 400 = c00 (注意這裡顯示的都是十六進製制,以下同,不再贅述)
c00就是記事本的匯入表對應的轉換因子。轉化因子就是記憶體位址和檔案位址的轉換差。
記憶體位址-轉換因子 = 檔案位址
檔案位址+轉換因子 = 記憶體位址
第二步:了解image_import_descriptor結構
計算匯入表的檔案位址為
7604 - c00 = 6a04
我們用ue檢視6a04處的內容如下:
紅框部分代表了乙個image_import_descriptor結構。
typedef struct _image_import_descriptor ;
dword timedatestamp;
dword forwarderchain; // -1 if no forwarders
dwordname;
dwordfirstthunk; // rva to iat (if bound this iat has actual addresses)
} image_import_descriptor;
這裡我們主要關心是加粗的內容,對應內容如下表:
字段相對記憶體虛擬位址
檔案位址
內容originalfirstthunk
6d90
指向匯入函式名字結構體陣列指標
name
00007aac
6eac
指嚮導入庫名字
firstthunk
000012c4
6c4指向iat匯入位址表偏移
第三步:分析originalfirstthunk欄位
這裡紅色框起來的資料是乙個指向image_thunk_data32結構體的指標資料。全0也就是綠色框起來的部分代表乙個導入庫的結束。由於陣列元素是指標 所以,這裡第乙個導入庫的陣列元素有9個,所以匯入的函式也有9個。
首先我們檢視記憶體偏移6e7a(00007a7a-c00)處的image_thunk_data32結構體資料。
該結構體的第乙個元素(2位元組)代表匯出的函式的序號0f。後邊是匯出函式名,不定長,但必須以0結尾。這裡代表的函式名是pagesetupdlgw。我們可以依次找出這個導入庫的所有匯出函式資訊。
下面我們驗證一下。用loadpe檢視匯入表資訊如下圖所示:
由此可以確認我們找的完全正確。
第四步:分析name欄位
首先用ue檢視位址為6eac(7aac-c00)的資料如下
由此可見6eac指向的是乙個字串comdlg32.dll。與loadpe中顯示的dll的名稱相符。
第五步:分析firstthunk欄位
firstthunk是與iat表關聯的。
匯入位址表(iat):import address table 由於匯入函式就是被程式呼叫但其執行**又不在程式中的函式,這些函式的**位於乙個或者多個dll 中.當pe 檔案被裝入記憶體的時候,windows 裝載器才將dll 裝入,並將呼叫匯入函式的指令和函式實際所處的位址聯絡起來(動態連線),這操作就需要匯入表完成.其中匯入位址表就指示函式實際位址。
我們可以看到這裡指向的也是9個函式位址。其中第乙個函式位址是76344906
下面我們檢視該程式在od中載入起來的這個位址是什麼。
由此可見這個位址正是pagesetupdlgw的載入位址。
至此,關於匯入表與iat和一系列的匯入函式之間的關係都已非常清晰。
小型記事本的VB實現
上面是程式執行的介面!程式執行介面已上傳到相簿的vb6欄目 以下就是 vb6的源 依次新增 5個按鈕控制項,乙個 timer 控制項和乙個 microsoftcommondialogcontrol6.0控制項 private sub command1 click 輸入文字 dim n on erro...
C 對記事本的讀寫
using system using system.collections.generic using system.text using system.io namespace anshield autofutures.baseclase public static string fileread...
小型記事本的VB實現
上面是程式執行的介面!程式執行介面已上傳到相簿的vb6欄目 以下就是vb6的源 依次新增5個按鈕控制項,乙個timer控制項和乙個microsoft common dialog control 6.0控制項 private sub command1 click 輸入文字 dim n on error...