RVA 与 FOA 转换概述
1.RVA(相对虚拟地址)与 FOA(文件偏移地址)的互相转换,是 PE 逆向分析的核心操作
2.RVA = 内存虚拟地址 − ImageBase;FOA 是数据在磁盘 PE 文件里的字节偏移
3.二者转换的核心依据:内存对齐与文件对齐不相等,节在磁盘与内存中的填充空白不一样
全局变量的存储规律
带初始值的全局变量:数据保存在 PE 文件内部
无初始值的全局变量:文件内不占用存储空间,仅运行时在内存开辟空间
带初始值的全局变量,可以先拿到内存地址算出 RVA,再转换成 FOA,定位到文件中的数据
全局变量定位难点
打印变量内存地址与数值,能够确认它所在的内存节
必须依靠 RVA→FOA 转换才能定位文件内的数据
直接搜索文件字符串 / 数值容易出错,因为文件内会存在大量相同字节
PE 文件两种布局形态
磁盘文件态、内存运行态,二者节的对齐粒度不一致
常见参数:内存对齐 0x1000,文件对齐 0x200
ImageBase 决定整个程序在内存中的起始地址
地址概念定义
- RVA 相对虚拟地址
计算公式:RVA = 虚拟地址 − ImageBase
含义:数据相对于程序加载基址的内存偏移
作用:用来匹配节表,进而换算成文件偏移 FOA - FOA 文件偏移地址
含义:字节在硬盘 PE 文件中的绝对偏移位置
转换必须结合节表、内存对齐、文件对齐参数
RVA 转 FOA 标准算法
第一步:判断目标 RVA 是否位于 PE 头部区域,若是,FOA = RVA
第二步:遍历节表,找到该 RVA 落在哪个节的 VirtualAddress, VirtualAddress+VirtualSize 区间内
第三步:计算偏移差值,完成转换:FOA = PointerToRawData + (RVA − VirtualAddress)
实践用途
编写代码实现RVA转FOA,定位全局变量在PE文件中的位置,直接修改初始常量值