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...