PE檔案格式的RVA概念

2021-04-24 20:14:13 字數 2315 閱讀 8434

我們常說的rva,很容易讓我們理解成這是相對於節的rva,其實不然。

要理解rva的概念,首先還必須理解section header結構(由section header構成節表)。

typedef struct _image_section_header  misc;

dword   virtualaddress;

dword   sizeofrawdata;

dword   pointertorawdata;

dword   pointertorelocations;

dword   pointertolinenumbers;

word    numberofrelocations;

word    numberoflinenumbers;

dword   characteristics;

} image_section_header, *pimage_section_header;

注意其中的virtualaddress和pointertorawdata,這兩個都是節的起始位址。不同之處在於:

virtualaddress用在記憶體中指明該節的起始位址,而pointertorawdata用在檔案中指明該

節的起始位址。

由於檔案的對齊值和記憶體的對齊值不一樣,所以,如果以直接用rva(即irva)去定位的話,那麼,可能是錯誤的。

這個rva我把它分成三種情況,在不同情況下計算得出的rva各給個名字:

為了方便理解,使用例子資料來說明。

typedef struct _image_section_header  misc;

dword   virtualaddress;      // 00000540

dword   sizeofrawdata;      // 00069fc0

dword   pointertorawdata;      // 00000540

dword   pointertorelocations;

dword   pointertolinenumbers;

word    numberofrelocations;

word    numberoflinenumbers;

dword   characteristics;      // 68000020

} image_section_header, *pimage_section_header;

整理成和lordpe的形式如下:

名稱name  voffset    vsize    roffset    rsize    標誌

.text    0000540    00069f9b  00000540  00069fc0  68000020

虛擬位址va = 00049586,imagebase = 00040000

1、該rva是以imagebase為參考的,即是通過rva=va - imagebase = 00049586-00040000=9586 我們稱其為irva(我們常說為rva)

2、該rva是以voffset(如.text節的起始位址)為參考的,即是通過rva=va - voffset,我們稱其為mrva(記憶體節偏移)

3、真正的檔案偏為frva

我們很清楚的知道,唯有它們以節的起始位址為參考的相對偏移才是固定的。我們就根據這個來計算。

我們以va=00049586為例子,為了得到它的檔案偏移,我們需要經過以下的步驟:

先把va轉換成irva,即irva = va - imagebase = 00049586-00040000=9586

把irva轉換成mrva,即mrva = irva - voffset = 9586-540=9046

得到了mrva後,就很容易得到frva了,frva = mrva+roffset = 9046+540=9586

所以,va=00049586的檔案偏移為frva=9586

上面由於roffset和voffset值一樣,所以,你別以為直接計算就行了。

最後總結:

1、虛擬位址轉檔案偏位址frva

frva = mrva + roffset

由於mrva = irva - voffset

再由於irva = 虛擬位址 - imagebase

所以,mrva = (虛擬位址 - imagebase) - voffset

所以,frva = (虛擬位址 - imagebase) - voffset + roffset

最終得到:

frva = (虛擬位址 - imagebase) - voffset + roffset

乙個簡單的代入法!

2、rva轉檔案偏移位址frva

同上

PE檔案格式

pe 的意思是 portable executable 可移植的執行體 它是 win32環境自身所帶的執行檔案格式。它的一些特性繼承自unix的coff common object file format 檔案格式。portable executable 可移植的執行體 意味著此檔案格式是跨win3...

PE檔案格式

pe檔案格式分析及修改 圖 1 2009 01 09 14 08 pe 的意思是 portable executable 可移植的執行體 它是 win32環境自身所帶的執行檔案格式。它的一些特性繼承自unix的coff common object file format 檔案格式。portable ...

PE檔案格式

pe檔案格式應用於所有32位windows系統 windows 9x,windows nt,windows 2000及windows xp vista已經對pe格式進行了公升級,也出現了pe64 而在msdn 98中有pe的大量詳細資料 按目錄 msdn library visual studio ...