PE文件RVA-VA-Offset

#   Name     Virt Size   RVA       Phys Size  Phys Off   Flags

--  -------- ---------  ---------  ---------  ---------  ---------

01  .text     0000CCC0   00001000   0000CE00   00000600   60000020 []

02  .data000046280000E00000002C000000D400C0000040 []

03  .rsrc     000003C8   00013000   00000400   00010000   40000040 []

对于变量A来说:

File_Offset   就是磁盘文件中A的位置。

File_Offset = VA - ImageBase - VRk = RVA - VRk

ImageBase     就是文件加载到内存的起始位置。

ImageBase = VA - RVA

多为:0x00400000,0x01000000

EntryPoint    就是.text的VA地址。

VA    就是内存映像中A的位置,即A的地址。

VA = ImageBase + FileOffset + VRk = ImageBase + RVA

RVA   就是内存映像中A的位置与文件映射基址的差。

RVA = VA - ImageBase = File_Offset + VRk

PS: VA  就好比是“某一时刻”,例如:九点到校上课。

RVA 就好比是“某一时间段”,例如:七点起床后,过两个小时到校上课。

VA  是绝对的,一旦确定便不可更改。九点到校迟一秒钟也不行。

RVA 是系相对的,虽然说过两个小时到校上课,但是如果我七点起床,便是九点上课。

而如果我八点起床,便是十点上课了。

VRk  就是文件映射到内存后,每一节之间填充的00的个数。

由于要进行对齐,所以文件加载到内存后每一节之间要填充大量00

因此文件中A的位置会变化。由于各个文件头与各个节大小不变,所以:

VRk = RVA - File_Offset = <填充的00的个数>

最终,我们计算:

由FileOffset到RVA/VA:

ImageBase    = 00400000

A FileOffset = 00000450

RVA = FileOffset(A) + ( RVA(.data) - FileOffset(.data) )

= FileOffset(A) +  VRk

= 0000D450 + ( 0000E000 - 0000D400 )

= 0000D450 + C00

= 0000E050

VA  = RVA + ImageBase = 0000E050 + 00400000 = 0040E050

由RVA/VA到FileOffset:

RVA = 0000E050   /   VA = 0040E050   /   ImageBase = 00400000

FileOffset = RVA(A) - RVk

= RVA(A) - ( RVA(.data) - FileOffset(.data) )

= 0000E050 - ( 0000E000 - 0000D400 )

= 0000E050 - C00

= 0000D450

转载链接 : http://www.xuebuyuan.com/1469971.html

你可能感兴趣的:(PE文件RVA-VA-Offset)