PE之RVA转FOA
公式
RVA = 内存地址-ImageBase
判断RVA在哪一个节上:
- RVA>=节n.VirtualAddress
- RVA<=(节n.VirtualAddress+节.SizeofRawData)内存对齐
偏移=RVA-节n.VirtualAddress
FOA=节n.PointerToRawData+偏移
实验-对齐大小一样
#include <stdio.h>
char str[] = "ABC";
int main()
{
printf("Address: %p\n", &str);
printf("V: %s\n", str);
return 0;
}
- 执行后输出:
Address: 00424D8C
V: ABC
获取ImageBase
- ImageBase在扩展PE头上的第十个属性,基于扩展PE头偏移地址28个字节,大小为DWORD。
- 00004000,小端存储转十六进制为0x00400000,所以ImageBase的地址为0x00400000。
计算RVA
- RVA=内存地址-ImageBase=0x00024D8C
获取内存对齐和文件对齐
- SectionAlignment 内存对齐 在扩展PE头上的第十一个属性,大小为DWORD。
- FileAlignment 文件对齐 在扩展PE头上的第十二个属性,大小为DWORD。
- 发现内存对齐和文件对齐都是1000h,实验完再找一个对齐不一样的试试。
判断在哪一个节
- VirtualAddress在每一个节表的第三个属性,偏移为12个字节,大小为DWORD,得到第一个节表的VirtualAddress为00100000,小端转十六进制得到0x00001000。第二个节表的VirtualAddress为00200200,小端存储转十六进制得到0x00022000。第三个节表的VirtualAddress为00400200,小端存储转十六进制为00024000,RVA大于第二个节的VirtualAddress小于第三个节的VirtualAddress。所以在第二个节表里。
计算偏移
- RVA-第二个节的VirtualAddress=0x00024D8C-0x00022000=0x00002D8C
获取节表的PointerToRawData
- PointerToRawData在节表的第五个属性,基于节表偏移20个字节,大小为DWORD。
- 获取第二个节表的PointerToRawData得到00200200,小端存储转十六进制为0x00022000
计算FOA
- FOA=第二个节.PointerToRawData+偏移=0x00022000+0x00002D8C=0x00024D8C
- 发现和RVA是一样的,所以结论是:如果内存对齐和文件对齐是一样的,FOA=RVA。
验证
- 将0x00024D8C后面对应三个字节的改为41 41 41再执行等到
Address: 00424D8C
V: AAA
实验-对齐大小不一样
- 预编译修改内存对齐和文件对齐,记得文件对齐不能大于内存对齐。因为重新编译了,所以要重新算。
#pragma comment(linker, "/ALIGN:0x4000")
#pragma comment(linker, "/FILEALIGN:0x1000")
#include <stdio.h>
char str[] = "ABCD";
int main()
{
printf("Address: %p\n", &str);
printf("V: %s\n", str);
return 0;
}
- 执行后结果为:
Address: 0042CA30
V: ABCD
获取ImageBase
- ImageBase在扩展PE头上的第十个属性,基于扩展PE头偏移地址28个字节,大小为DWORD。
- 00004000,小端存储转十六进制为0x00400000,所以ImageBase的地址为0x00400000。
计算RVA
- RVA=内存地址-ImageBase=0x0042CA30-0x00400000=0x0002CA30
获取内存对齐和文件对齐
- SectionAlignment 内存对齐 在扩展PE头上的第十一个属性,基于扩展PE头偏移地址32个字节,大小为DWORD。
- FileAlignment 文件对齐 在扩展PE头上的第十二个属性,基于扩展PE头偏移地址36个字节,大小为DWORD。
- 发现内存对齐是4000h,文件对齐是1000h。
判断在哪一个节
- VirtualAddress在每一个节表的第三个属性,偏移为12个字节,大小为DWORD,得到第一个节表的VirtualAddress为00400000,小端转十六进制得到0x00004000。第二个节表的VirtualAddress为00800200,小端存储转十六进制得到0x00020800。第三个节表的VirtualAddress为00C00200,小端存储转十六进制为0x0002C000,第四个节表的VirtualAddress为00400300,小端存储转十六进制为0x00034000,RVA大于第三个节的VirtualAddress小于第四个节的VirtualAddress。所以在第三个节表里。
计算偏移
- RVA-第三个节的VirtualAddress=0x0002CA30-0x0002C000=0x00000A30
获取节表的PointerToRawData
- PointerToRawData在节表的第五个属性,基于节表偏移20个字节,大小为DWORD。
- 获取第三个节表的PointerToRawData得到00800200,小端存储转十六进制为0x00028000
计算FOA
- FOA=第三个节.PointerToRawData+偏移=0x00024000+0x00000A30=0x00024A30
验证
- 将0x00024A30后面对应三个字节的改为41 41 41 41再执行等到
Address: 0042CA30
V: AAAA
哔哩哔哩
PE之RVA转FOA的更多相关文章
- PE知识复习之PE的RVA与FOA的转换
PE知识复习之PE的RVA与FOA的转换 一丶简介PE的两种状态 首先我们知道PE有两种状态.一种是内存展开.一种是在文件中的状态.那么此时我们有一个需求. 我们想改变一个全局变量的初始值.此时应该怎 ...
- RVA到FOA的转换
地址空间:这个地址空间指的是PE文件被加载到内存的空间,是一个虚拟的地址空间,之所以不是物理空间是因为数据在内存中的位置经常在变,这样既可以节约内存开支又可以避开错误的内存位置.这个地址空间的大小为4 ...
- PE文件RV转FOA及FOA转RVA
/************************************************************************/ /* 功能:虚拟内存相对地址和文件偏移的转换 参数 ...
- Windows代码,添加一个节,以及RVA跟FOA互相转化,以及内存文件对齐代码.
/ 1.修改文件头节个数 +1 2.修改ImageBase 3.遍历节表,拷贝最后一个节表到下面 4.修改节的虚拟大小(节表.virtualSize) 5.修改节的虚拟地址(RVA 节表.virtua ...
- RVA与FOA的转换
主要取决于文件对齐与内存对齐的值
- 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)
0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...
- PE 学习之路 —— 区块表
1. 前述 在 NT 头结束后,紧接着就是区块表,区块表包含每个块在映象中的信息,分别指向不同的区块实体. 2. 区块表 区块表是一个 IMAGE_SECTION_HEADER 结构数组,这个结构包含 ...
- C++PE文件格式解析类(轻松制作自己的PE文件解析器)
PE是Portable Executable File Format(可移植的运行体)简写,它是眼下Windows平台上的主流可运行文件格式. PE文件里包括的内容非常多,详细我就不在这解释了,有兴趣 ...
- PE基础1
PE文件概述 文件格式 .png ..mp4..gif..dll等等,这些文件都具有不同格式 不能随意修改这些文件,否则将无法打开 PE文件(可执行文件) 学习PE文件目标 掌握PE文件就掌握wino ...
随机推荐
- TD tree体验
在体验了学长们设计的app后,我颇有感触,我们也可以凭借自己的力量来开发一款软件,虽然它可能并不如市面上相同类型的那么完美,但它对我们的意义却是不一样的. 我是在下午的见面会上看到的这款软件,接待的学 ...
- 解析C语言编程对缓冲区的理解
转载自:http://soft.chinabyte.com/database/47/12481547.shtml 下面介绍缓冲区的知识. 一.什么是缓冲区 缓冲区又称为缓存,它是内存空间的一部分.也就 ...
- Servlet映射细节
Servlet的映射细节: 1):一个Servlet程序(Web组件),可以配置多个<url-pattern>,表示一个Servlet有多个资源名称. <servlet-mappin ...
- 洛谷 P1043 数字游戏(区间dp)
题目链接:https://www.luogu.com.cn/problem/P1043 这道题与石子合并很类似,都是把一个环强制改成一个链,然后在链上做区间dp 要初始化出1~2n的前缀和,方便在O( ...
- python匿名函数与三元运算
匿名函数 匿名函数就是不需要显示式的指定函数名 首先看一行代码: def calc(x,y): return x*y print(calc(2,3)) # 换成匿名函数 calc = lambda ...
- 带你了解MyBatis一二级缓存
在对数据库进行噼里啪啦的查询时,可能存在多次使用相同的SQL语句去查询数据库,并且结果可能还一样,这时,如果不采取一些措施,每次都从数据库查询,会造成一定资源的浪费,所以Mybatis中提供了一级缓存 ...
- PAT 1004 Counting Leaves (30分)
1004 Counting Leaves (30分) A family hierarchy is usually presented by a pedigree tree. Your job is t ...
- PyQt5设置图片格式及动画
1.缩放图片'''使用QImage.Scale(width,height)方法可以来设置图片'''from PyQt5.QtCore import *from PyQt5.QtGui import * ...
- Spring Boot JPA 使用教程
JPA 是 Spring Boot 官方推荐的数据库访问组件,其充分体现了面向对象编程思想,有点像 asp.net 的 EFCore.JPA 也是众多 ORM 的抽象. 从本系列开始,都需要用到 my ...
- [转]JDK1.0到12各版本新特性
原文链接 JDK Version 1.0 1996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢.JDK Version 1.1 1 ...