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

相关推荐
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读5 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车5 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁5 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超5 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int5 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
XUEYUAN52125 天前
ASN 自治系统号风控:平台如何通过 IP 所属自治域批量识别代理流量
python·网络协议·http·网络安全·socks5
其实防守也摸鱼5 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
TechEdu2026065 天前
[人工智能]人工智能时代的零日漏洞与零日攻击
人工智能·网络安全·ai·信息安全
CoderYanger5 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法