2.3 探究激光孔加密技术
激光具有方向性好、高亮度及高光子简并度的特点,激光加密技术是指用激光在磁盘的数据区或扇区标识符上烧出若干个痕迹,但由于所产生的激光孔极小,不仔细看几乎不容易发现。磁盘上的某些位置可能会失去磁性,产生不可恢复的标志,以此达到加密的效果。
磁道上的磁性介质记录数据的正常功能被磁盘在激光处理过的区域中所产生的激光孔破坏了,于是必然会产生CRC校验错误。
一般加密磁盘通常都有自己的识别程序,也就是说,只有当该识别程序判断出现CRC校验错误时,才认为此盘是原盘,然后进一步执行被保护的用户程序;而如果没有检测到CRC校验错误,则认为该盘为复制盘,拒绝执行被保护的用户程序,这样使复制工具无法实现复制的目的,对用户的程序起到了很好的保护作用。
由于激光加密盘上的激光孔硬标志无法复制,因此,当使用高级复制软件复制激光加密盘时,经过复制后所产生的复制盘几乎都无法正常使用。即使使用具有激光孔的磁盘去复制激光加密盘,但由于每个激光加密盘上的激光孔个数不可能相同,或者即使激光孔的个数相同,位置也不可能相同,因此无法完成复制。如果能够在加密的时候再使用密码法将所保护的软件重新进行编码,这样一来,即使破解者利用反汇编方法将程序的汇编代码打印出来,也是读不懂程序的。
如在某个有激光孔的扇区写入全“33”,则其结果如下。
根据如图所示的激光孔检测示意图可以看出:该扇区上有2个激光孔,记下扇区号L及激光孔的位置,把它们保留在指定的单元中以备检测。
激光孔检测示意图
以较为著名的PROLOCK加密程序为例,其主要采取了如下几种措施来阻止解密者对其进行分析和跟踪。
1.隐蔽转移
为了不让解密者发现程序的走向,PROLOCK采用了隐式调用(如INT 0H调用)。这样做的好处是:当程序出现运算溢出时,将转向溢出处理程序,而这时的溢出处理程序已由加密程序所取代。
另外,还有一种隐式调用为单步中断调用。在中断处理返回时,要恢复标志寄存器,如在程序中把将要恢复的标志字中的单步标志置位,程序在返回断点前就要首先进入单步中断处理程序,这时的单步中断处理程序已被加密程序取代(这种隐式调用可以迷惑解密者)。
2.多循环多出口
PROLOCK充分利用了多循环多出口技术来增加解密者的工作量,以拖垮解密者。
较为典型的做法是:在PROLOCK程序块中有时为一段程序有意设置多次循环,并且在这些循环中设置有多个出口,而且许多出口的转向均由程序来实现动态设置。这样,就可以很容易使得跟踪者无法事先决定程序的走向,也就无法对程序正确设置断点了。
3.密文处理
当用户需要保护的程序被PROLOCK加密之后,通常是对其部分代码进行了密文处理,即使得该程序在DEBUG下用反汇编命令“U”无法实现静态分析,而是在执行过程中进行逐块解密,执行后再进行加密。这样,就可以实现在任何时刻内存中都不存在完整的明文程序,从而起到很好的保护作用。
4.反跟踪
为了防止解密者对自己的程序进行跟踪分析,PROLOCK还采用了多种防跟踪措施,主要如下。
(1)坏断点中断和单步中断的向量。
(2)PROLOCK程序把中断向量表中的0004-0007和000C-000FH用作程序的数据区。
由于程序在执行过程中需要经常对这几个单元进行存取操作,因此,当PROLOCK采用了这些防跟踪措施之后,就破坏了单步和断点中断向量。同时,为了能够防止解密者将该数据区转向别处,还在程序中大量地进行了该类操作,这就使得解密者在进行跟踪时改不胜改。
5.设置堆栈
在实施加密时,PROLOCK程序还有意把堆栈设置在内存低端。这样做的好处是一方面可以破坏中断向量区;另一方面可以破坏跟踪。
在没有跟踪的情况下,堆栈大小可以满足栈操作的要求。但当有用户对程序实施跟踪时,由于有额外的保存断点等操作,因此,就使得栈空间不够,从而导致跟踪者的返回地址丢失,出现系统混乱。