PE格式詳解(五)

2021-04-19 23:05:38 字數 1840 閱讀 9967

上次文章因為實在太長,所以不得不把這麼簡單的一點內容單獨成文。回顧一下,上次先說到

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