乙個pe程式總是以乙個64位元組的dos header結構開頭,目的就是為了如果程式在dos中執行,dos會識別它為正確的exe並進而執行dosstub,它的作用就是輸出字串」this program cannot run in dos mode.」然後退出。
下面就是dos
header在c語言中的結構表示(來自mingw的winnt.h)
typedef
struct
_image_dos_header image_dos_header,*pimage_dos_header;
首先宣告, word表示unsigned short int(2bytes), 而long和後面會出現的dword表示unsigned int(4 bytes),其定義符合c99標準。
我們只關心其中兩個成員,e_magic是magic number,它總是等於0x4d5a,也就是mz這兩個字元,這是為了幾紀念mark zbikowsky,ms-dos設計者之一。
e_lfanew指向的是pe
header,這才是pe檔案真正的開始,win32exe載入器會讀取其中的位址並找到pe header,dos stub因此被跳過。我們可以來實踐一下下,用winhex開啟我們的範例程式testpe.exe。
picture missing
可以看到前兩個byte,確實是mz表示乙個合法的exe檔案,圖中的前四行(0h~3fh)共64位元組即為image_dos_header結構,e_lfanew是最後四個位元組,從圖中我們可以讀出,位於3ch~3fh的依次是d8,00,00,00,因為機器中整型存放遵循高位在高位址處的原則,所以實際的值是00,00,00,d8,我們順勢找到d8h,馬上就發現了pe兩個字,從這裡開始便是真正的pe header。那麼位於40h到d7h 的東西從pe結構圖就可以看出是dos
stub,其實就是一段彙編**,我們就不管了。
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...
PE格式詳解講解1
下面的內容主要是圍繞這個圖來進行 這個頭部是為了相容早期的dos系統,pe檔案的第乙個位元組起始於乙個傳統的ms dos頭,被稱為image dos header,這個結構體完整的定義如下 注 最左邊是檔案頭的偏移量。image dos header struct image dos header ...