下面的內容主要是圍繞這個圖來進行
這個頭部是為了相容早期的dos系統,pe檔案的第乙個位元組起始於乙個傳統的ms-dos頭,被稱為image_dos_header,這個結構體完整的定義如下:
(注:最左邊是檔案頭的偏移量。)
image_dos_header struct
image_dos_header ends
這個頭中只有兩個需要重點關注:
e_magic:dos可執行檔案的標記,一般是兩個位元組,標記值是固定的,只有當其值是4d5a的時候,這個檔案才被識別為可執行檔案,這個結構在檔案頭位置
e_lfanew:指向pe檔案頭的指標,這個在偏移3c處
利用ue來分析可以看到,這兩個在檔案中的位置如下:
pe header 是pe相關結構nt映像頭(image_nt_header)的簡稱,裡邊包含著許多pe裝載器用到的重要字段。裝載到記憶體中時,pe狀態器將從image_dos_header結構中的e_lfanew欄位中島pe header的起始偏移量,加上基位址就得到pe檔案的頭指標peheader = imagebase + dosheader->e_lfnew
image_nt_headers struct
image_nt_headers ends
在乙個有效的 pe 檔案裡,signature 欄位被設定為00004550h, ascii 碼字元是「pe00」。標誌這 pe 檔案頭的開始。
「pe00」 字串是 pe 檔案頭的開始,dos 頭部的 e_lfanew 字段正是指向這裡。一般如果需要驗證乙個檔案是否為pe檔案就要驗證這個標誌是否為這個值
fileheader欄位
這個欄位是乙個image_file_header結構,他的定義如下:
struct image_file_header
(1)machine:可執行檔案的目標cpu型別,記載可執行檔案的目標cpu型別,各個值表示的平台如下:
value
meaning
image_file_machine_i386 0x014c
x86image_file_machine_ia64 0x0200
intel itanium
image_file_machine_amd64 0x8664
x64
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格式詳解(五)
上次文章因為實在太長,所以不得不把這麼簡單的一點內容單獨成文。回顧一下,上次先說到 pe header 然後說到其中的成員 optional header 它的最後乙個結構成員 datadirectory 是乙個含有16個 image data directory 型別元素的陣列,每乙個元素都指向p...