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文件中的位置,直接修改初始常量值

相关推荐
来让爷抱一个7 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
心祭丫丫9 小时前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
露天赏雪10 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
yeccheng12 小时前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
联犀12 小时前
纯 Go 的 CAD 开源库 go-cad:直接解析 DWG/DXF,现在也能导出 PDF
开发语言·golang·pdf
zjxtxdy13 小时前
C++面向对象程序开发-类与对象
开发语言·c++
qq_4069810315 小时前
c++拷贝构造函数
开发语言·c++
爱喝雪碧的可乐15 小时前
MATLAB
开发语言·算法·matlab
liferecords16 小时前
OpenAI 把「Critical」级挖洞模型交付出去了:GPT-6 Cyber 正式发布,越界率压到 1% 以下
网络安全·openai·ai安全·模型发布
H.莓飛17 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio