PE文件:VA、RVA和FOA

2023-10-12 02:40
文章标签 va pe foa rva

本文主要是介绍PE文件:VA、RVA和FOA,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VA: 虚拟内存地址(Virtual Address)PE 文件被操作系统加载进内存后的地址。

RVA: PE文件的相对虚拟地址(Relative Virual Address)是PE文件中的数据、模块等运行在内存中的实际地址相对PE文件装载到内存的基址之间的距离。举例说明,如果PE文件装入虚拟地址(VA)空间的400000h处,且进程从虚址401000h开始执行,我们可以说进程执行起始地址在RVA 1000h。

FOA: 文件偏移地址(File Offset Address),和内存无关,它是指某个位置距离文件头的偏移。

VA和RVA的转换

VA=ImageBase+RVA

RVA和FOA的转换

PE文件中的节等模块加载到内存时,节的数据布局和文件中的内存布局基本保持不变。所以可以根据这个数据位置相对不变的特点来由RVA正确换算出到数据相对文件的偏移。即,每个节(section)中的数据的起始位置相对节的起始位置是不变的,不管节是在文件中还是被加载到内存中。 在这里插入图片描述
1.判断指定的RVA在那个节中
2.求得该节的起始地址RVA
3.求出偏移量Offset=RVA-节起始RVA
4.FOA = Offset+该节在磁盘中的起始地址

数据的文件偏移=(数据RVA - 节RVA) + 节的文件偏移

typedef struct _IMAGE_SECTION_HEADER {BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];   //8个字节的节区名称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;

FOA=RVA-VirtualAddress+PointerToRawData

代码实现:


//          RVA转FOA函数               //
/
DWORD   RvaToOffset(BYTE* pFileBaseAddress, DWORD Rva)
{// 获取DOS头PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pFileBaseAddress;// 获取NT头PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)(pFileBaseAddress + pDosHeader->e_lfanew);// 得到区段个数DWORD   SectionNumber = pNtHeader->FileHeader.NumberOfSections;// 得到区段PIMAGE_SECTION_HEADER pSectionHeader = IMAGE_FIRST_SECTION(pNtHeader);// 遍历区段表,找到RVA所在的区段/** 每个偏移,不管是在文件中,还是在内存中,它们距离区段开始位置的距离总是相等的。* 而且,区段表中,保存着两个开始偏移:*  1. 文件中的开始偏移*  2. 内存中的开始偏移* 具体过程:*  找到RVA所在区段, 然后计算出这个RVA到区段在内存中的开始位置的距离。*  用这个距离加上区段在文件中的开始位置就得到文件偏移了*/for (int i = 0; i < SectionNumber; ++i){// 区段的起始相对虚拟地址RVADWORD SectionBeginRva = pSectionHeader[i].VirtualAddress;// 区块的结束相对虚拟地址RVA = 区段的RVA地址 + 文件中的区段对齐大小DWORD SectionEndRva = pSectionHeader[i].VirtualAddress + pSectionHeader[i].SizeOfRawData;// 判断RVA是否在当前的区段中if (Rva >= SectionBeginRva&& Rva <= SectionEndRva){// 计算出RVA对应的文件偏移// 公式:文件偏移  =  RVA - 区段的起始相对虚拟地址RVA + 区段的起始文件偏移FOA// 1. 要转换的RVA - 区段的起始相对虚拟地址RVADWORD  Temp = Rva - pSectionHeader[i].VirtualAddress;// 2. 加上区段的起始文件偏移FOA,dwOffset为FOADWORD  FileOffset = Temp + pSectionHeader[i].PointerToRawData;// 3. 得到文件偏移FOAreturn FileOffset;}}return -1;
}

这篇关于PE文件:VA、RVA和FOA的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/192662

相关文章

Codewarrior中利用PE multilink下载程序debug时不能连接问题

现象:PC连接PE multilink然后连接单片机,mutilink上的与单片机的连接接口是正确的,但点击codewarrior中debug按钮,则会出现连接失败,如下图: 电脑端口也能识别 但就是不能连接。 解决方案:如下图点击[FAQ#29]然后进入, 按照这个界面给的解决方案去解决即可,重装一下驱动(此页面下面会给出相应的BDM驱动)

PE文件结构详解(非常详细)

最近在参考OpenShell为任务栏设置图片背景时,发现里面使用了IAT Hook,这一块没有接触过,去查资料的时候发现IAT Hook需要对PE文件结构有一定的了解,索性将PE文件结构的资料找出来,系统学习一下。 PE文件结构 Portable Executable (PE),可移植的可执行文件。在Windows平台下,所有的可执行文件(包括.exe, .dll, .sys, .ocx,

Windows编程系列:PE文件结构

Windows编程系列:PE文件结构 PE文件结构 Portable Executable (PE),可移植的可执行文件。在Windows平台下,所有的可执行文件(包括.exe, .dll, .sys, .ocx, .com等)均使用PE文件结构。这些使用了PE文件结构的可执行文件也称为PE文件。 PE结构包含的结构体有DOS头,PE标识 、文件头、可选头、目录头、目录结构、节表等 整体结构

【c语法】##__VA_ARGS__与__VA_ARGS__

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言__VA_ARGS__ 引言 在调试过程中,我们经常会自定义打印,比如日志信息的输出,这时就会用VA_ARGS,接下来详细讲解! VA_ARGS __VA_ARGS__是C语言设定的一个预定义宏,用于处理可变参数的参数列表。通常用在宏定义中,以便宏可以接收不定数量的参数,并将他们

EEMD-MPE-KPCA-BiLSTM、EEMD-MPE-BiLSTM、EEMD-PE-BiLSTM故障识别、诊断(Matlab)

EEMD-MPE-KPCA-BiLSTM(集合经验分解-多尺度排列熵-核主元分析-双向长短期网络)故障识别、诊断(Matlab) 目录 EEMD-MPE-KPCA-BiLSTM(集合经验分解-多尺度排列熵-核主元分析-双向长短期网络)故障识别、诊断(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EEMD-MPE-KPCA-BiLSTM(集合经验模

全网优质PE工具箱都在这,哪款是你的菜

PE工具箱是我们安装电脑以及系统维护常用工具,小编为大家整理了全网最全的优质PE工具箱,看看哪款是你在用的?你觉得哪个比较好呢? 1.微PE工具箱 微PE工具箱是一款轻量级、免安装的Windows PE救急维护工具,它能够在Windows操作系统无法启动时,通过U盘或其他介质进行启动,从而达到修复、维护和安装系统的目的。微PE工具箱的特点在于其小巧、高效,并且支持多种启动方式,包括从U盘、

问题2,RVA转换成FOA的问题

1,RVA转换成FOA的问题 假设:入下图,我们将37000转换成FOA? if (rva >= (pSectionheader->VirtualAddress) && rva <= (pSectionheader->VirtualAddress + pSectionheader->Misc.VirtualSize)) 第一个条件满足,第二个条件也满足;如果是36700也满足,所以不对;

问题1,PE文件转到内存中出现解析PE不正确的问题

1,使用fopen(FileName, “r”) r的方式读取文件到内存,此时就可能存在问题了,r以只读方式,有时候不表示字符的有可能就不读了,那么内存中就不会是完整的原始文件。所以此时要采用rb,二进制读取的方式。 bool ReadFileToMem(char* FileName, char**buf) { FILE* f; f = fopen(FileName, “rb”); if

大白菜PE系统进入时一直 ACPI_BIOS_ERROR

安装系统PE不支持,主板不兼容,换个WIN10的PE就解决了,跟之前部分电脑需要WIN8的PE同理 WIN10PE教程 WIN8PE教程

(转)RVA-相对虚拟地址解释

RVA是相对虚拟地址(Relative Virtual Address)的缩写,顾名思义,它是一个“相对”地址,也可以说是“偏移量”,PE文件的各种数据结构中涉及到地址的字段大部分都是以RVA表示的。 准 确地说,RVA就是当PE文件被装载到内存中后,某个数据的位置相对于文件头的偏移量。举个例子,如果Windows装载器将一个PE文件装入 00400000h处的内存中,而某个节中的某个数据被装入