1.1二进制文件概述

1.1PE文件格式

        PE(Portable Exec utable)是Win32平台下可执行文件遵守的数据格式。常见的可执行文件(如“*.exe”文件和“*.dll”文件)都是典型的PE文件。

        一个可执行文件不光包含了二进制的机器代码,还会自带许多其他信息,如字符串、菜单、图标、位图、字体等。PE文件格式规定了所有的这些信息在可执行文件中如何组织。在程序被执行时,操作系统会按照PE文件格式的约定去相应的地方准确地定位各种类型的资源,并分别装入内存的不同区域。

        PE文件格式把可执行文件分成若干个数据结(section),不同的资源被存放在不同的节中。一个典型的PE文件中包含的节如下。

        .text  由编译器产生,存放着二进制的机器代码,也就是我们反汇编和调试的对象;

        .data  初始化的数据块,如宏定义、全局变量、静态变量等;

        .idata  可执行文件所使用的动态链接库等外来函数与文件的信息;

        .rsrc  存放程序的资源,如图标、菜单等;

        除此之外,还可能出现的节包括“.reloc”、“.edata"等。

1.2虚拟内存

        Windows的内存可以被分为两个层面:物理内存和虚拟内存。物理内存需要进入到windows内核级别ring0才能看到。通常,在用户模式下,我们用调试器看到的内存地址都是虚拟内存。

        windows让所有的进程都”相信“自己拥有独立的4GB内存空间,但是,计算机实际内存条可能只有512MB,怎么可能为所有进程都分配4GB的内存呢?这一切都是通过虚拟内存管理器的映射做到的。

         进程所拥有的4GB虚拟内存中包含了程序运行时所需的资源,比如代码、栈空间、堆空间等。

1.3PE文件与虚拟内存的映射

        在调试漏洞时,可能经常需要做这样两种操作:

        (1)静态反汇编工具看到的PE文件中某条指令的位置是相对于磁盘文件而言的,即所谓的文件偏移;

        (2)在调试时看到的某条指令的地址是虚拟内存地址(VA),我们也经常需要回到PE文件中找到这条指令对应的机器码。

        为此,我们需要弄清楚PE文件地址和虚拟内存地址之间的映射关系。首先,我们先看看几个重要概念:

        1)文件偏移地址(File Offset)

        数据在PE文件中的地址叫文件偏移地址,这是文件在磁盘上存放时相对于文件开头的偏移。

        2)装载基址(Image Base)

        PE装入内存时的基地址。默认情况下,EXE文件在内存中的基地址是0x00400000,DLL文件是0x10000000。这些位置可以通过修改编译选项更改。

        3)虚拟内存地址(Virtual Address,VA)

        PE文件中的指令被装入内存后的地址。

        4)相对虚拟地址(Relation Virtual Address,RVA)

        相对虚拟地址是内存地址相对于映射基址的偏移量。

        虚拟内存地址、映射基址、相对虚拟内存地址三者之间的关系:

VA=Image Base+RVA

        如下图,在默认情况下,一般PE文件的0字节将对映到虚拟内存的0x00400000位置,这个地址就是所谓的装载地址(Image Base)。

         文件偏移是相对于文件开始处0字节的偏移,RVA(相对虚拟地址)则是相对于装载基址0x00400000处的偏移。由于操作系统在进行装载时“基本”上保持PE中的各种数据结构,所以文件偏移地址和RVA有很大的一致性。

        之所以说“基本”上一致是因为还有一些细微的差异。这些差异是由于文件数据的存放单位与内存数据存放单位不同而造成的。

        1)PE文件中的数据按照磁盘数据标准存放,以0x200字节为基本单位进行组织。当一个数据节(section)不足0x200字节时,不足的地方将被0x00填充;当一个数据节超过0x200字节时,下一个0x200块将被分配给这个节使用。因此PE数据节的大小永远是0x200的整数倍。

        2)当代码装入内存后,将按照内存数据标准存放,并以0x1000字节为基本单位进行组织。类似地,不足将被补全,若超出将分配下一个0x1000为其所用。因此,内存中的节总是0x1000的整数倍。

        下表列出了文件偏移地址和RVA之间的对应关系:

节(section)相对虚拟偏移量RVA文件偏移量
.text 0x000010000x0400
.rdata 0x000070000x6200
.data 0x000090000x7400
.rsrc 0x0002D0000x7800

 由存储单位差异引起的节基址差称为节偏移。文件偏移地址与虚拟内存地址之间的换算关系也可以表示:

文件偏移地址=虚拟偏移地址(VA)-装载基址(Image Base)-节偏移

                                           =RVA-节偏移

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值