简单概述:可执行文件之所以被操作系统加载且运行,是因为它们遵循相同的规范,而这个规范正是PE文件格式所确定。
1、PE文件格式的定义
PE文件格式:PE(Portable Executable)是win32平台下可执行文件遵守的数据格式。常见的可执行文件(例如:“.exe”和“.dll”)都是典型的PE文件。
可执行文件简介:一个可执行文件不光包含了二进制机器码,还会自带许多其他信息,如字符串、菜单、字体等。PE文件格式规定了所有的这些信息在可执行文件怎么组织。在程序被执行的时候,操作系统会按照PE文件格式的约定去相应的地方准确定位各种类型的资源,并分别装入内存的不同区域中。
2.PE文件格式的应用
PE文件格式把可执行文件分为若干个数据节(section),不同的资源被存放在不同的节中。一个经典的PE文件中包含的节如下:
(1).rsrc节:存放程序的资源。(例如:图标、菜单等)
(2).text节:由编译器产生,存放着二进制的机器代码,也是我们进行反汇编和调式的对象。
(3).data节:初始化的数据块,如:宏定义、全局变量、静态变量等。
(4).idata节:可执行文件所使用的动态链接库等外来函数与文件信息。
除此之外,还可能出现的节包括“.reloc”、“.edata”、“.tls”、“.rdata”等节。
具体功能如下(了解即可):
.reloc节:包含重定位信息,用于在程序加载时修正程序中的地址,以便适应不同的内存布局。
.edata节:包含导出表,用于指示该模块导出的函数和变量,供其他模块调用。
.tls节:包含线程局部存储相关信息,用于支持线程间的独立存储空间。
.rdata节:包含只读数据,通常用于存储程序中的常量、字符串等只读数据
3.PE格式的安全性(多样性)
如果是正常编译出的标准PE文件,可执行文件的节信息往往是大致相同的。当这些节的名字只是为了方便程序员的记忆和使用。使用Microsoft Visual C++中的编译知识符,将数据保存到指定的节中,从而达到混淆的效果,提高安全性:
#pragma data_seg("指定的节名称")
所以可以把代码中的任意部分编译到PE的任意节中,节名也可以自定义。如果可执行文件经过了“加壳”处理,PE的节信息就回很奇怪。
4.PE文件格式中涉及到的安全方法
加壳的定义:加壳的全称是可执行程序资源压缩,是保护文件的常用手段(对可执行文件代码,进行压缩或加密),加壳过的程序可以直接运行,但是不能查看源代码。要经过脱壳才可以查看源代码。()
加壳后的可执行文件,原始程序代码在磁盘文件中一般是以加密后的形式存在,只有当可执行文件被执行的时候,才会在内容中还原,这样就可以较为有效的放置对程序文件的非法修改和静态反编译。
加壳的分类:
(1)压缩加壳:压缩壳的特点是减小软件体积大小,加密不是目的。
(2)加密壳:加密壳的种类繁多,不同的壳侧重不同。如:一些加密壳单纯为了保护程序; 一些加密壳提供课外的功能(使用次数限制、时间限制等)。