PE檔案中的IAT和IET

2021-10-13 09:35:00 字數 2404 閱讀 1444

iat中文名叫匯入位址表

在iat中存放的是匯入的函式的rva陣列,每個元素對應乙個函式的位址(rva)

通過這個rva即可找到匯入函式的位置

所以說我們必須先知道iat在哪

可選頭結構體的最後乙個成員是datadirectory

它是乙個結構體陣列

typedef

struct _image_optional_header image_optional_header32,

*pimage_optional_header32;

它的每個元素是乙個image_data_directory(idd)結構體

上圖就是datadirectory陣列,每個元素就是上面說的idd結構體

我們找到第二個元素import table

可以得到它的rva和size(對應的就是idd結構體的virtualaddress和size成員)

這個位址也是乙個結構體陣列,每個元素都是乙個image_import_descriptor(iid)結構體

該結構體有20個位元組大小

typedef

struct _image_import_descriptor

; dword timedatestamp;

dword forwarderchain;

dword name;

//匯入的庫的名稱的rva

dword firstthunk;

//iat的rva

}image_import_descriptor;

通過該結構體的最後乙個成員我們得到iat的rva

上圖中藍色部分即為import table陣列中的第乙個元素

找到iid後(這裡我們選的是import table陣列中的第乙個元素)

通過最後乙個4位元組成員0x1000(即iat的rva),找到iat的位址

圖中藍色部分即為匯入函式的rva,

注意iat是乙個位址陣列,陣列元素全都是匯入函式的rva

這裡,我們選第乙個位址0xc1708,轉到相應位址檢視

可以看到匯入函式的相應資訊

其實上面的iat位址處是位址陣列,也是image_import_by_name結構體的指標陣列

每個位址都是乙個image_import_by_name結構體的指標

image_import_by_name結構體定義如下:

typedef

struct _image_import_by_nameimage_import_by_name,

*pimage_import_by_name;

iet簡單理解就是乙個應用程式或庫需要給別的程式用的函式,即匯出函式表怎麼找到iet的匯出函式的位址?

找到datadirectory[0]

datadirectory的第乙個元素就是export table

通過其rva轉到相應位址

上圖藍色部分即為iet,可以發現:

iet位址處只有乙個結構體(ied,40個位元組),與iat位址處相比較,iat位址處是乙個結構體陣列,每個元素都是乙個20位元組的iid結構體

iet位址處的結構體為image_export_directory(ied)

ied結構體定義如下:

typedef

struct _image_export_directoryimage_export_directory,

*pimage_export_directory;

找到addressoffunctions的rva

轉到b5a0c

這裡我們隨便選乙個位址看看,如第乙個4ef9a(rva),將其加上檔案對映基址(我的環境下是77de0000),得到77e2ef9a(va)

77e2ef9a這個位址在od中即可找到相應匯出函式(但是我的環境下不知道為什麼od不顯示…請大神指點)

PE檔案中的輸入表

pe檔案中的輸入表含有三個重要結構iid,int,iat。pe檔案為需要載入的dll檔案建立乙個iid結構,乙個dll與乙個iid對應。int是輸入名稱表,iat輸入位址表,在沒有繫結輸入的情況下磁碟中的檔案int與iat相同。如果有繫結輸入的話因為繫結輸入的函式其磁碟檔案中的iat項就已經是對應函...

計算PE檔案校驗和

計算pe校驗和 include pragma comment lib,imagehlp.lib void getchecksum tchar pszpath lpbyte lpbase null hfile,null,page readwrite,0,dwlowsize,null lpbase lp...

檢測IAT HOOK 程序記憶體中的IAT

檢測iat hook 程序記憶體中的iat 昨天寫的是磁碟的iat.現在是記憶體的iat.接著進行比較就可以得到iat hook了 用openprocess和readproces emory讀取你想讀的程序.然後按照pe檔案格式來解釋讀到的資料,lpbase就是讀到資料緩衝區的位址 dosheade...