小议异或算法实现外壳加密的程序设计

(整期优先)网络出版时间:2009-10-20
/ 1

小议异或算法实现外壳加密的程序设计

陈惠风

陈惠风(福州大学数学与计算机学院)

摘要:对于目前的软件行业来说,加密的目的只是争取尽可能长的时间内不被解密,在这段时间内收回开发投资并开发产品的新版本。用外壳法可以对Windows下的可执行文件进行加密,本文利用异或算法对文件的关键代码节来实现了这种加密,防止通过使用Soft-ice或者其他的调试软件来对程序进行反汇编,阻止分析源程序,以此来实现对软件的保护。

关键词:加密外壳异或算法附加代码段

0引言

计算机软件产品是一种知识密集的特殊产品,生产一个软件产品需要大量的人力物力,生产难度大,成本高,周期慢。但是,软件产品的复制却是相当的容易。这就导致了非法复制、盗版软件之风的泛滥。加密是目前保护知识产权的一种有效方式。但任何加密软件都可能被破译、我们不能因噎废食。加密与解密,是矛和盾的关系,要想防止被解读,必须提高加密技术。

1外壳加密法

在windows平台下的加密系统是一个对windows内核的探索,软件加密技术一般应该包括四个方面:防拷贝、防篡改、防跟踪和防解读。本文主要解决其中的一个问题——防解读,即防止通过使用Soft-ice或者其他的调试软件来对程序进行反汇编,阻止分析源程序,以此来实现对软件的保护。

对windows下的可执行文件加密可采用外壳加密法,它是直接处理待加密软件,在原软件的外面罩上一层“外壳”,这层外壳在原软件运行前先得到执行,从而达到加密的目的。这种方法实现起来相对困难,需要清晰了解windows可执行文件的格式,而且还要解决外壳与原软件之间的连接问题,但如果采用了高级的反跟踪与变形技术,经加密后的软件不仅操作丝毫不用改变,而且还有很好的保密性。

“外壳”的意思就是给可执行的文件加上一个壳。它是一段特殊的小程序,其作用是对dos下的可执行文件进行压缩,压缩后的文件一般只有原来的一半大小,但执行起来毫无困难。就是给原来的程序加了个壳,用户执行的实际上是这个外壳程序。而这个外壳程序负责把用户原程序在内存中解开压缩,并执行解开后的真正的程序。由于一切工作都是在内存中运行,用户根本不知道也不需要知道其运行过程。

采用的加密方法是外壳式的,主要目的就防止静态分析。

所谓静态分析就是使用反汇编软件(如W32dasm,unasm等等),对可执行文件本身进行反汇编。它反汇编的结果是按照文件中的指令代码直接翻译而来的。

2用异或算法实现外壳加密

外壳式就是加密软件把一段代码附加到执行程序上,并把程序入口指向附加的代码中。在此之前,我们先用一段程序对代码节,这个关键的节进行加密。当被加密的程序装入内存之后,附加代码首先执行,它是一个解密模块,通过附加代码对加密的模块进行解密,恢复原程序,并转入原来的程序中执行。但是,当有人试图通过静态分析的方法,对程序进行阅读和修改时,他们只会得到一个加密后的密文。这就是因为我们已经对关键的节(Section)进行了加密处理,这样,原程序完全可以抵御如W32dasm这样的功能强大的反汇编软件的静态分析。但外壳程序并不能保证不被反汇编软件的动态分析和修改,这是由其特殊的作用和反跟踪的脆弱性所决定的。

加密的核心代码主要是用win32汇编来完成的。我们先建立一个缓冲区,再把代码节的内容作为字符串读入缓冲区,在缓冲区中进行异或,将异或后的数据写入寄存器。我们还将生成一个新的文件,作为我们加密后的文件,所以,我们用FileStream.Writebuffer的方法将修改后的文件头和代码段写入一个新的文件。

现在,通过自己的加密模块,已经对原文件作出了一些修改,其中最大的改动就是对代码段的异或。现在的代码段已经是一段密文,但是如果就这样的话,原程序是无法直接运行的,那么也失去了软件保护的意义了。为了让程序正常运行,就一定要先解密,再运行。所以,就需要修改原程序的入口地址,让加密后的软件先执行我们的解密模块。在PE文件中,我们只需要把AddressOfEntryPoint指向我们自己的附加代码段,让附加代码段先执行就达到了目的。

通过运行这个加密程序,就把一个文件最重要的一个块,就是的每个文件都必须有的代码节.text(或称Code)进行了加密。

本程序实现了对WindowsNT下的可执行文件的加密,基本上可以满足在一般场合下的程序加密需要。因此,由本程序加密生成的可执行文件可以防止非法使用者对原程序的直接修改和静态分析。