PE檔案詳解(三)

2021-08-29 00:24:57 字數 1204 閱讀 4244

本文**小甲魚的pe檔案詳解系列傳送門

在執行乙個pe檔案的時候,windows 並不在一開始就將整個檔案讀入記憶體的,二十採用與記憶體對映檔案類似的機制。 

也就是說,windows 裝載器在裝載的時候僅僅建立好虛擬位址和pe檔案之間的對映關係。 

當且僅當真正執行到某個記憶體頁中的指令或者訪問某一頁中的資料時,這個頁面才會被從磁碟提交到物理記憶體,這種機制使檔案裝入的速度和檔案大小沒有太大的關係。

但是要注意的是,系統裝載可執行檔案的方法又不完全等同於記憶體對映檔案。 

當使用記憶體對映檔案的時候,系統對「原著」相當忠實,如果將磁碟檔案和記憶體映像比較的話,可以發現不管是資料本身還是資料之間的相對位置它丫丫的都是完全相同的。

而我們知道,在裝載可執行檔案的時候,有些資料在裝入前會被預處理,如重定位等,正因此,裝入以後,資料之間的相對位置可能發生微妙的變化。 

windows 裝載器在裝載dos部分、pe檔案頭部分和節表(區塊表)部分是不進行任何特殊處理的,而在裝載節(區塊)的時候則會自動按節(區塊)的屬性做不同的處理。

記憶體頁的屬性:

對於磁碟對映檔案來說,所有的頁都是按照磁碟對映檔案函式指定的屬性設定的。但是在裝載可執行檔案時,與節對應的記憶體頁屬性要按照節的 

屬性來設定。所以,在同屬於乙個模組的記憶體頁中,從不同節對映過來的的記憶體頁的屬性是不同的。

節的起始位址在磁碟檔案中是按照 image_optional_header32 結構的 filealignment 欄位的值進行對齊的。 

而當被載入到記憶體中時是按照同一結構中的 sectionalignment 欄位的值對其的,兩者的值可能不同。 

所以乙個節被裝入記憶體後相對於檔案頭的偏移和在磁碟檔案中的偏移可能是不同的。

節的尺寸:

對節的尺寸的處理主要分為兩個方面: 

第乙個方面,正如剛剛我們所講的,由於磁碟映像和記憶體映像中節對齊儲存單位的不同而導致了長度擴充套件不同(填充的0數量不同嘛~); 

第二個方面,是對於包含未初始化資料的節的處理問題。既然是未初始化,那麼沒有必要為其在磁碟中浪費空間資源,但在記憶體中不同,因為程 

序一執行,之前未初始化的資料便有可能要被賦值初始化,那麼就必須為他們留下空間。

不進行對映的節:

有些節並不需要被對映到記憶體中,例如.reloc節,重定位資料對於檔案的執行**來說是透明的,無作用的,它只是提供windows 裝載器使用, 

執行**根本不會去訪問到它們,所以沒有必要將他們對映到物理記憶體中

PE檔案詳解(三)

本文 小甲魚的pe檔案詳解系列傳送門 在執行乙個pe檔案的時候,windows 並不在一開始就將整個檔案讀入記憶體的,二十採用與記憶體對映檔案類似的機制。也就是說,windows 裝載器在裝載的時候僅僅建立好虛擬位址和pe檔案之間的對映關係。當且僅當真正執行到某個記憶體頁中的指令或者訪問某一頁中的資...

PE檔案結構詳解(三)PE匯出表

上篇文章 pe檔案結構詳解 二 可執行檔案頭 的結尾出現了乙個大陣列,這個陣列中的每一項都是乙個特定的結構,通過函式獲取陣列中的項可以用rtlimagedirectoryentrytodata函式,datadirectory中的每一項都可以用這個函式獲取,函式原型如下 base 模組基位址。dire...

PE檔案結構詳解(三)PE匯出表

上篇文章 pe檔案結構詳解 二 可執行檔案頭 的結尾出現了乙個大陣列,這個陣列中的每一項都是乙個特定的結構,通過函式獲取陣列中的項可以用rtlimagedirectoryentrytodata函式,datadirectory中的每一項都可以用這個函式獲取,函式原型如下 base 模組基位址。dire...