昨天分享了一篇PE結構詳解(加殼脫殼必備知識),本篇是上一篇續篇,主要介紹關於PE結構的三種存儲地址 VA、RVA、FILEOFFSET及轉換方式,希望對你有所幫助。
一、關於VA、RVA、FILEOFFSET
- VA:虛擬地址,PE文件映射到內存後的地址。
- RVA:相對虛擬地址,內存地址相對於映射基地址的偏移地址。
- FileOffset:文件偏移地址,相對PE文件在磁盤上的文件開頭的偏移地址。
在磁盤上文件是按照IMAGE_OPTIONAL_HEADER的FileAligment值進行對其的。而內存中是按照IMAGE_OPTIONAL_HEADER的SectionAligment值進行對其的,關於該信息請參考PE結構詳解(加殼脫殼必備知識)。
FileAligment是以磁盤扇區爲單位進行對齊,最小爲512字節(十六進制:0x200),SectionAligment是以內存分頁爲單位進行對齊,一般win32位4K(十六進制:0x1000)。
通常情況FileAligment與SectionAligment值是相同的,這樣磁盤文件與內存文件的結構完全一樣。當不一樣時,磁盤文件與內存映像的同一節表數據在磁盤和內存的偏移不同,則需要進行地址轉換了,一般轉換方式分爲VA(虛擬地址)轉RVA(相對虛擬地址),RVA(相對虛擬地址)轉FileOffset(文件偏移地址)。下面我們還是通過“hello word”案例來舉例。helloword代碼請見上篇文章PE結構詳解(加殼脫殼必備知識)
二、轉換方式
1.1 VA轉RVA
VA轉RVA非常簡單,VA值減去IMAGE_OPTIONAL_HEADER結構體中的ImageBase(映像文件裝載虛擬地址)字段的值。即:RVA=VA-ImageBase;
1.2 RVA轉FileOffset
文件偏移=該數據所在節的起始文件偏移(R.偏移)+(某數據的RVA-該數據所在節的起始RVA)。
在計算偏移時,word類型偏移爲2;byte類型偏移爲1;Dword類型爲4,小夥伴記住後方便計算。