上次文章因為實在太長,所以不得不把這麼簡單的一點內容單獨成文。回顧一下,上次先說到
pe header
,然後說到其中的成員
optional header
,它的最後乙個結構成員
datadirectory
,是乙個含有16個
image_data_directory
型別元素的陣列,每乙個元素都指向pe檔案內的乙個很重要的資料結構。
首先列出image_data_directory結構:(簡單的結構就不注釋了)
typedef
struct
_image_data_directory image_data_directory,*pimage_data_directory;
virtualaddress。是所指向的資料結構的虛擬位址。
size。這個資料結構的大小。
這乙個結構佔8個位元組,16項一共佔128位元組。
另外序號與目錄的對應關係在winnt.h中定義如下:
#define
image_directory_entry_export0
#define
image_directory_entry_import1
#define
image_directory_entry_resource2
#define
image_directory_entry_exception3
#define
image_directory_entry_security4
#define
image_directory_entry_basereloc5
#define
image_directory_entry_debug6
#define
#define
image_directory_entry_architecture7
#define
image_directory_entry_globalptr8
#define
image_directory_entry_tls9
#define
image_directory_entry_load_config10
#define
image_directory_entry_bound_import11
#define
image_directory_entry_iat12
#define
image_directory_entry_delay_import13
#define
image_directory_entry_com_descriptor14
最後15是預留位置。
下圖便是testpe.exe的datadirectory,我們選其中幾項來看看。
picture missing
圖中其實很整齊地幫我們劃分了每乙個目錄表項,每一行有明顯分開的兩組資料,每一組長即為8位元組,也就是乙個表項,這樣看起來就方便很多。
第乙個表項,全零,由於對應的
image_directory_entry_export
,意味著testpe.exe沒有dll輸出表(export table)。
第二個是輸入表(import table),顯然不為0(不然還叫windows程式啊),推斷出virtualaddress = 00 01 80 00,size = 00 00 00 3c,有空自己挑個exe去看一下去,以後我們會再遇到的,現在跳過。
其實每乙個表項都有挺實在的意思,看最後乙個單詞就都明白了。到這,pe header部分就全部結束了。下次講的是區段表(section table)。
PE格式詳解(二)
乙個pe程式總是以乙個64位元組的dos header結構開頭,目的就是為了如果程式在dos中執行,dos會識別它為正確的exe並進而執行dosstub,它的作用就是輸出字串 this program cannot run in dos mode.然後退出。下面就是dos header在c語言中的結...
PE格式詳解(三)
pe header對應c 中的image nt header32 結構,如下 typedef struct image nt headers image nt headers32,pimage nt headers32 再是真實pe檔案的截圖 picture missing 一 中我們已經得到pe ...
PE格式詳解講解1
下面的內容主要是圍繞這個圖來進行 這個頭部是為了相容早期的dos系統,pe檔案的第乙個位元組起始於乙個傳統的ms dos頭,被稱為image dos header,這個結構體完整的定義如下 注 最左邊是檔案頭的偏移量。image dos header struct image dos header ...