PE文件格式詳解(四)
PE文件格式詳解(四)
0x00 前言
上一篇介紹了區塊表的信息,以及如何在hexwrokshop找到區塊表。接下來,我們繼續深入了解區塊,並且學會文件偏移和虛擬地址轉換的知識。
0x01 區塊對齊值
首先我們要知道啥事區塊對齊?為啥要區塊對齊?這個問題其實困擾了我很久,只能怪我操作系統沒學好。。。我現在的理解是由於內存和磁盤存在分頁的問題所以使得不同區塊一般要放到不同的分頁中,當然也可以多個區塊合並以節省空間,但是對於不能合並的區塊如代碼和數據塊就不得不放在不同分頁上了。學過操作系統的都知道不管是磁盤和內存分頁都是一個大學問。由於不同塊放在不同分頁,其實這個對齊值就是分頁的整數的值。至於為啥要區塊對齊,這也是有分頁導致的。下圖為
根據上圖我們知道PE文件有兩個對齊值,一個是磁盤的對齊值,一個是內存中的對齊值。
1)磁盤中對齊值是定義在PE文件頭中的FileAligament中。每一塊區塊從對齊值倍數位置開始存放,對於沒有填滿的部分會用0填充。這些0構成了區塊間隙。例如:對齊值為200h,一個區塊大小位50h,它從400h開始存放,直到450h結束,其後的450h到600h就用0填充。
2)內存的對齊值和磁盤差不多。它是定義在PE文件頭的SectionAligaments中。它也是從一個對齊值整數倍開始存放,未填滿的用0填充。
0x01 文件地址和虛擬地址轉換
首先為啥要轉換?由上圖可知,其實主要是是因為PE文件加載後它在磁盤和內存中的地址是不一樣的。我們一般都能抓取他在內存中的值,然後根據內存中的值(叫虛擬地址)來逆推出它在磁盤中的位置。這樣我們也能判斷
這裏的FileOffset就是我們要找的各個區塊在磁盤中的位置。
由於同一區塊內FileOffset和相對地址RAV之間的值是一定的。比如.text區塊中的FileOffset和RVA之間都是0c00h,用k表示他們之間的差值。就有公式FileOffset=RAV-K,一般情況下都是由RVA求FileOffset。
舉個例子:某個PE文件載入後讀出的虛擬地址VA值為401112h,ImageBase值為400000h,k的值為0c00h,求它的文件的FileOffset值。
RAV=VA-ImageBse=401112h-400000h=11112h
FileOffset=RVA-k=11112h-0c00h=512h。
PE文件格式詳解(四)