我是靠谱客的博主 细腻摩托,最近开发中收集的这篇文章主要介绍【转】RVA、VA、Offset,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

ebd3140c0c93685feb24887f.jpg

对于变量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

Source:http://bbs.pediy.com/showthread.php?t=61737

转载于:https://www.cnblogs.com/findeasy/archive/2011/12/26/4053203.html

最后

以上就是细腻摩托为你收集整理的【转】RVA、VA、Offset的全部内容,希望文章能够帮你解决【转】RVA、VA、Offset所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部