外壳加密

        关于“外壳”这个词估计是中国人独创的,我觉得比较生动贴切,它的意思就是给可执行的文件加上一个外壳。为什么要给可执行文件加上个外壳呢?其目的不仅仅是加密一词就能够说明的,记得最早的外壳程序应该是 PKLITE,它是鼎鼎大名的 PKZIP 公司所写的一个小程序,其作用是对 DOS 下的可执行文件进行压缩,压缩后的文件一般只有原来的一半大小,但执行起来毫无问题。记得第一次看到这个程序的时候大呼神奇,实际上说穿了就是给原来的程序加了个壳,用户执行的实际上是这个外壳的程序,而这个外壳程序负责把用户原来的程序在内存中解开压缩,并把控制权交还给解开后的真正的程序,由于一切工作都是在内存中运行,用户根本不知道也不需要知道其运行过程,只要执行起来没有变化就好。当时有些人担心这些解压缩的工作会给程序带来额外的运行时间,但实际上所有的可执行文件都要读到内存中去执行,文件小了,从计算机硬盘上读到内存的时间自然也少了,两下相抵,实际上用户并不会感觉程序慢了多少。

        再其后就是计算机病毒的泛滥,其实那些感染可执行文件的病毒说穿了也是一种外壳,只不过这种外壳程序首先在把控制权交给真正执行的程序前,在系统内部先安装好了它的传染机制,然后在不告诉你的情况下给你每个运行的程序都加上一个“病毒壳”。在每天都有新病毒产生的今天,被动的杀毒好象已经赶不上病毒的产生速度,于是有人提出了主动预防的观点,这就是通用病毒免疫程序。它的原理是先在未被感染的文件上主动加上个壳,这个壳在执行的时候检查是否外面还有一个壳,如果有那么很可能是被病毒感染了,它会自动把外面的壳脱掉。

        说到这儿,你可能已经明白外壳程序到底是个什么东西了吧,如果在外壳程序中加入对软件锁或钥匙盘的验证部分,它就是我们所说的外壳加密了。其实外壳加密的作用还不止于此,在 Internet 上面有很多程序是专门为加壳而设计的,它对程序进行压缩或根本不压缩,它的主要特点在于反跟踪,加密代码和数据,保护你的程序数据完整性。如果你不希望你的程序代码被黑客修改,如果你的程序不希望被人跟踪调试,如果你的算法程序不想被别人静态分析,这种外壳程序就是为你设计的。

        当然外壳程序也可能是以上几种应用的结合体,例如软件锁的外壳加密,一反面它要验证软件锁的正确性,另一方面它要有强大的反跟踪机制来防止黑客修改外壳本身,另外还要对用户真正的程序进行数据加密。总之,外壳程序在某些开发者的脑子里是无所不能的。

        下面我简单介绍一下在不同的系统平台下可执行文件的异同以及外壳程序的要求:

        1、DOS 平台:

        DOS 下面的可执行文件格式分为两种,一种是以 .COM 结尾的纯代码文件。COM 文件没有文件头部分,缺省的总是从 100H 处开始执行,没有重定位项,这也限制了它的所有代码和数据必须控制在 64K 以内。对这种程序进行外壳加密是十分简单的,几乎不需要考虑太多的问题,除了加密后的代码也必须保证在 64K 以内。另外一种是以 .EXE 结尾的文件,这种文件以 MZ 开头,通常我们称之为 MZ 文件。MZ 文件有一个文件头,用来指出每个段的定义,以及重定位表。.EXE文件摆脱了 64K 的限制,是 DOS 下最主要的文件格式。即使有了文件头,MZ 格式看上去仍旧比较简单,外壳加密程序主要应处理好的就是重定位项的问题。

        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 又推出了一种新的可执行文件格式,Nicrosoft 称之为Portable 可执行文件。它同 NE 格式不同的是在 MZ 文件头之后是一个以 PE 开始的文件头。PE 文件格式是从 COFF 的 OBJ 格式发展而来的,它同 NE 格式相比是进了一大步, 其文件在磁盘中的格式同内存中的格式区别不大,装载程序实现起来相当简单,通过文件内存映像机制将磁盘文件映射到虚拟地址空间,并进行一下重定位及设定引入地址表即可。但由于 PE 文件不支持自装载,很多程序都用自己的方法来管理程序中的数据(如VB、VF...)。标准很不统一,给外壳加密的实现带来了很大的困难。另外还有一些技术细节资料的匮乏,也造成外壳加密实现上的困难。现有的外壳加密程序大多都是绕过一些敏感的内容来进行的,所以说 PE 下的外壳加密距离标准化、通用化还有一定的距离。

        外壳加密程序也不是没有缺点的,有很多网上免费的外壳加密程序兼容性很差,加密后的程序在某些计算机或某些操作系统下无法运行。但通常一个好的外壳加密程序足以抵挡大多数解密者的进攻,起码也会大大增加解密所花费的时间。为了你程序的安全性考虑,应仔细选择您的外壳加密。