考慮到早期寫的
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...