PE文件详解

 一、EXE文件的发展过程

最早的外壳程序应该是PKLITE,它是鼎鼎大名的PKZIP公司所写的一个小程序,其作用是对DOS下的可执行文件进行压缩,压缩后的文件一般只有原来的一半大小,但执行起来毫无问题。说穿了就是给原来的程序加了个壳,用户执行的实际上是这个外壳的程序,而这个外壳程序负责把用户原来的程序在内存中解开压缩,并把控制权交还给解开后的真正的程序。  
  病毒也是一种外壳。在每天都有新病毒产生的今天,被动杀毒已经赶不上病毒的产生速度,于是有人提出了主动预防的观点,这就是通用病毒免疫程序。它的原理是先在未被感染的文件上主动加上个壳,这个壳在执行的时候检查是否外面还有一个壳,如果有那么很可能是被病毒感染了,它会自动把外面的壳脱掉。  
  如果在外壳程序中加入对软件锁或钥匙盘的验证部分,它就是我们所说的外壳加密了。其实外壳加密的作用还不止于此,在Internet上面有很多程序是专门为加壳而设计的。它的主要特点在于反跟踪,加密代码和数据,保护你的程序数据完整性。  
  当然外壳程序也可能是以上几种应用的结合体,例如软件锁的外壳加密,一方面它要验证软件锁的正确性,另一方面它要有强大的反跟踪机制来防止黑客修改外壳本身,另外还要对用户真正的程序进行数据加密。  
   
  下面我简单介绍一下在不同的系统平台下可执行文件的异同以及外壳程序的要求:  
  1、DOS   平台:  
  DOS   下面的可执行文件格式分为两种,一种是以.COM   结尾的纯代码文件。COM   文件没有文件头部分,缺省的总是从100H处开始执行,没有重定位项,这也限制了它的所有代码和数据必须控制在64K以内。对这种程序进行外壳加密是十分简单的,只要加密后的代码必须保证在64K以内就可以了。另外一种是以.EXE结尾的文件,这种文件以MZ开头,通常我们称之为MZ文件。MZ文件有一个文件头,用来指出每个段的定义,以及重定位表。.EXE文件摆脱了64K的限制,是DOS下最主要的文件格式。外壳加密程序主要应处理好的就是重定位项的问题。  
  2、Windows   16   位平台:  
  在Windows   3.1平台下Microsoft推出了一种新的可执行文件格式,在MZ文件头之后又有一个以NE开始的文件头,我们称之为NE文件。由于Windows的可执行文件同DOS相比增加了很多内容,如资源、动态库等。NE格式表现极为复杂,NE格式文件装载程序读取磁盘上的文件后,需要在内存中成一个完全不同的数据结构。但Microsoft可预见到这种格式的弱点,它允许用户编写自装载代码,也就是说你大可不必理睬   NE   格式的种种要求,只要你的程序能够在内存中生成   Windows   所需要的结构,Windows   不关心你存储在磁盘上的文件是什么结构的。正是利用这个特性,使Windows   16   位平台的外壳加密成为可能。因为你的自装载代码中除了装载代码外,还可以干一些你想干的事情。  
  3、Windows   32   位平台:  
  在   Windows   95/NT/2000   上,Microsoft又推出了一种被称之为Portable的新的可执行文件格式。PE文件格式是从COFF的OBJ格式发展而来的,它同NE格式相比进了一大步,   其文件在磁盘中的格式同内存中的格式区别不大,装载程序实现起来相当简单,通过文件内存映像机制将磁盘文件映射到虚拟地址空间,并进行一下重定位及设定引入地址表即可。但由于   PE   文件不支持自装载,很多程序都用自己的方法来管理程序中的数据(如VB、VF等),标准很不统一,给外壳加密的实现带来了很大的困难。另外还有一些技术细节资料的匮乏,也造成外壳加密实现上的困难。现有的外壳加密程序大多都是绕过一些敏感的内容来进行的,所以说PE下的外壳加密距离标准化、通用化还有一定的距离。  
  外壳加密程序也不是没有缺点的,有很多网上免费的外壳加密程序兼容性很差,加密后的程序在某些计算机或某些操作系统下无法运行。但通常一个好的外壳加密程序足以抵挡大多数解密者的进攻,起码也会大大增加解密所花费的时间。

 


二、   什么是PE格式?  
   
  说的这么热闹,什么是PE格式呢?PE(   Portable   Executable   可移植的可执行文件   )大  
  部分的WIN32程序都是用的PE格式。   
   
三、PE格式概貌  
  以下只是PE格式的大致结构请跟着本教程一步步理解他们吧!  
  +---------------+  
  |   DOS   MZ   header   |    
  +---------------+  
  |   DOS   stub             |  
  +---------------+    
  |   PE   header           |  
  +---------------+  
  |   Section   table   |  
  +---------------+    
  |   Section   1           |  
  +---------------+  
  |   Section   2           |  
  +---------------+    
  |   Section   ...       |  
  +---------------+  
  |   Section   n           |  
  +---------------+    
  1)   DOS   MZ   header  
  这一模块有64个字节(我所看到的大都如此),我们所关心的是开始和结尾的四个字节.  
  开始的四个字节是16   BIT的标志位   IMAGE_DOS_HEADER   4D   5A(ASC2码就是'MZ')  
  这就和BMP文件以'BM'为起始一样仅作标识,了解即可.查看一下刚才打开的文件(以后例子)  
  在文件最开始就能看见4D   5A(MZ)  
  最后的四个字节是从文件起始到PE   header模块的偏移量.例子中是E0   00   00   00(对于  
  格式我们最关心的不就是偏移量吗?还不记住?)。  
   
  2)   DOS   STUB  
  这一模块没有什么好说的.实际上是个有效的   EXE,在不支持   PE文件格式的操作系统中,  
  它将简单显示一个错误提示,类似于字符串   "This   program   requires   Windows"  
   
  3)   PE   header  
  这一模块比较重要.他包含很多重要的信息(如:支持在什么样的机器上运行,有多少section  
  是可执行文件还是DLL等.这个模块的起始地址可由DOS   MZ   header模块的的最后四个字节读出。  
  如读到的是   E0   00   00   00   则此模块的起始地址是0000000E,这样PE   LOADER可根据此地址跳过  
  DOS   STUB直接定位到此模块。  
   
  4)   section   table  
  PE格式真正的内容都是以   section为单位的,section   table是一个结构数组,该数组中成员的  
  个数就是该文件的SECTION个数,由PE   header模块读出。每个SECTION对应一个结构其  
  包含对应节的属性、文件偏移量、虚拟偏移量等。  
   
  5)   以下就是各个SECTION的内容了  
   
  了解了大概的模块让我们看看PE   LOADER的装载顺序(以下摘自iczelion的PE教程)  
   
  .当PE文件被执行,PE装载器检查   DOS   MZ   header   里的   PE   header   偏移量。  
  如果找到,则跳转到   PE   header。    
  .PE装载器检查   PE   header   的有效性。如果有效,就跳转到PE   header的尾部。    
  .紧跟   PE   header   的是节表。PE装载器读取其中的节信息,并采用文件映射方法将这些节映射到内存,  
  同时付上节表里指定的节属性。    
  .PE文件映射入内存后,PE装载器将处理PE文件中类似   import   table(引入表)逻辑部分。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值