PE檔案的記憶體對映

2021-08-29 01:15:33 字數 2397 閱讀 3059

如果想要理解pe檔案與虛擬記憶體之間的對映關係,首先要理解一些概念:

1.檔案偏移位址(file offset) pe檔案資料在硬碟中存放的位址就叫做檔案偏移位址。用winhex程式檢視檔案時的offset就是檔案偏移位址了。檔案偏移位址就是指檔案在磁碟上存放時相對於檔案開頭的偏移。

2.裝載基址(image base) 裝載基址就是指pe檔案裝入記憶體時的基位址,一般情況下,exe檔案的裝載基址都是0x00400000,但是也可以更改的,尤其是dll檔案。

3.虛擬記憶體位址(virtual address,va) 虛擬記憶體位址就是指pe檔案被裝入記憶體之後的位址。

4.相對虛擬位址(relative virtual address ,rva) 相對虛擬位址指的是沒有加算裝載基址情況下的記憶體位址。

然而虛擬記憶體位址和裝載基址和相對虛擬位址之間的關係如下

虛擬記憶體位址(va)=裝載基址(image base)+相對虛擬位址(rva)

下面是我偷來的一張

不難看出,pe檔案對映到虛擬記憶體變化很大很大。

在這裡還有說明一下檔案偏移的第乙個位元組是從0x00000000處開始的,而虛擬記憶體位址是從裝載基址處開始的,也是就是從0x00400000處開始。

由於作業系統在裝載pe檔案的時候還是按照pe檔案中的各種資料結構來對映的,所以檔案偏移位址與相對虛擬位址還是有一定的相似之處的,他們之間的差異是由於資料單位存放位置不同而造成的。

pe檔案的資料一般都是按照0x200位元組為基本單位進行組織存放的,當乙個資料區段不夠0x200的時候,沒有用到的空間用00填充,而當乙個資料區段超過0x200的時候,就會再申請乙個0x200的空間存放資料,空出的地方還是用00填充。所以pe檔案的區段大小永遠都是0x200的整數倍。

而當pe檔案裝入記憶體的時候,資料區段一般都是以0x1000位元組為單位進行組織存放的,與上面的規則一樣,不夠0x1000位元組就用00填充,需要超過0x1000位元組就在分配乙個0x1000大的空間存放資料,所以記憶體中的區段大小永遠都是0x1000的整數倍

區段資訊

區段名稱

起始偏移位址

起始檔案偏移

.text

0x00001000

0x00000400

.data

0x0000f000

0x00000600

.rsrc

0x00018000

0x00009400

由於區段裝載到記憶體之後的偏移和檔案偏移不同,所以我們要進行檔案偏移和虛擬位址之間的換算的時候,還要看需要轉換的位址在第幾個區段。

相對虛擬位址(rva)=虛擬記憶體位址(va)-裝載基址(image base)

得到rva我們就知道va屬於哪乙個區段了,看表,例如得到0x00001000~0x0000f000就是.text區段,得到0x0000f000~0x00018000就是.data區段,而大於0x00018000就是在.rsrc區段了。

已知虛擬記憶體位址va,裝載基址image base,位址所在區段的起始虛擬位址vs,位址所在區段的檔案偏移位址vr。

求檔案偏移fileoffset,相對虛擬位址rva,位址相對所在區段偏移relativesectionoffset。

rva=va-image base

relativesectionoffset=rva-vs

fileoffset=vr-relativesectionoffset

fileoffset=vr+(va-image base -vs)

用中文表示就是

檔案偏移=位址所在區段的檔案偏移+(虛擬記憶體位址-裝載基址-位址所在區段的起始虛擬偏移)

不懂?沒事我們來例子。

我們要由乙個pe檔案的虛擬記憶體位址算出乙個檔案的偏移位址,現在我們知道了這個pe檔案的裝載基址(image base)是0x00400000和虛擬記憶體位址(va)是0x00411210,pe檔案的區段就想上面那個**一樣。

我們先算出相對虛擬位址(rva),就是rva=va-image base=0x00411210-0x00400000=0x00011210

由於0x00011210大於.data區段的起始虛擬偏移但是卻小於.rsrc區段的起始虛擬偏移,所以我們知道了這個資料位址在.dara區段內。

根據**我們知道.data區段的起始檔案偏移位址為0x00000600,起始虛擬偏移位址為0x0000f000。

我們可以算出位址相對所在區段偏移relativesectionoffset=rva-vs=0x00011210-0x0000f000

而最終檔案偏移fileoffset=vr+relativesectionoffset=vr+(rva-vs)=0x00000600+(0x00011210-0x0000f000)=0x00011810

ok,最終的檔案偏移就出來了。

PE檔案到記憶體的對映

在執行乙個pe檔案的時候,windows 並不在一開始就將整個檔案讀入記憶體的,二十採用與記憶體對映檔案類似的機制。也就是說,windows 裝載器在裝載的時候僅僅建立好虛擬位址和pe檔案之間的對映關係。當且僅當真正執行到某個記憶體頁中的指令或者訪問某一頁中的資料時,這個頁面才會被從磁碟提交到物理記...

載入PE檔案 記憶體對映檔案

將程式安裝記憶體對齊的方式讀取到記憶體有兩種方法 1 記憶體對映檔案 2 pe載入器模擬法 1 記憶體對映檔案 lpheader所指記憶體是唯讀的,儘管是page readwrite include stdafx.h include include int main int argc,char ar...

mysql直接記憶體對映檔案 PE檔案到記憶體的對映

在執行乙個pe檔案的時候,windows 並不在一開始就將整個檔案讀入記憶體的,二十採用與記憶體對映檔案類似的機制。也就是說,windows 裝載器在裝載的時候僅僅建立好虛擬位址和pe檔案之間的對映關係。當且僅當真正執行到某個記憶體頁中的指令或者訪問某一頁中的資料時,這個頁面才會被從磁碟提交到物理記...