PE——RVA与FOA的转换

RVA 与 FOA 转换概述

1.RVA(相对虚拟地址)与 FOA(文件偏移地址)的互相转换,是 PE 逆向分析的核心操作

2.RVA = 内存虚拟地址 − ImageBase;FOA 是数据在磁盘 PE 文件里的字节偏移

3.二者转换的核心依据:内存对齐与文件对齐不相等,节在磁盘与内存中的填充空白不一样

全局变量的存储规律

带初始值的全局变量:数据保存在 PE 文件内部

无初始值的全局变量:文件内不占用存储空间,仅运行时在内存开辟空间

带初始值的全局变量,可以先拿到内存地址算出 RVA,再转换成 FOA,定位到文件中的数据

全局变量定位难点

打印变量内存地址与数值,能够确认它所在的内存节

必须依靠 RVA→FOA 转换才能定位文件内的数据

直接搜索文件字符串 / 数值容易出错,因为文件内会存在大量相同字节

PE 文件两种布局形态

磁盘文件态、内存运行态,二者节的对齐粒度不一致

常见参数:内存对齐 0x1000,文件对齐 0x200

ImageBase 决定整个程序在内存中的起始地址

地址概念定义

  1. RVA 相对虚拟地址
    计算公式:RVA = 虚拟地址 − ImageBase
    含义:数据相对于程序加载基址的内存偏移
    作用:用来匹配节表,进而换算成文件偏移 FOA
  2. FOA 文件偏移地址
    含义:字节在硬盘 PE 文件中的绝对偏移位置
    转换必须结合节表、内存对齐、文件对齐参数

RVA 转 FOA 标准算法

第一步:判断目标 RVA 是否位于 PE 头部区域,若是,FOA = RVA

第二步:遍历节表,找到该 RVA 落在哪个节的 VirtualAddress, VirtualAddress+VirtualSize 区间内

第三步:计算偏移差值,完成转换:FOA = PointerToRawData + (RVA − VirtualAddress)

实践用途

编写代码实现RVA转FOA,定位全局变量在PE文件中的位置,直接修改初始常量值

相关推荐
MATLAB代码顾问21 小时前
Simulink PI 参数扫描与批量仿真完整 MATLAB 代码
开发语言·matlab
Want5951 天前
Python跳动的爱心②
开发语言·python·数学建模
小羊没烦恼!1 天前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
爱吃香菜的初学者1 天前
十六.Linux——多线程(2)
linux·运维·开发语言
jeo陽1 天前
04-循环实战:素数、最大公约数、级数求和与枚举法
c语言·开发语言·数据结构
暖核1 天前
kubeadm 集群运维:Worker 节点下线删除、整套集群销毁重建指南
运维·开发语言·php
菩提小狗1 天前
每日安全情报报告 · 2026-10-16
网络安全·漏洞·cve·安全情报·每日安全
tachibana21 天前
Go 语言里的 Context 是什么?
开发语言·后端·golang·go·语言
天桥下的卖艺者1 天前
R语言使用ggcube包轻松绘制文章中的各类3D图形
开发语言·3d·r语言
唐钰小宝B1 天前
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
java·开发语言·windows