认识PE格式一

最近开始看段刚老师的《加密与解密》(第三版),接触到了计算机底层的内容,其中提到了windows的可执行文件的PE格式。我将PE格式的大致内容归纳如下: PE文件使用的是一个平面地址空间,所有代码和数据都被合并在一起,组成一个很大的结构。 文件的内容被分割成不同的区块(section),块中包含代码和数据,每个块都有自己的属性,比如该块是否包含代码,是否可读或可写。不同名字 的区块对应着不同的功能: 在应用程序中最常出现的段有以下6种:

  • .执行代码段,通常 .text (Microsoft)或 CODE(Borland)命名;
  • .数据段,通常以 .data 、.rdata 或 .bss(Microsoft)、DATA(Borland)命名;
  • .资源段,通常以 .rsrc命名;
  • .导出表,通常以 .edata命名;
  • .导入表,通常以 .idata命名;
  • .调试信息段,通常以 .debug命名;

PE文件在磁盘上的数据和在内存中的结构是一样的。 我们给出PE文件结构

但我们又必须认识到PE文件不是作为单一内存映射文件被装入内存。Windows加载器(PE装载器)遍历PE文件并决定文件的哪一部分被映射(按照文件高的偏移位置映射到高内存地址中),

另外补充一点,EXE和DLL文件作为可执行文件的区别是用一个字段标识这个文件是EXE还是DLL,因为他们的PE格式是相同的。PE格式定义的主要地方位于头文件winnt.h 位于头文件include

在///Image Format///下定义了PE格式。

PE文件结构图网上有很多,这里给出目前最齐全的一个: PE文件结构

PE相关名词解释如下: 1.入口点(Entry Point) 程序在执行时的第一行代码的地址应该就是这个值。

2.文件偏移地址(File Offset) PE文件在磁盘上储存时,各数据的地址称文件偏移地址(File Offset)。用十六进制工具(例如Hex Workshop、WinHex等)打开文件显示的地址就是文件偏移地址。

3.虚拟地址(Virtual Address,VA) 由于Windows程序是运行在386保护模式下,在保护模式下,程序访问存储器所使用的逻辑地址称为虚拟地址(Virual Address,VA)。与实地址模式下的分段地址类似,虚拟地址也可写成"段:偏移量"的形式,这里的段是指段选择器。

4.基地址(ImageBase) 文件执行时将被映像到指定内存地址中,这个初始内存地址称为基址(ImageBase)。在Windows NT中,缺省的值是10000h;对于DLLs,缺省值为400000h。在Windows 9x中,10000h不能用来装入32位的执行文件,因为该地址处于所有进程共享的线性地址区域,因此Microsoft将Win32可执行文件的缺省基地址改变为400000h。

5.相对虚拟地址 相对虚拟地址(Relative Virual Address,RVA)表示此段代码在内存中相对于基地址的偏移。即:相对虚拟地址(RVA)=虚拟地址(VA)-基址(ImageBase)。

猜你喜欢

转载自my.oschina.net/u/3763247/blog/1787557