1. 程式人生 > >PE檔案格式詳解(四)

PE檔案格式詳解(四)

PE檔案格式詳解(四)

0x00 前言

  上一篇介紹了區塊表的資訊,以及如何在hexwrokshop找到區塊表。接下來,我們繼續深入瞭解區塊,並且學會檔案偏移和虛擬地址轉換的知識。

0x01 區塊對齊值

  首先我們要知道啥事區塊對齊?為啥要區塊對齊?這個問題其實困擾了我很久,只能怪我作業系統沒學好。。。我現在的理解是由於記憶體和磁碟存在分頁的問題所以使得不同區塊一般要放到不同的分頁中,當然也可以多個區塊合併以節省空間,但是對於不能合併的區塊如程式碼和資料塊就不得不放在不同分頁上了。學過作業系統的都知道不管是磁碟和記憶體分頁都是一個大學問。由於不同塊放在不同分頁,其實這個對齊值就是分頁的整數的值。至於為啥要區塊對齊,這也是有分頁導致的。下圖為

PE檔案載入對映示意圖:

 根據上圖我們知道PE檔案有兩個對齊值,一個是磁碟的對齊值,一個是記憶體中的對齊值。

1)磁碟中對齊值是定義在PE檔案頭中的FileAligament中。每一塊區塊從對齊值倍數位置開始存放,對於沒有填滿的部分會用0填充。這些0構成了區塊間隙。例如:對齊值為200h,一個區塊大小位50h,它從400h開始存放,直到450h結束,其後的450h600h就用0填充。

2)記憶體的對齊值和磁碟差不多。它是定義在PE檔案頭的SectionAligaments中。它也是從一個對齊值整數倍開始存放,未填滿的用0填充。

0x01 檔案地址和虛擬地址轉換

  首先為啥要轉換?由上圖可知,其實主要是是因為

PE檔案載入後它在磁碟和記憶體中的地址是不一樣的。我們一般都能抓取他在記憶體中的值,然後根據記憶體中的值(叫虛擬地址)來逆推出它在磁碟中的位置。這樣我們也能判斷PE載入後到底呼叫了系統中哪些函式。下圖展示了各個地址間的關係:

 

這裡的FileOffset就是我們要找的各個區塊在磁碟中的位置。

由於同一區塊內FileOffset和相對地址RAV之間的值是一定的。比如.text區塊中的FileOffsetRVA之間都是0c00h,用k表示他們之間的差值。就有公式FileOffset=RAV-K,一般情況下都是由RVAFileOffset

舉個例子:某個PE檔案載入後讀出的虛擬地址

VA值為401112hImageBase值為400000hk的值為0c00h,求它的檔案的FileOffset值。

   RAV=VA-ImageBse=401112h-400000h=11112h

   FileOffset=RVA-k=11112h-0c00h=512h