(一) PE文件预备知识

  先说些废话吧!这段时间学习了一下PE结构的知识,<<PE权威指南>>这书也看了近1/3,收获还是不小,毕竟深入分析了MS的PE文件结构,一方面对程序结构的整体和局部有一个比较清晰的了解和把握,更重要的是想为以后的调试,加密解密,逆向分析打好扎实的基础.于是乎准备在此记录下自己的脚印.

言归正传,先鸟瞰一下咱们伟大MS创造的PE结构吧(此图比较大,已上传附件,PS:此图转载自kanxue bbs某贴中,下次找到必在此声明:D):

 

在开始描述PE之前,先给出PE中常常用到的四类地址:

1.虚拟内存地址(VA)

  PE文件被操作系统从磁盘加载到内存后,PE便拥有了自己独立的4G虚拟地址空间(32bit环境下),范围为0x00000000~0xffffffff,这个范围内的任意地址被称为虚拟内存地址(Virtual Address,VA).

2.相对虚拟内存地址(RVA)

  当一个进程被系统载入到内存空间后,与之相关的动态链接库也会被同时或者延迟加载(此后的导入表部分会提及),这些被加载到内存的文件被称为模块(MODULE),每一个模块被加载时都会有一个基地址,不同模块的基地址一般情况不相同,如果两个模块的基地址相同,就由操作系统来决定将这两个模块放在虚拟内存的哪个位置.

  所谓相对虚拟地址(Reverse Virtual Address,RVA),便是相对于基地址的偏移量.经常使用RVA来定位某个模块中特定位置(块,导入表,代码段诸如此类)的地址.

下面用一张图来描述RV和RVA之间的关系:

 

3.文件偏移地址(FOA)

文件偏移地址(Fille Offset Address,FOA)是指的存在于磁盘上的文件中某个位置距离文件头的偏移量.

 

现在再描述一下关于对齐的知识.对齐,这个词曾经在C语言结构体中遇到过,为了方便CPU寻址,当然,在PE结构中存在的三种对齐(内存对齐,文件对齐,资源数据对齐)也是为了制造一个平坦规律的环境方便内存管理和磁盘设备管理.

1.内存对齐

windows操作系统对内存属性的设置是以页作为单位,所以一般情况下,PE中的节在内存中的对齐单位至少是一个页的大小(32bit环境下,一页是4kb,也就是1000h,64bit环境下,一页是8kb,也就是2000h)

2.文件对齐

为了提高磁盘利用率,通常会在磁盘文件中将节的对齐粒度设置得比内存中小,一般情况,会以一个物理扇区的大小,即512字节(200h).所以数据段,代码段的起始地址是200h的倍数.同时,一般情况内存的对齐粒度会大于文件的对齐粒度.但是,要注意,如果内存的对齐粒度设置得比页小,那么文件对齐粒度一定要和内存对齐粒度一致.

3.资源数据对齐

资源文件中,资源字节码部分一般要求以4个字节对齐.

posted on 2012-10-11 22:43  coolhysteria  阅读(296)  评论(0编辑  收藏  举报

导航