天天看点

PE 文件格式

      PE(Portable Exec utable)是 Win32 平台下可执行文件遵守的数据格式。

       常见的可执行文件(如“*.exe”文件和“*.dll”文件)都是典型的 PE 文件。

一个可执行文件不光包含了二进制的机器代码,还会自带许多其他信息,如字符串、菜单、图标、位图、字体等。

       PE 文件格式规定了所有的这些信息在可执行文件中如何组织。在程序被执行时,操作系统会按照 PE 文件格式的约定去相应的地方准确地定位各种类型的资源,并分别装入内存的不同区域。如果没有这种通用的文件格式约定,试想可执行文件装入内存将会变成一件多么困难的事情!

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

       一个典型的 PE 文件中包含的节如下。

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

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

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

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

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

题外话:如果是正常编译出的标准 PE 文件,其节信息往往是大致相同的。但这些
section 的名字只是为了方便人的记忆与使用,使用 Microsoft Visual C++中的编译指示
符#pragma dat a_seg()可以把代码中的任意部分编译到 PE 的任意节中,节名也可以自
己定义。如果可执行文件经过了“加壳”处理,PE 的节信息就会变得非常“古怪”。
在 Crack 和反病毒分析中需要经常处理这类古怪的 PE 文件。