File Offest和RVA之间的关系

1.文件偏移地址 (File Offest)
数据在PE文件中的地址叫文件偏移地址,个人认为叫做文件地址更加准确.这是文件在磁盘上存放时相

对文件开头的偏移.

2.装载地址 (Image Base)
PE装入内存时的基地址.默认情况下,EXE文件在内存中的基地址是0x00400000,DLL文件是0x10000000.

这些位置可以通过修改编译选项更改.

3.虚拟内存地址 (Virtual Address,VA)
PE文件中的指令被装入内存后的地址.

4.相对虚拟地址 (Relative Virtual Address,RVA)
相对虚拟地址是内存地址相对于映射基质的偏移量.

虚拟内存地址,映射基质,相对虚拟内存地址三者之间有如下关系.

VA=Image Base + RVA

 

#     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的VA即A在内存中的地址。
                      VA = ImageBase + FileOffset + VRk = ImageBase + RVA

RVA             就是内存映像中A的位置与文件映射基址的差。
                     RVA = VA - ImageBase = File_Offset + VRk

PS: VA  就好比是“某一时刻”,例如:九点到校上课。
        RVA 就好比是“某一时间段”,例如:七点起床后,过两个小时到校上课。
        VA    是绝对的,一旦确定便不可更改。九点到校迟一秒钟也不行。
        RVA 是系相对的,虽然说过两个小时到校上课,但是如果我七点起床,便是九点上课。
        而如果我八点起床,便是十点上课了。

VRk     就是文件映射到内存后,每一节之前填充的00的个数。由于要进行对齐,所以文件加载到内存后每一节之间要填充大量00,正是因为这些00才使得RVA不同于File_Offset,因此文件中A的位置会变化。由于各个文件头与各个节大小不变,所以:
                VRk = RVA - File_Offset = <该节之前填充的00的个数>
最终,我们计算:
       由FileOffset到RVA/VA: 


       ImageBase      = 00400000
       FileOffset(A) = 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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值