PE文件格式的RVA概念

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

我们常说的RVA,很容易让我们理解成这是相对于节的RVA,其实不然。
要理解RVA的概念,首先还必须理解Section Header结构(由Section Header构成节表)。
typedef struct _IMAGE_SECTION_HEADER {
    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];
    union {
            DWORD   PhysicalAddress;
            DWORD   VirtualSize;
    } Misc;
    DWORD   VirtualAddress;
    DWORD   SizeOfRawData;
    DWORD   PointerToRawData;
    DWORD   PointerToRelocations;
    DWORD   PointerToLinenumbers;
    WORD    NumberOfRelocations;
    WORD    NumberOfLinenumbers;
    DWORD   Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

注意其中的VirtualAddress和PointerToRawData,这两个都是节的起始地址。不同之处在于:
VirtualAddress用在内存中指明该节的起始地址,而PointerToRawData用在文件中指明该
节的起始地址。


由于文件的对齐值和内存的对齐值不一样,所以,如果以直接用RVA(即iRVA)去定位的话,那么,可能是错误的。

这个RVA我把它分成三种情况,在不同情况下计算得出的RVA各给个名字:
为了方便理解,使用例子数据来说明。
typedef struct _IMAGE_SECTION_HEADER {
    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];  // .text
    union {
            DWORD   PhysicalAddress;
            DWORD   VirtualSize;    // 00069f9b
    } Misc;
    DWORD   VirtualAddress;      // 00000540
    DWORD   SizeOfRawData;      // 00069fc0
    DWORD   PointerToRawData;      // 00000540
    DWORD   PointerToRelocations;
    DWORD   PointerToLinenumbers;
    WORD    NumberOfRelocations;
    WORD    NumberOfLinenumbers;
    DWORD   Characteristics;      // 68000020
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
整理成和LordPE的形式如下:
名称Name  VOffset    VSize    ROffset    RSize    标志
.text    0000540    00069f9b  00000540  00069fc0  68000020

虚拟地址VA = 00049586,ImageBase = 00040000

1、该RVA是以ImageBase为参考的,即是通过RVA=VA - ImageBase = 00049586-00040000=9586 我们称其为iRVA(我们常说为RVA)
2、该RVA是以VOffset(如.text节的起始地址)为参考的,即是通过RVA=VA - VOffset,我们称其为mRVA(内存节偏移)
3、真正的文件偏为fRVA

我们很清楚的知道,唯有它们以节的起始地址为参考的相对偏移才是固定的。我们就根据这个来计算。
我们以VA=00049586为例子,为了得到它的文件偏移,我们需要经过以下的步骤:
先把VA转换成iRVA,即iRVA = VA - ImageBase = 00049586-00040000=9586
把iRVA转换成mRVA,即mRVA = iRVA - VOffset = 9586-540=9046
得到了mRVA后,就很容易得到fRVA了,fRVA = mRVA+ROffset = 9046+540=9586
所以,VA=00049586的文件偏移为fRVA=9586
上面由于ROffset和VOffset值一样,所以,你别以为直接计算就行了。
最后总结:
1、虚拟地址转文件偏地址fRVA
fRVA = mRVA + ROffset

由于mRVA = iRVA - VOffset
   再由于iRVA = 虚拟地址 - ImageBase
所以,mRVA = (虚拟地址 - ImageBase) - VOffset

所以,fRVA = (虚拟地址 - ImageBase) - VOffset + ROffset

最终得到:
fRVA = (虚拟地址 - ImageBase) - VOffset + ROffset

一个简单的代入法!

2、RVA转文件偏移地址fRVA
同上 

VirtualAddress是在内存中相对于ImageBase的偏移. RVA


VirtualAddress + ImageBase 得到的值才是该节在内存中的虚拟地址。

 

PE文件:(2)VA、RVA和FileOffset的理解 PE文件基本概念文件对齐和内存对齐RVA和FileOffsetVA及重定向的概念 基本概念   在PE文件的学习中,我们经常看到RVA,VA,文件偏移,内存偏移这些概念,这些术语到底是什么意思呢?   PE文件主要有两种状态,分别是加载和未加载。未加载时,PE文件内的数据被局限于一个文件内,空间较为有限。而在加载到进程的地址空间之后,PE文件拥有足够的空间来存放文件中的数据,这也就导致了区段存放的空间变大,即每个区段之间的空闲内存变大,因此,区段内的很多数据的地址相对于未加载时就需要往后偏移。   在上一篇 阅读详情

相关推荐

PE文件格式(逆向工程核心原理第13章)

PE文件格式 介绍 Windows系统下使用的可执行文件格式 Unix : COFF 32位:PE32 ; 64位:PE32+/PE+ PE文件格式 文件种类: 可执行系列:EXE、SCR 库系列:DLL、OCX、CPL、DRV 驱动程序系列:SYS、VXD 对象文件系列:OBJ(不可执行) 基本结构: PE头:DOS头到节区头 PE体:头下节区 文件中使用偏移(offset),内存中使用VA来表示位置 文件内容:代码,数据,资源节.

qq_44514541的博客 3840

PE文件解析(2):RVA与FOA转换和区段表

PE文件的相对虚拟地址是PE文件中的数据、模块等运行在内存中的实际地址相对PE文件装载到内存的基址之间的距离。举例说明,如果PE文件装入虚拟地址(VA)空间的400000h处,且进程从虚址401000h开始执行,我们可以说进程执行起始地址在RVA 1000h。: 虚拟内存地址(Virtual Address)PE 文件被操作系统加载进内存后的地址。文件偏移地址,和内存无关,它是指某个位置距离文件头的偏移。一个程序的各段在内存和文件中的对齐方式是不一样的。FOA:文件对齐值是0x200。

ylh的博客 1541

PE框架基础学习(一)

PE 结构图 虚拟地址(VA): 在一个程序运行起来的时候,会被加载到内存中,并且每个进程都有自己的4GB,这个4GB当中的某个位置叫做虚拟地址,由物理地址映射过来的,4GB的空间,并没有全部被用到。 基地址( Imagebase ): 磁盘中的文件加载到内存当中的时候可以加载到任意位置,而这个位置就是程序的基址。EXE默认的加载基址是400000h,DLL文件默认基址是100000...

想喝奶茶的胖大海 3752

ctf 逆向 回顾与总结

记录了我的逆向入门过程。

weixin_42100211的博客 7769

7.PE文件之RVA与FOA转换

PE文件头和PE内存映像的文件头大小是一样的.节的数据在内存和磁盘文件的大小是不一样的,节表项记录了内存映像中节的起始RVA(IMAGE_SECTION_HEADER -> VirtualAddress),也同样记录了本节在文件中的起始偏移FOA(IMAGE_SECTION_HEADER -> PointerToRawData).由于节在内存中是线性排列的,因此如果找到下一个节的内存起始RVA就能知道上一个节的大小,所有的节组合起来就是PE中除去文件头以外的内容,而文件头在磁盘文件中和内存中是没

kernelhack 5876

计算机原理-ACC 等14个指令缩写

14个指令缩写   CPU、PC、IR、CU、ALU、ACC、MQ、X、MAR、MDR、I/O、MIPS、CPI、FLOPS   解:全面的回答应分英文全称、中文名、中文解释三部分。   CPU——Central Processing Unit,中央处理机(器),见7题;   PC——Program Counter,程序计数器,存放当前欲执行指令的地址,并可自动计数形成下一条指令地址的计数器;...

Java学习 1万+

PE文件格式

PE文件格式介绍PE文件格式 介绍 PE文件:Windows操作系统下使用的可执行文件,PE文件是指32位的可执行文件,也称PE32,64位可执行文件称为PE+或PE32+。 PE文件格式 PE文件种类: 种类 主要扩展名 可执行系列 EXE、SCR 库系列 DLL、OCX、CPL、DRV 驱动程序系列 SYS、VXD 对象文件系列 OBJ ...

wk19951125的博客 388

逆向工程核心原理 第十三章 PE文件格式

0x00 前言 在没有接触壳之前,也不着急着做什么练习,PE文件格式还是要学一学的。 0x01 正文 1.VA&RVA VA:进程虚拟内存的绝对地址 RVA:相对虚拟地址。从某个基准位置(ImageBase)开始的相对地址 公式:RVA+ImageBase=VA PS: 32位Windows中,进程分配有4GB虚拟内存,因此进程中的VA范围是00000000~FFFFFFFF 2.PE头 ...

王嘟嘟的博客 812

PE学习----VA、RVA、File Offset】

参考了《Windows_PE权威指南》这本书 VA   (Virual Address)  虚拟地址   程序被载入od中 如该图显示的就是虚拟地址VA; RVA(Relative Virual Address)相对虚拟地址,表示此段代码在内存中相对于基地址的偏移。 File Offset 文件偏移地址 :当PE文件存储在磁盘上时,某个数据的位置相对于文件头的偏移量,称为文件地址。即C

jyw1111的专栏 2494

深入理解 WIN32 PE 文件格式

深入理解 WIN32 PE 文件格式

dvlinker的技术专栏 9690

《逆向工程核心原理》第13章——PE文件格式(1):PE

介绍 本章将详细讲解WIndows操作系统的PE(Portable Executable)文件格式相关知识。同时整理有关进程,内存,DLL等的内容。 PE是指32位可执行文件,也称PE32。64位可执行文件称为PE+或PE32+,是PE文件的一种扩展形式。 PE文件格式 PE文件种类如下: 种类 主扩展名 可执行系列 exe scr 库系列 dll ocx cpl drv 驱动程序系列 sys vxd 对象文件系列 obj 严格来讲,obj文件之外的所有文件都是.

diamond_biu的博客 1031

PE文件

参考文献:https://msdn.microsoft.com/en-us/magazine/ms809762.aspx https://msdn.microsoft.com/en-us/magazine/bb985992.aspx PE文件到内存的映射:http://www.cnblogs.com/qintangtao/archive/2013/01/28/2880606.html...

donggui8650的博客 224

PE解释器之前期准备工作

三:完整代码目录介绍及前期准备。

SXXYNHHXX的博客 660

逆向学习-PE文件格式

从DOS头到节区头是PE头部分,其下的节区合称PE体。文件中使用偏移(offset),内存中使用VA(Virtual Address,虚拟地址)来表示位置。文件加载到内存时,情况就会发生变化(节区的大小、位置等)。文件的内容一般可分为代码(.text)、数据(.data)、资源(,rsrc)节,分别保存。 VA指的是进程虚拟内存的绝对地址,RVA(Relative Virtuall A...

S1lenc3的博客 271

RVA to RAW

相对虚拟地址和文件偏移间的转换 RVA是相对虚拟地址(Relative Virtual Address)的缩写RVA是当PE 文件被装载到内存中后,某个数据位置相对于文件头的偏移量。 例如:导入表的位置和大小可以从PE文件头中IMAGE_OPTIONAL_HEADER32结构的数据目录字段中获取,对应的项目是DataDirectory字段的...

weixin_30469895的博客 297
上一篇: SockMon2005 网络验证的去除(附内存补丁程序源码)
下一篇: 一种注入进程,获得完全操控的方法之二
iiprogram
博客等级 码龄25年 1066粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值