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

相关推荐
zz-zjx1 小时前
Python实用转换模板
开发语言·前端·python
2601_962097561 小时前
摩根大通:AI发现漏洞速度远超修补能力 网络风险持续累积
网络安全·ai·工业设施·漏洞修补·补丁缺口
zuozong_1 小时前
C++类与对象
开发语言·c++·算法
lfSeanDragon1 小时前
数据结构-前缀树(Trie)
开发语言·c#
励志不掉头发的内向程序员1 小时前
【LibreCAD 2D架构】从两个坐标到图形实体:RS_ActionDrawLine如何创建RS_Line
开发语言·c++·qt·学习·系统架构
Thomas21431 小时前
scala 闭包
开发语言·后端·scala
sunshine22 girl2 小时前
Java学习一 环境配置1 安装JDK,配置环境变量
java·开发语言·学习
似水এ᭄往昔2 小时前
【Qt】--常用控件(按钮类控件)
开发语言·qt
范什么特西2 小时前
一些常用名词
开发语言·前端·javascript