基于捆绑式的文件加密技术及实现
2012-08-15王小刚
王小刚
(山西水利职业技术学院,山西 太原 030027)
现在大部分的加密软件只是针对某种特殊的文件进行处理,并且只是使用简单的加密手段,很容易被解密者破解;有一些高强度的加密软件要求有昂贵硬件设备予以支持,这样加密后的文件很不方便在别的机器上对文件进行解密操作;还有一些加密软件是在利用系统的漏洞进行加密,一旦这些漏洞被修补,极易造成文件的丢失。
计算机病毒是指编制者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代码。试想可以用计算机病毒的原理,把插入的破坏计算机功能或数据的代码换成具有解密特定数据能力的代码,被注入病毒的文件可以看作是已加密好的数据,重新排列解密代码和被加密数据的位置,只要有执行能力的代码可以引导数据正确的解密,那么这种方法是行得通的。而且被加密的数据看成了一个整体,使用时将加密文件分离,这样就不会有特定文件类型的限制了,再在这个基础上辅以特定的加密算法,就可以对文件进行更强的保护了,杜绝了上面所属加密方法的不足。
由于是将具有执行能力的文件注入到已加密好的文件中,运行时将它们分离,我们就把这种方法叫做捆绑的方法。利用这种方法就可以对文件进行加密了。
捆绑是将几个东西用绳索等绑在一起,用在软件中就是这样的:想实现运行一个文件同时运行其他多个文件,必须要把多个文件“组合”成一个文件,而这一个文件还必须有“分解”的能力,这样才能把捆绑起来的文件分离出来,使之正常运行。而“组合”也可以有多种形式,比如把要捆绑的文件一个一个地加到文件末尾,或者以资源形式组合到一个文件中,还有复杂一点的利用专用的安装打包工具组合。基于捆绑式的文件加密使用的是第一种组合方式,也称为传统式捆绑机。
这里把起捆绑并加密文件作用的程序叫做加密程序,它是一个可执行文件;要加密的文件经加密程序加
一、捆绑
密后捆绑在事先写好的具有解密能力的解密程序文件尾部,此时的文件称为解密程序,具有解密引导功能的程序称为解密引导程序。解密时,先执行具有解密能力的解密程序,从自身中分离出捆绑的那个需要解密的文件。
1.软件设计
如何保护自己的文件不被非授权盗用的问题,始终困扰着每一个人。现在市面上充斥着各式各样的加密软件,用这些加密软件可以加密用户的文件,它通常是将待加密的文件作为纯数据处理,加密后还需一个特定的解密软件来针对这个加密后的文件进行解密,这样做的缺点是显而易见的:解密时需要解密程序存在,不易于在未装有解密程序的平台上解密,通用性差,一旦解密程序丢失,加密后的文件是难以恢复的;大量的加密软件仅仅是针对PE可执行文件的,使得许多的其他文件没法保护;另外,还有些软件对数据的加密是利用系统的漏洞,这样对数据是很不全的。这里通过捆绑的方法将解密程序同加密的数据作为一个整体,加密后的文件将生成一个可执行文件,而不是一个单纯的数据乱码,单纯的数据很难判断自身是否完整,这样就使用户确定文件的完整。当文件使用时,要求用户拥有正确的密码,开始使用时能够和使用普通文件一样使用,使用完毕以后该文件依然保持加密状态,下次使用依然需要输入密码,解除了重复加解密的过程。
2.捆绑式加密技术实现语言及需解决的问题
Visual Basic软件的功能极为强大,深受程序员喜欢。VB的P-code方式编译的程序很难破解,因为我们跟踪用这种方式编译的程序时,看不到程序作者写的程序,只能看到VB的程序,我们只能在微软设计好的VB程序里面兜圈子,但是在兜圈子的过程中,作者的程序已经在执行了,并且由于它的开发速度快,适合于捆绑式文件加密技术的实现。
实现捆绑式的文件加密方法,需解决的几个问题:(1)如何加入密码检测;(2)如何隐藏文件密码;(3)
二、软件环境及需求
对正常用户而言,不应造成使用不便。
3.运行需求
正常使用时不应出错,若运行时遇到不可恢复的系统错误,也必须保证数据完好无损,要求系统运行时能够保证正确性、可靠性。
三、详细设计
(一)加密程序设计
1.用户界面设计
基于捆绑式的文件加密程序采用了易上手的向导式界面,拥有较强的交互性。用户依照步骤浏览找到待加密的文件,指定加密后文件的存储位置以及文件名,最后设置文件的密码。在用户输入密码时,软件系统将自动判断密码的强度,这样可以帮助用户选择合适强度的密码。
2.加密过程实现
当用户选择好加密的文件和加密后的文件位置之后,并输入要设置的密码后就可以进行程序的加密了。程序加密时,首先将要加密的文件以二进制的形式读入一个文件大小的p1Array缓冲中,然后以用户输入的密码作密匙对数组p1Array用事先写好的算法进行数据加密,加密后的数据仍放在数组p1Array中。为了日后解密的方便,将解密引导程序放在p1Array的前面,用捆绑的形式,在我们运行解密程序时就可以对附在后面的数据文件进行解密了。为了达到跨机运行,就不得不把密码写入加密后的文件中,这里为了演示清楚,以“[Password]”为密码存放开始的标志,将加密后的密码信息放在“[Password]”后面,这样还不够,将来解密文件后,仍要保持文件的类型,将文件的扩展名放在“[FN]”后面,最后将解密引导程序+加密后的文件数据+[Password]+加密后的密码+[FN]+未加密的文件扩展名保存为加密后的文件的尾部。
3.密码加密的保存
若将密码以明文的形式保存在加密文件中,很容易通过查看加密文件获得密码,那么这样对加密文件是十分危险的,我们就必须对密码进行加密保存。这里用MD5对密码进行加密,这样做的好处是它将产生一个固定长度为128位的信息摘要,有利于解密时密码正确与否的判断。
4.加密后加密文件完整性的判断
加密后的文件很容易被那些破解者通过文件编辑器编辑,修改特定的代码,以达到破解的目的,那么就必须预防这种破解手段,实现软件代码校验,以防止被修改,比如用CRC或者MD5进行自身代码完整性检测。加密程序是加密文件的程序,同时也是一个用于在文件末尾增加stCRC特征码的程序。特征码用于保存所需的校验标志位和校验码信息,在解密时将判断校验信息,经过这一处理,修改任何一处,解密软件运行后会自动退出,给用户程序没有运行的假象,对于校验信息的判断将在解密引导程序中讨论。
(二)解密引导程序设计
1.用户界面及解密过程
因为加密后的文件是可执行的,只要双击就进入到了解密程序的引导界面,在这个界面中完成密码验证工作。当用户输入正确的解密密码后就会触发文件的解密的事件。解密程序从自身的程序中分解出经加密后的文件数据,然后把这些数据放入缓冲vbArray中,再对这一缓冲数组进行解密,最后将解密后的数据写入预定的文件。在加密程序的设计中,已经对加密后的文件引入了文件完整性的校验标志,那么解密程序执行时,首先就要判断文件是否完整,如果校验信息与标志不一致,就停止解密以保证数据安全。
2.加密文件的进一步保护
通过加密程序加密后的文件,它的加密强度还不是很强。由于解密引导程序同被加密的数据是捆绑在一起的,要保护加密的数据,就还要对解密引导程序进行一些安全处理,以防破解者通过跟踪解密引导程序的方法得知解密密码,所以对加密文件的进一步保护就等同于对解密引导程序的保护。以下是笔者对解密引导程序设计的一些保护方法:
(1)反调试Anti-Debug
检测父进程反RING3调试器,我们知道WIN32系统一般软件的父进程都是EXPLORE,而OllyDbg等RING3调试器对软件进行调试时都是将它们的进程设为它的子进程,我们只要让程序检查父进程是否为EXPLORE.EXE就行,如果发现父进程不是EXPLORE.EXE,就自动退出。
(2)反静态反汇编
对加密程序和解密引导程序加壳,增加程序的安全性,就会使静态反汇编程序不能对程序进行汇编,从而保护代码不被泄漏。
四、使用说明及测试
(一)使用说明
该软件能在WindowsXP以及以上的WINDOWS操作系统平台下运行,由于Windows操作系统使用的广泛性,使得这一方法可以被广泛地使用。它可以对任何想加密的文件(*.txt)、图像文件(*.jpg,*.gif,*.bmp)、音乐文件、可执行文件等几乎一切的文件进行加密。也就是说,你可以用它对各种文件进行加密,文本文件软件使你要加密的文件最终生成一个可执行文件,当文件使用时,要求您输入正确的密码,文件使用时和使用普通文件一样使用该文件,使用完毕以后该文件依然保持加密状态,下次使用依然需要输入密码,该软件解除了需要重复加解密的过程。
软件充分考虑了用户的操作,通过简单几步的界面选择便可以达到加密文件的目的。
(二)测试分析及效果
1.用加密程序Server加密WINDOWS自带的记事本Notepad.exe后的生成的文件记为NotepadJM.exe,运行加密后的文件并输入正确的密码可以成功地解密,并运行程序,软件基本功能实现。
2.用Ultra Edit打开NotepadJM.exe文件,任意修改一个字节,然后运行该程序,一旦运行程序退出,程序的完整性检查成功。
3.用目前流行的OllyDBG动态调试工具加载并运行NotepadJM.exe,调试器运行并使EIP指针转到结束代码,使得无法跟踪软件的解密过程,程序的反动态调试成功。
[1][美]Bruce Schneier.应用密码学[M].吴世忠,祝世雄,张文政,等译.北京:机械工业出版社,2000.
[2]武新华.加密解密全攻略(第3版)[M].北京:中国铁道出版社,2010.
[3][美]Collberg,C.软件加密与解密[M].北京:人民邮电出版社,2012.
[4]李良俊.Visual-Basic程序设计语言[M].北京:科学出版社,2011.