我們常說的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 ...