windows下的可執行檔案為pe(portable executable file format/可移植的執行體)格式,檔案的組織形式還是比較複雜的,花了大概乙個星期的時間終於稍微弄懂了pe檔案的裝載過程。
pe檔案最開始的部分稱為dos頭,存在的作用是為了相容dos下的可執行程式,dos頭的結構如下:
code
image_dos_header struct
e_magic word
?;dos可執行檔案標記,為「mz」
e_cblp word
?e_cp word
?e_crlc word
?e_cparhdr word
?e_minalloc word
?e_maxalloc word
?e_ss word
?;dos**的初始化堆疊段
e_sp word
?;dos**的初始化堆疊指標
e_csum word
?e_ip word
?;dos**的入口ip
e_cs word
?;dos**的入口cs
e_lfarlc word
?e_ovno word
?e_res word
4dup(?)
e_oemid word
?e_oeminfo word
?e_res2 word
10dup(?)
e_lfanew dword
?;指向pe檔案頭
image_dos_header ends
可以看到,這個結構總共占用的空間為32個word,64個位元組,64×8個bit,也就是說每個pe檔案的dos頭都同樣地占用64個位元組的空間,這個結構中比較重要的元素有兩個,一是開始部分的e_magic,為dos可執行檔案的標誌,翻譯成ascii即為字元「mz」,另外乙個是結構的最後乙個元素e_lfanew,為乙個雙字,為pe檔案頭相對於本檔案開始處的偏移量,也可以認為是pe檔案頭在本檔案中的開始位址,如e_lfanew的值為2801h,而這個值在pe檔案中的儲存位址為3ch和3dh,但是e_lfanew的真實值並不是2801h,而是0128h,因為在x86體系中高位址存放高位的資料,低位址存放低位資料,所以e_lfanew的真實值應該顛倒一下。
作業系統裝載pe檔案的時候首先檢查「mz」標誌,然後讀取e_lfanew的值,如上例所示,為128h,然後裝載程式會到pe檔案的128h處讀取資料,如果是pe檔案的話,128h和129h處的內容一定為50h和45h,翻譯成ascii即為字元「pe」,此處即為pe檔案頭的開始。
PE檔案的裝載過程(4)
上週畢業答辯,沒完成任務,慚愧慚愧。可選頭的最後一部分是datadirectory欄位,這個字段包含了16個image data directory結構,結構的定義如下 image data directory struct virtualaddress dword 資料的起始rva isize d...
PE檔案的裝載過程(2)
image nt headers struct signature dword pe檔案標識 fileheader image file header optionalheader image optional header32 image nt headers ends signature為pe檔...
PE檔案載入過程揭秘(2)
2011年10月09日 星期日 16 23 自 cvvd 最終編輯 cvvd 圖1pe 載入器在完成檔案實體資料到記憶體虛擬資料的對映之後,便開始從位於 image option header 末端的image data directory 陣列的第 2項 如圖 2 取出輸入表的 rva和大小,準備...