0day_软件漏洞分析技术-笔记1-PE文件与虚拟内存之间的映射

PE文件与虚拟内存之间的映射

PE(portable executable)是win32平台下可执行文件遵守的数据格式。常见的如:“*.exe”、“.bat”等文件都是PE文件。
PE文件格式把可执行文件分成若干个数据节(section),一个典型的PE文件中包含如下:
.text:由编译器产生,存在着二进制机器代码,也是反汇编和调试的对象。
.data:初始化的数据块,如宏定义,全局变量之类的。
.idata:可执行文件所用的动态链接库等外来函数与文件信息。
.rsrc:存放程序的资源,如图标,菜单等。

在调试漏洞的时候,会经常做这两种操作:
1、静态反汇编工具看到的PE文件中的某条指令的位置是相对于磁盘文件而言的,即所谓的文件偏移,还需要知道这条指令在内存所处的位置,虚拟内存地址(VA)。
2、在调试看到的某条指令的地址是虚拟内存地址,需要回到PE文件中找到这条指令对应的机器码。
为了完成以上两个操作,必须清楚PE文件和虚拟内存地址之间的映射关系。
1、文件偏移地址(File Offest)
数据在PE文件中的地址叫文件偏移地址,但叫做文件地址更加容易理解。这是文件在磁盘上存放时相对于文件开头的偏移。
2、装载基地址(Image Base)
PE装入内存时的基地址。默认情况下,EXE文件在内存中的基地址是0x00400000,DLL文件是0x10000000。这些位置可以通过修改编译器选项更改。
3、虚拟内存地址(Virtual Address,VA)
PE文件中的指令被装入内存后的地址。一般PE文件的0字节将对映射到虚拟内存的0x00400000位置,这个地址是所谓的装载基址
4、相对虚拟地址(Relative Virtual Address,RVA)
相对虚拟地址是内存地址相对于映射基地址的偏移量。
虚拟内存地址,映射基址,相对虚拟内存地址三者之间有如下关系:
虚拟内存地址=装载基址+相对虚拟地址
VA=Image Base+RVA

左边是磁盘数据格式,右边是内存数据格式

1、PE文件中的数据按照磁盘数据标准存放,以0x200字节为基本单位进行组织。当一个数据节(section)不足0x200字节时,不足的地方将被0x00填充;当一个数据节超过0x200字节时,下一个0x200块将分配给这个节使用。因此PE数据节的大小永远是0x200的整数倍。
2、当代码装入内存后,将按照内存数据标准存放,并以0x1000字节位基本单位进行组织。类似的,不足将被补全,若超出将分配下一个0x1000为其所用。因此,内存中的节总是0x1000的整数倍。

在这里插入图片描述

表中所列出的文件偏移地址和RVA之间的对应关系可以让大家更直接地理解这种“细微的差异”。
我们把这种由存储单位差异引起的节基址差称作节偏移,在上例中:
.text节偏移=0x1000-0x400=0xc00
.rdata节偏移=0x7000-0x6200=0xE00
.data节偏移=0x9000-0x7400=0x1C00
.rsrc节偏移=0x2D000-0x7800=0x25800
文件偏移地址与虚拟内存地址之间的换算关系可以用下面的公式来计算。
文件偏移地址=虚拟内存地址(VA)-装载基址(Image Base)-节偏移
文件偏移地址=RVA-节偏移

发布了30 篇原创文章 · 获赞 18 · 访问量 4万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览