PE即Portable Executable(可移植执行体)。它是Windows环境自身所带的执行体文件格式。它的一些特性继承自Unix的Coff(common object file format)文件格式。
“Portable Executable(可移植执行体)”意味着此文件格式是跨win32平台的:也就是说即使Windows运行在非Intel的CPU上,任何win32平台的PE装载器都能识别和使用该文件格式。基本上所有win32执行体(除了VxD和16位的Dll)都使用PE文件格式,包括NT的内核模式驱动程序(kernel mode drivers)。因而研究PE文件格式给了我们洞悉Windows结构的良机。
在绝大多数病毒爱好者的眼中,真正的病毒技术在PE病毒中才会得到真正的体现,因为令病毒极度疯狂的DOS时代已经过去。

PE文件结构

PE文件使用的是一个平面地址空间,所有代码和数据都合并在一起,组成一个很大的结构。文件的内容被分割为不同的区块(Section,又称为区段,节等),块中包含代码或数据。每个区块都有自己在内存中的属性,即可读/写,只读等。每个区块都有不同的名字,这名字主要用来表示区块的功能。一般我们遇到的以下区块的含义是:
.text 是在编译或汇编结束时产生的一种块,它的内容全是指令代码
.rdata 是运行期只读数据
.data 是初始化的数据块
.idata 包含其它外来DLL的函数及数据信息,即输入表
.rsrc 包含模块的全部资源:如图标、菜单、位图等

PE文件的优势

PE文件非常好的一个地方就是在磁盘上的数据结构与在内存中的结构是一致的。当系统装载一个可执行文件到内存中,主要就是将一个PE文件的某一部分映射到地址空间中。这样,PE文件的数据结构在磁盘和内存中就是一样的了。W)JQA25FE3%`DV(O)I@W)}N.png

PE相关名词解释

(1)入口点(Entry Point)
PE文件执行时的入口点(Entry Point)。也就是说,程序在执行时的第一行代码地址应该就是这个值。类似8086汇编语言中end start中start指向的入口地址。
(2)文件偏移地址(File Offset)
当PE文件存储在磁盘上的时候,各数据的地址称为文件的偏移地址。文件偏移地址从PE文件的第一个字节开始计数,起始值为0.
(3)虚拟地址(Virtual Address,VA)
由于Windows程序运行在保护模式下,所以应用程序访问存储器所使用的逻辑地址称为虚拟地址(因为它不是真正的物理地址,真正的物理地址被Windows老大妈的保护机制保护起来),又称为内存偏移地址(Memory Offset)
。与实地址模式下的“段地址:偏移地址”索引方式类似,虚拟地址也写成“段:偏移量”的形式,但是此处的段不再是段地址,而是指段选择子。
例如:“0123:00401000”
0123:表示段选择子,其数据储存在CS段选择器中,同一程序在不同系统环境下此值可能不同,因此我们不需要关心;
0040100:此处表示内存中的虚拟地址,一般来说,同一个程序的同一条指令在不同系统环境下,此值相同(PE映射原理)。
(4)基地址(ImageBase)
文件执行时被映射到指定内存地址中,这个初始内存地址被称为基地址。此值是由PE文件本身设定的。按照默认设置,用Visual C++建立的EXE文件基地址是00400000h,DLL文件基地址是10000000h。但是,这个值可以自己在编译器中设定。