2.1 认识口令加密技术
口令加密技术作为较早期就出现的加密技术,主要有如下几种:口令加密、加密起始簇号、为COM文件加口令和为EXE文件加口令等(其中的口令可以是字符串,也可以是矩阵口令)。
2.1.1 口令加密技术的基本概念
口令加密技术就是在被加密软件的开始部分编写了一小段程序,这样,当该软件在运行时,就会首先要求用户输入口令。而用户所输入的字符串有两种表现形式,一种是不在屏幕上显示出来,另一种是以星号代替,这样用户输入的口令就不容易被别人窥探到,而口令校验时由程序将接受输入的字符串与程序中事先安排的规定字符串进行比较。如果两者一致,则该程序进入正常运行状态;反之,该程序将转入死循环或中途退出。
这种加密技术可适用于所有程序文件,文件只需要加入一段小程序就可以起到保护作用。如果在加密口令时采用了复杂的加密算法,将口令字作为加密密钥对程序进行加密、解密变换,则解密者一般是很难对其进行解密的,因此效果也较为可靠一些。因此,口令加密一般与其他加密方法结合起来使用,而不单独使用,以提高加密的效果。
如今市场上出售的通用加密软件为了限制未授权用户的使用,加强软件的加密效果,一般都提供有口令加密的功能,软件为了确保用户随时随地的使用或是不使用该功能,将该功能设置为一个可选项。如果用户启用了口令加密功能,则被加密的软件就具有了口令识别和身份验证的功能,只有输入正确的口令,才允许用户使用该软件,如果用户忘记口令,则软件不允许用户使用。
如在最为经典的一些口令加密示例程序中,该程序通常都是利用系统的功能调用07H来接收键盘输入口令的。在口令字输入的过程中,以回车键(0DH)作为结束符,将输入后的口令字与事先安排在程序中的规定值进行比较,如果两者一致,则显示“OK PASS…”等信息,然后运行程序;否则,将提示用户重新输入合法的口令字。并且还规定了该口令最多允许输入3次,如果3次输入均不正确,则屏幕将显示“未经允许不得使用本软件”等信息,使用户无法实现正常使用或直接退出。
这种口令判别的程序比较简单,加密效果不理想,容易被他人破解造成用户的损失。所以在实际应用中,在采用加密算法时先将口令字作为密钥,对文件中的主要程序段进行加密变换,而在程序的开头接收键盘输入的口令字作为密钥,对文件中的密码进行解密。如果用户没有输入正确的口令,则程序主代码无法解密,也就限制了非法用户的使用,而对于解密者来说要想解密这样的软件具有一定的难度。
如果想使加密后的程序正常运行,首先需要修改程序的代码,在程序接收到正确的口令字后,需要将用户输入的口令字与程序数据段中的指令密码进行解密运算,并将解密的结果存放在代码段中原有的位置,这样才能正常使用该软件。
一般为了防止因输入口令字的错误而导致最终的解密错误,可以采取将解密的结果求代码和的方法,以便检查输入口令字的正确性,从而决定是否再一次提示用户输入口令字或者直接退出软件的运行。
2.1.2 口令加密软件的起始簇号
在加密过程中可以将用户输入的口令字与文件的实际起始簇号进行运算,然后用得到的值来替换文件的起始簇号。起始簇号的存取可通过中断调用INT26H(绝对写盘)与INT25H(绝对读盘)来实现。由于起始簇号占2个字节,则它的可能值为164个,因此在不知口令的情况下,如果想要将其破译是需要花费大量时间和精力的。因此,可编制一个汇编程序,它应包括下列几个内容:要求用户输入口令字(为了避免失误,可要求输入2次进行确认);要求用户输入驱动器号及加密、解密的相关信息;进行口令验证,当口令不符时,显示“YOU ARE ILLEGAL!”等信息;用目录区中此文件目录项的起始簇号与用户所输入的口令字进行运算,并将最终结果存回;在程序中实现加密运算与解密逆运算,然后根据用户加密、解密的要求来进行选用。
实际应用中可设这样的程序名为TEST.EXE,经编译、连接后产生TEST.EXE文件。然后再根据提示分别输入文件名、驱动器号、加/解密要求及口令字等信息,在录入完这些相关的信息之后,就可以对目标文件实施加密了。一般为了增加破译难度,可用TEST.EXE文件进行多次加密。当然,这样所造成的最终结果是为了能运行正常也要进行多次解密程序。
2.1.3 可执行文件的口令加密
不管计算机的操作系统是DOS环境还是WIN32环境,可执行文件的扩展名为.EXE、.BAT和.COM类型,对可执行文件的加密保护仍然是软件加密技术的主要内容之一。由于DOS环境对软件的保护力度不够,导致可执行文件容易被破解。现在WIN7系统允许软件设置口令加密,同时,随着新的复制和调试工具不断涌现,就必须采取一些措施对可执行文件进行加密保护处理,以防止非法用户使用、分析或复制。下面分别介绍对以下5类文件的加密保护。
(1)EXE文件的口令加密
大家都很熟悉扩展名为.EXE的文件,因为其在计算机软件中的数量最多,因此软件加密的重点就是对这类文件的加密保护。EXE文件是由两部分组成的,即文件头与文件本身。因此对其实施加密的情况主要分为如下两种。
① 按口令字对EXE的头文件实施加密,使文件头的信息与程度不匹配。
② 对程序本身用口令字实施加密,这种加密方法与COM文件的加密方法类似,主要也是将附加程序段放在了EXE文件的末尾。
但由于EXE文件存在有复位的问题,因此在对EXE文件加密实现时还需要考虑下列几点。
① 附加程序段使用的堆栈不能采用SS、SP,而需要另设堆栈,因此需要修改文件头中的堆栈指针SP,使其指向新设的堆栈。
② 为了使附加程序在执行完毕之后能顺利回到程序的起始值,还需要将文件头中的代码段偏移值存放到附加程序段中,最后再用CS减去这个相对段值即可求出程序的起始段值。
③ 在文件的最后附加文件头中的“复位位项表”,并且只有在解密后才能对程序中的几个复位位项进行正确的复位。
④ 不能像COM文件那样靠修改程序的第一条为跳转指令来实现过程控制权的获得,而只能通过修改文件头中的入口地址(IP值),来使其指向最终的附加程序段。
⑤ 由于EXE文件增加了复位位项表和附加程序段,因此,其文件的长度也就随之而发生了变化。所以,还需要修改文件头中有关文件长度的几项内容。
实际上,为了减少许多不必要的编程和极易发生的冗余错误,可以不必为那些需要加密的可执行文件全部加上加密和反跟踪功能,而采取直接把一段标准的加密程序加到已有的可执行程序中去修改原文件头和有关指令,使修改后的程序能首先执行加密的反拷贝部分,然后运行原来部分的方法。
(2)COM文件的口令加密
为了对COM文件实施加密,可以采用对被保护的COM文件设置口令,通过口令对文件加密,并在程序末尾增加一个附加程序段,然后再进行存盘的加密思想,如图所示。
原文件与新文件的关系
下图所示即为对COM文件设置口令的流程图。其中,附加程序段用于负责输入用户口令及对代码进行变换,并最终将程序还原,然后转入程序入口正常执行,如下图所示。
为COM文件设置口令
附加程序段的工作示意图
通过检索用户可以发现,在PC上COM类文件其实已经占据了相当大的比重,且很多EXE类的文件都可以通过EXE2BIN来转换成COM类文件(大小要小于64KB),并且由于COM类文件比EXE文件的结构更为紧凑,而且执行更快,比EXE文件更好。因此,对COM类文件用设置口令的办法来实施加密保护有很好的应用前景。
(3)EXE和COM文件的异同
由于EXE和COM程序在运行结束之后,通常都会释放其占用的内存块(常驻内存的除外),因此,该类程序也称为“临时程序”。
EXE和COM文件的异同点主要如下。
① 文件大小不同:COM文件的全部程序与数据的总长度不可超过64KB,而EXE文件可存在任意大小。
② 执行速度不同:COM文件不需要进行复位,因此调入速度很快;而EXE文件则由于存在复位的过程,而相对较慢。
③ 存放位置不同:对COM文件而言,程序本身从CS:100H开始释放,其CS、DS、SS和ES都指向PSP所在的段。而对EXE文件,头文件则从CS:100H起存放,以后才是待复位的程序,尽管ES和DS还都指向PSP所在的段,但CS却不一定指向PSP所在的段。
④ 段的数目不同:COM文件的程序和数据都存在于同一个段中(不具有一个以上的段);而EXE文件的CS,DS,HE和SS却可以都不相同,可具有多个段。
如表所示即为在DOS下EXE文件与COM文件进行加载后的位置比较。
COM文件与EXE文件异同点
(4)口令加密可执行文件的矩阵方法
在加密过程中采用把口令设置为n×n的矩阵的方法,可以增加可执行文件加密的口令变化,如取(n=3),可以通过取矩阵中某两个字符为口令,如X和G,用户需要输入平行的两个字符,在这里要求输入A和Z即可。
使用该加密方法的优势是定期实现矩阵口令的更改,增加破解者的破译难度。可以很好地保护可执行文件,防止他人对可执行文件的修改。
(5).BAT文件的口令加密
扩展名为.BAT的批处理文件主要是由系统准许DOS命令的批量操作而生成的文件(该文件包含若干条DOS内部命令、外部命令以及有关的批处理命令),所以在根目录或任何一级目录上,都可以建立该文件。当系统在指定的路径上找到要执行的该批处理文件之后,就开始逐条解释执行该文件中所包含的各条命令,并且在执行完毕之后能够再返回到DOS的命令处理程序中。
虽然目前人们鉴于批处理文件中的各命令语句是由DOS逐条解释执行的,且对其内容进行加密保护的方法很少,对批处理文件源程序的保护,不能采用将其编译成二进制代码进行存储的方法,但人们仍然采取各种加密手段对其源程序进行了加密保护。对批处理文件的内容进行加密保护的方法如下。
如果能够采用DEBUG/PCTOOLS对批处理文件进行分析的话,就可以发现其实该文件中的每条命令都是以0DH,0AH作为该命令结束符的,而整个批处理文件则是以0DH,0AH, 1AH作为批处理程序结束符的。于是,就可以考虑采用所谓的“覆盖法”(是指在不破坏批处理程序组织结构的基础上,将其所有的内容迭加到一行上,进行层层覆盖,从而达到保护批处理的方法)来对批处理文件进行加密保护。
应用“覆盖法”对批处理文件进行加密之后,当用一些编辑软件对其进行显示或编辑时,该批处理程序的内容将逐条迭加到一行在屏幕上进行显示。这样一来,破解者就无法看到该批处理程序内容的整体了,但程序仍能够保证正常运行,从而也就达到了良好的对批处理文件内容加密保护的目的。
具体实施办法是将换行符0AH改为固定返回符00H,下面给出了一个用Turbo C语言编制的加密/解密保护批处理文件程序的源代码。
#include <dos.h> #include <stdio.h> #include <string.h> /* Begin main function */ main() { char errormsg[34], filename[15], * ptr, *data; static char readerror[]='READ failed'; File * stream; int length; printf('Please input decipher filename:') ; gets(fi lename); stream=fopen(filename, 'rb++'); if(stream=NULL) { printf('\07') ; strcpy(errormsg, readerror) ; pritf('\07'); pritf('%s', erroemsg) ; pritf('\07') ; } else { fseek(stream,2, SEEK_END) ; length=ftell(stream) ; data=(char *)calloc (unsigned)length, sizeof(char) ; if(! data) { printf('alloction failure_aborting') ; exit(1); } rewild(stream) ; while(! feof(stream)) { fscanf(stream, '%~\x00', data) ; while(ptr=strrchr(data, '\n')) strnset(ptr, '\x00',1) ; } rewind(stream); fwrite(data,1, length, stream); fclose(stream); } }