当前位置: 首页 > article >正文

RVA和FOA转换---三

文章目录

    • 修改初始值
    • RVA和FOA转换
      • RVA
      • FOA
      • RVA和FOA的关系

本次内容包含如何修改程序中的初始值,和如何转换内存和文件的地址。

修改初始值

问题
我们写了一个程序,可以输出一个结果,那么我们可以通过修改PE文件来改变这个输出结果吗?
对于有初始值的全局变量来说,是可以的。

我们在给全局变量赋初始值时,会在PE文件中记录其数据
没有初始值,无法找到

这里我们有如下一个程序:

#include<stdio.h>
int a = 0x12121212;
int main() {
	printf("a=(十六进制)%X\n", a);
	return 0;
}

执行结果如下:
在这里插入图片描述

以十六进制输出 a 的值。我们以二进制打开PE文件.这里我们将a先设置的特殊一点,便于寻找。
在这里插入图片描述
这里我们将结果12121212修改为00000000,然后另存为新文件。

在这里插入图片描述
然后再运行两个文件,发现值已经被修改:
在这里插入图片描述

RVA和FOA转换

RVA

RVA是PE文件在内存中的相对虚拟地址

比如全局变量a,在文件中是一个地址,然后映射到内存中,会有一个新地址,此时这个地址相对与基地址(也就是imageBase)的偏移量就是RVA。

FOA

FOA在PE文件在文件中的相对地址

全局变量a在文件中的地址,相对于文件起始地址的偏移量,上图中为B400h。

RVA和FOA的关系

由于两个都是相对偏移量,同时PE文件中又会记载文件对齐和内存对齐的地址信息。所有我们可以得到:

  1. 在文件头中时:RVA=FOA
  2. 在节数据中时:RVA - 内存中所在节的起始数据 = FOA - 文件中所在节的起始地址

在这里插入图片描述
在上面那个程序中,扩展PE头中,内存基址为02 00 00,内存对齐06 00 00,文件对齐0.
在这里插入图片描述
在标准PE头中记录节表数量
然后再去PE中查找节表的长度,所在节表是第几个。最后根据内存所在地址相对当前节偏移量 = 文件所在地址相对当前节偏移量就可以得到内存中的地址


http://www.kler.cn/a/273256.html

相关文章:

  • mysql 查看数据库、表的基本命令
  • 分布式光伏管理办法
  • C#属性 Property
  • SpringBoot整合EasyExcel加Vue
  • 刘艳兵-DBA018-关于数据库处于ARCHIVELOG模式下的说法正确的是?
  • 第三十一章 Vue之路由(VueRouter)
  • 独立维基和验收测试框架 Fitnesse 入门介绍
  • 数据结构与算法Bonus-KNN问题的代码求解过程
  • java15~17 密封类
  • 【JS逆向学习】猿人学第六题 js混淆 回溯
  • 数目之差
  • 【Paper Reading】6.RLHF-V 提出用RLHF的1.4k的数据微调显著降低MLLM的虚幻问题
  • upload-labs 0.1 靶机详解
  • 【Spring MVC】Spring MVC拦截器(Interceptor)
  • 《我的AUTOSAR之路》ECUM(二) 唤醒处理
  • 【Java】高级篇1:异常处理
  • 小迪安全42WEB攻防-通用漏洞文件包含LFIRFI伪协议
  • python 深度学习的学习路径
  • 机器学习----特征缩放
  • Mysql增删改查(详解)
  • 摄影第一课
  • java 程序连接 redis 集群 的时候报错 MUTLI is currently not supported in cluster mode
  • 阳光保险MySQL数据库平稳迁移OceanBase,稳定运营超700天
  • XDAG节点版本更新(0.6.5升级到0.7.0)
  • SpringBoot异常:类文件具有错误的版本 61.0, 应为 52.0的解决办法
  • 辐射全国、面向世界、聚焦未来——华为(深圳)全球具身智能产业创新中心正式成立