我自己的PE文件RVA-VA-Offset心得

#   Name     Virt Size   RVA       Phys Size  Phys Off   Flags   --  -------- ---------  ---------  ---------  ---------  ---------  01  .text     0000CCC0   00001000   0000CE00   00000600   60000020 []  02  .data     00004628    0000E000   00002C00    0000D400   C0000040 []  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值