当前位置:首页 >技术文章>

加密软件的核心技术

 

日前,加密软件主要是在DOS上开发的。加密软件的主要技术方法都是类似的.我们这里讨论DOS上的软件加密技术。一般的用户都知道“加密软件”这个概念,但知道”加密软件具体是如何工作“的人相当少。我们首先升绍一下加密软件的工作方式.

加密软件有如下三种方式:

外壳式:加密软件把一段加密代码附加到执行程序上并把程序入口指向附加代码中。当被加密的程序装入内存后,附加代码首先执行,检查是否有跟踪程序存在,如果没有再检盘查密钥是否正确,如果正确,则转入原来的程序中。

这种方式的优点是不需要修改源代码,使用简单。然而,其缺点也很明显:一旦附加代码被击破,就会被解得干干净净。

内含式:加密代码以OBJ文件形式存在。应用程序调用这些加密代码,*后与要加密的程序编译连接到一起。

这种方式需要修改源代码,比较可靠。但是代码复杂性不如外壳式,不容易对二进制代码做复杂变形,容易被跟踪。违种方式主要用于使用软件加密狗和加密卡的加密程序。

结合式:把上述两种方法结合起来。用OBJ去检查外壳的可靠性,内外结合。

软件加密技术主要由密钥技术、反跟踪技术和代码插入技术构成,缺一不可。


一 密钥技术
密钥技术是指与密钥有关的全部技术,如密钥盘的制作、识别密钥盘、安装和回收密钥等。密钥的特点就是不能或者不容易复制。密钥主要分软盘、加密卡和并行口加密盒(也称“软件狗”)。这三种密钥的特点如下。


软盘 加密卡 加密盒
成本 较低
可靠性 一般 稳定 稳定
易安装性 不需要安装 复杂 容易
使用方便性 不方便 方便 方便
系统开销 别时需要插盘 占扩展槽和地址空间 并行口
产品盘备份 不能 可以 可以


由上表可见,三种密钥各有千秋.可以根据不同的需求选用。比如,对于一般的小型的软件来说,由于成本问题,选用软盘密钥的加密软件合适一些。我们来看一下软盘密钥的原理和制作的方法

在软盘上制作密钥的技术有很多种。*早的FROLOK是用激光在软盘上打孔,在软l制作无法复制的硬错误。还可以在软盘上制作弱位。软盘上的信息是二进制,即0与1.但弱位不是0也不是1——有时是0,有时是1,这种信息用计算机无法复制。目前,加密软件主要采用道缝加密。将数据写到某一格式化过的扇区时,因为不同的磁盘机会有转速的差别,因此数据写完后不可能与下一个扇区连接得无缝隙,而且这缝隙中会出现一些噪音信号。利用这种噪音信号来作为辨别是否是原盘的依据。这种方式可使目前所有拷贝程序(包括拷贝卡)都无法复翩。具体地说,由于磁道是圆形的.因此必然有头尾相接的地方,用这种接缝作为“指纹”来模仿PROLOK所用的激光孔“指纹”,可使每片母盘都不同·母盘的辨认程序的细节也会不同,制作方法简要说明如下:

 

1. 将格式化磁道的参数表中*后一个扇区N置为6;

2. 用INT 13H格式化一个磁道(实际上还是用正常大小恪式化,*步的结果只是改动了*后一个扇区的地址场);

3. 把INT 1EH指向的参数表中的N改为6;

4. 读*后一个扇区,就可把接缝读出来(此时错误号为10H).

5. 把INT 1EH指向的参数表中N恢复为2;

不同的盘、不同的磁道,制作出来的密钥是不同的。

二 反跟踪技术

有了好的密钥技术,没有强有力的反跟踪手段来保护它,解密者使用功能强大的调试器和一些辅助工具来破译,几分钟就可以解开,达不到保护的目的。反跟踪技术是加密软件*关键、工作量*大的部分,同时也是加密技术不、断推陈出新、永无止境的原因。

反跟踪的手段主要有以下几种:一种方法是把程序写乱或使用高级语言生成代码,使代码杂乱无章,跟踪者不容易看懂。另一种方法是主动出击,设置陷阱,让调试器不能正常工作,如破坏INT 3和INT1的中断向量,让DEBUG不能工作。识别调试器的存在情况,让程序走岔道。还有一种方法是做大量变形和和跳转、拖垮对手。

比如说,在BITLOK使用了加密虚拟饥、多层间址多堆栈链接等反跟踪技术。具体方法是:设计一个加密虚拟机。虚拟机指令用INTEL 80*86的指令来仿真。加密程序使用虚拟机指令;而且加上多层间址多堆栈链接等大工作量的操作,跟踪者即使看懂虚拟机指令,也容易被拖垮。

就未来的加密软件而言,*重要的是如何保护算法,那么反跟踪技术显得更为重要。


三、代码插入技术

加密的核心代码写好以后,剩下的工作是如何把这些代码插入到被加密的程序中,插入加密代码的方式较多,但首先必须了解DOS的执行文件格式。插入方式主要有内含式、外壳式、结合式。

内含方式把插入代码附加在文件尾部·把程序的入口点改到插入代码中,DOS依然使用EXEC(iNT 21H,功能4Bh)来执行被加密程序。(这种方法也是病毒传染的常用方法。)这种方法实现起来简单.但有很上的局限:无法插入到带覆盖模块的程序中,无法有效地解决EXE文件的代码变形问题。

外壳方式采用的是另外一种方法。它首先将原来的执行文件.比如说sample.exe变形为sample.ovl,插入代码将sample.exe看成覆盖模块,插入代码给自己取名为sample.exe,由sample.exe调用sample.exe,并决定sample.exe的装载和重定位方式(包括在装载过程中将被变形的代码复原)。

假如原来的执行文件sample.exe本身代有覆盖,上述方法就会碰到问题。因为像FOXpRO等编译出的数据库执行文件一般带有覆盖模块,而且它们的文件头内容相同。如果用对待一般执行文件的办法来加密这样的执行文件,跟踪者很容易识别它的文件头和代码部分跳过被加密的文件头,被加密文件的核心代码部分也就暴露无遗,起不到加密的效果。

比较好的做法是:插入代码把控制权转交给被变形的sample.exe之前,先将一个监控代码驻留在内存中,用来接管INT 21H操怍,如果sample.exe要执行某一个覆盖模块,则该驻留代码

截获文件操作,还原将要执行的覆盖代码。

在实现代码插入时,还应该注意非Mz格式的问题.目前在DOS上EXE文件主要是MZ格式,但使用OS/2恪式和BOSS格式的程序越束越多,如以Borland Pascal保护方式编译出的程序。这些问题增加了开发难度,开发者应该深入钻研。

在windows上开发加密软件与DOS上的基本原理是一到致的,但具体实观上有较大的差别。

 

超时代软件整理:www.360drm.com

  • 电话咨询

  • 4000-186-360