PE檔案格式一覽

2021-04-07 04:29:26 字數 3463 閱讀 3128

考慮到早期寫的

pe教程

1是自己所有教程中最糟糕的一篇,此番決心徹底重寫一篇以饗讀者。

pe

的意思就是

portable executable

(可移植的執行體)。它是

win32

環境自身所帶的執行體檔案格式。它的一些特性繼承自

unix

的 coff (common object file format)

檔案格式。

"portable executable"

(可移植的執行體)意味著此檔案格式是跨

win32

平台的

: 即使

windows

執行在非

intel

的cpu

上,任何

win32

平台的pe

裝載器都能識別和使用該檔案格式。當然,移植到不同的

cpu上

pe執行體必然得有一些改變。所有

win32

執行體 (除了

vxd和

16位的

dll)

都使用pe

檔案格式,包括

nt的核心模式驅動程式(

kernel mode drivers

)。因而研究

pe檔案格式給了我們洞悉

windows

結構的良機。

本教程就讓我們瀏覽一下

pe檔案格式的概要。

dos mz header

dos stub

pe header

section table

section 1

section 2

section ...

section n

上圖是

pe檔案結構的總體層次分布。所有

pe檔案(甚至

32位的

dlls)

必須以乙個簡單的

dos mz header

開始。我們通常對此結構沒有太大興趣。有了它,一旦程式在

dos下執行,

dos就能識別出這是有效的執行體,然後執行緊隨

mz header

之後的

dos stub

。dos stub

實際上是個有效的

exe,在不支援

pe檔案格式的作業系統中,它將簡單顯示乙個錯誤提示,類似於字串

"this program requires windows"

或者程式設計師可根據自己的意圖實現完整的

dos**。通常我們也不對

dos stub

太感興趣

: 因為大多數情況下它是由彙編器

/編譯器自動生成。通常,它簡單呼叫中斷

21h服務

9來顯示字串

"this program cannot run in dos mode"。

緊接著

dos stub

的是pe header

。 pe header 是pe

相關結構

image_nt_headers

的簡稱,其中包含了許多

pe裝載器用到的重要域。當我們更加深入研究

pe檔案格式後,將對這些重要域耳目能詳。執行體在支援

pe檔案結構的作業系統中執行時,

pe裝載器將從

dos mz header

中找到

pe header

的起始偏移量。因而跳過了

dos stub

直接定位到真正的檔案頭

pe header。

pe檔案的真正內容劃分成塊,稱之為

sections

(節)。每節是一塊擁有共同屬性的資料,比如**

/資料、讀

/寫等。我們可以把

pe檔案想象成一邏輯磁碟,

pe header

是磁碟的

boot

扇區,而

sections

就是各種檔案,每種檔案自然就有不同屬性如唯讀、系統、隱藏、文件等等。

值得我們注意的是

----

節的劃分是基於各組資料的共同屬性

: 而不是邏輯概念。

重要的不是資料

/**是如何使用的,如果

pe檔案中的資料

/**擁有相同屬性,它們就能被歸入同一節中。不必關心節中類似於

"data", "code"

或其他的邏輯概念

: 如果資料和**擁有相同屬性,它們就可以被歸入同乙個節中。(譯者注:節名稱僅僅是個區別不同節的符號而已,類似

"data", "code"

的命名只為了便於識別,惟有節的屬性設定決定了節的特性和功能)如果某塊資料想付為唯讀屬性,就可以將該塊資料放入置為唯讀的節中,當

pe裝載器對映節內容時,它會檢查相關節屬性並置對應記憶體塊為指定屬性。

如果我們將

pe檔案格式視為一邏輯磁碟,

pe header

是boot

扇區而sections

是各種檔案,但我們仍缺乏足夠資訊來定位磁碟上的不同檔案,譬如,什麼是

pe檔案格式中等價於目錄的東東?別急,那就是

pe header

接下來的

陣列結構

section table

(節表)。

每個結構包含對應節的屬性、檔案偏移量、虛擬偏移量等。如果

pe檔案裡有

5個節,那麼此結構陣列內就有

5個成員。因此,我們便可以把節表視為邏輯磁碟中的根目錄,每個陣列成員等價於根目錄中目錄項。

以上就是

pe檔案格式的物理分布,下面將總結一下裝載一

pe檔案的主要步驟:

當pe

檔案被執行,

pe裝載器檢查

dos mz header

裡的 pe header

偏移量。如果找到,則跳轉到

pe header。pe

裝載器檢查

pe header

的有效性。如果有效,就跳轉到

pe header

的尾部。

緊跟 pe header

的是節表。

pe裝載器讀取其中的節資訊,並採用檔案對映方法將這些節對映到記憶體,同時付上節表裡指定的節屬性。

pe檔案對映入記憶體後,

pe裝載器將處理

pe檔案中類似

import table

(引入表)邏輯部分。

上述步驟是基於本人觀察後的簡述,顯然還有一些不夠精確的地方,但基本明晰了執行體被處理的過程。

luevel**eyer

的《pe

檔案格式

》。 該文的描述相當詳細,可用作案頭的參考手冊。

PE教程1 PE檔案格式一覽

pe教程1 pe檔案格式一覽 考慮到早期寫的pe教程1是自己所有教程中最糟糕的一篇,此番決心徹底重寫一篇以饗讀者。pe 的意思就是 portable executable 可移植的執行體 它是 win32環境自身所帶的執行體檔案格式。它的一些特性繼承自 unix的 coff common objec...

PE教程1 PE檔案格式一覽

pe 教程1 pe 檔案格式一覽 考慮到早期寫的 pe教程 1是自己所有教程中最糟糕的一篇,此番決心徹底重寫一篇以饗讀者。pe 的意思就是 portable executable 可移植的執行體 它是 win32 環境自身所帶的執行體檔案格式。它的一些特性繼承自 unix 的 coff common...

PE檔案格式

pe 的意思是 portable executable 可移植的執行體 它是 win32環境自身所帶的執行檔案格式。它的一些特性繼承自unix的coff common object file format 檔案格式。portable executable 可移植的執行體 意味著此檔案格式是跨win3...