这样就可以读取光标处的字符和属性了。 (3)修改显示器I/O中断服务程序的入口地址:显示器I/O中断INT10H的中断入口地址存放在内存地址0000:0040H开始的4个字节中,修改这4个字节中的内容,就可破坏或扩充显示器I/O中断服务程序。 (4)定时清屏:利用对时钟中断的扩充,可以使时钟中断定时清屏。 (5)直接对视屏缓冲区操作:每台机器都有固定位置和长度的视屏缓冲区(具体的位置和长度随显示器的类型而不同),不过各类显示器上的所有信息都是视屏缓冲区中信息的反应。如果软件直接对视屏缓冲区进行操作,可以获得比利用显示中断快得多的显示速度,现在许多先进的跟踪调试软件都采取了这种方法,一是提高速度;二是针对反跟踪技术,所以反跟踪技术仅仅只修改显示中断的入口地址是远远不够的,还要通过对时钟中断的修改扩充,定时频繁地刷新视屏缓冲区中的内容。 检测跟踪法:当解密者利用各种跟踪调试软件对加密系统分析执行时,势必会造成许多与正常执行加密系统不一致的地方,如运行环境、中断入口和时间差异等等。如果在反跟踪技术中对不一致的地方采取一定的措施,也同样可以起到保护加密系统的目的。实现这种方法的关键在于以下两个方面:一是如果检测到加密系统是否被跟踪,二是检测到被跟踪后如何进行处理,前一个方面的实现主要依靠加密者对DOS内核和跟踪调试软件的深入了解,后者则一般是一种死循环、启动机器或提示非法跟踪并停止运行的程序,但也不排除有惩罚性动作的程序,在这里只主要讨论第一方面:(1)定时检测法:一个程序在正常运行和被跟踪运行时,所花的时间是大不相同的,可以想象一个被跟踪运行的程序往往要花费极长的时间,反跟踪技术抓住这个特点,根据执行时间的长短来判断是否被跟踪。这种技术在具体实现时有两点要注意:①确定程序正常运行时所需的时间:这个时间的取值一般比最慢速机器(8088)运行的时间稍微长一些,如果在检测执行时间时发现所用时间还大于定下的时间值,就可以肯定当前的程序是被跟踪执行;②发现执行所用的时间小于定下的时间值,也不能认为是?绝对没被跟踪,这是因为DEBUG的T和G命令在执行时将禁止所有可屏蔽的中断,用以计时的时钟中断也不例外,所以如果用T和P命令对程序进行动态跟踪执行时,会完全停止时钟的计数,有可能出现执行时间远小于规定的时间值的情况(甚至可能出现不用时间的怪事)。解决这个问题的办法除了利用抑制跟踪中断法外,还可通过时间中断1AH来解决:如果发现时钟不走动,则进入死循环。 MOVAH,0
INT1AH;读当前时钟值
MOVBX,DX;读取的时钟低部存入BX
LOOP:MOVAH,0
INT1AH
CMPBX,DX;比较时钟低部是否变动 JZLOOP;时钟未走动则返回重读
另外还存在另一种可能的情况:即解密者简化了加密程序,则也会引起执行所用时间小于规定值的情况,这种方法的对策是在反跟踪技术中加入定时检测关键部位数据是否改变和对代码实施保护法。(2)偶尔检测法:在加密系统中加入判断时间的功能,并且当时间满足某一条件时再对加密系统中的关键部位进行判断,如果关键部位不存在或发现了变化则可判定加密系统已经被破坏,应立即做出相应的反应。象这类反跟踪技术可以出现在加密系统的各处,并为了增加解密难度,还可以使多次出现的这类反跟踪技术紧密联系、环环相扣,以造成一种永远无法解密的感觉。这类技术如果运用于大的程序中可以极大的提高磁盘加密技术的可靠性,甚至几乎不可解密。(3)利用时钟中断法:时钟中断INT8大约每隔55ms就要被执行一次。它主要处理两项任务:一是计时;二是管理软盘驱动器的启闭时间,另外在它执行时,还要再次调用INT1AH和INT1CH中断,这其中的INT1CH中断实质上只是一个空操作的中断,它主要用于用户有某种周期性的工作时,让用户用自己设计的中断服务程序取而代之的。在反跟踪技术中利用时钟中断可以定时检查前台任务执行的情况,如果发现前台的程序被非法跟踪调试,可以立即采取相应的措施,也可以对中断向量表作定时检查、计算程序执行时间、密文的译码操作和前面说到的定时清屏等等。利用时钟中断法是一个非常有效的反跟踪技术,通过对INT1CH中断的扩充,时钟中断可以完成许多任务,但要注意的是,这个扩充程序不宜过大,以免影响前台程序的执行速度。(4)PSP法:每个程序在执行时都必须建立对应的程序段前缀PSP,当程序未被跟踪执行时,PSP中14H与16H开始的两个字节是相同的,当被跟踪运行时,这些内容就不会相同。(5)中断检测法:一个执行的程序如未被跟踪,则INT1和INT3的入口地址相同,且都为哑中断,如被跟踪则相反,所以通过检测INT1和INT3的入口地址即可判断是否被跟踪。
破坏中断向量表:DOS提供了从0到FFH的256个中断调用(见表1),它们驻留在内存的较低地址中,相应的入口地址位于内存0000:0000至0000:03FFH中,每个入口地址由4个字节组成,其中前两个字节为程序的偏移地址,后两个字节为程序的段地址。DEBUG等跟踪调试软件在运行时大量地使用了DOS提供的各类中断,不仅如此,比DEBUG功能更强大,甚至针对反跟踪技术设计的高级反反跟踪调试软件也调用了DOS中断,典型的例子就是使用其它中断来代替断点中断的反反跟踪技术。破坏中断向量表显然可以从根本上破坏一切跟踪调试软件的运行环境,以达到"以不应万变"的最终目的。DOS和BIOS有个40段的数据区,它位于内存0040:0000至0040:00FFH,这256个字节存放的都是当前系统配置情况,对这些内容的修改也会直接影响到各类跟踪调试软件的正常运行。从LOCK89开始就已经使用了破坏中断向量表和部分40段数据区的反跟踪技术,因为这种技术的卓越表现,直至LOCK93这种反跟踪技术一直被保留延用下来。破坏中断表在其它反跟踪技术中也出现过,如:抑制跟踪中断、改变键盘中断服务程序入口地址和修改显示器中断服务程序入口地址等等,所以破坏中断表是一个涉及面极广、效果极好的反跟踪技术,它能最大程度地阻止解密者对加密系统的直接或间接动态跟踪,使解密技术面临一个全新的问题。 设置堆栈指针法:跟踪调试软件在运行时,会产生对堆栈的操作动作,比如:保存断点。因而在反跟踪技术中对于堆栈指针的运用就显得相当重要了,比如对堆栈指针的值进行设计,并力求使设计的结果具备一定的抗修改性,以免解密者通过再次修改堆栈指针的值来达到继续跟踪的目的。!TB38013100.gif (1)将堆栈指针设到ROM区:只读存储区ROM是无法保存数据的,堆栈指针如果指向ROM区域,势必不能保存数据,这将会使跟踪调试无法继续进行下去。 (2)设在程序段中:堆栈指针如果设在将要执行的程序段中,那么任何的堆栈操作都会破坏程序代码,使程序不能正常运行。 (3)设在中断向量表内:INT1和INT3是反跟踪技术一定要破坏的中断,所以将堆栈指针设在内存的低地址段内,既可以进行少量的堆栈操作(跟踪调试软件一般需要大量的堆栈来存放数据),还可以破坏单步和断点中断的入口地址。 (4)将堆栈指针移作它用:如果确认没有堆栈操作的话,可以将堆栈指针拿来做其它用途,如保存经常要更换的数据,这样就可以使堆栈指针的值经常更换,从而使它根本无法保存数据。设置堆栈指针法是一个针对动态跟踪设计的反跟踪技术,不过它的运用有着一定的限制:(1)要保证将要执行的程序段不能进行有效的堆栈操作;(2)在要进行堆栈操作时,必须首先恢复正确的堆栈指针。设置堆栈指针不会影响到时钟中断保存数据,因为象时钟和键盘等系统中断保存数据所用的都是系统栈,而不象单步和断点中断是用堆栈来保存断点的。 对程序分块加密执行:为了防止加密程序被反汇编,加密程序最好以分块的密文形式装入内存,在执行时由上一块加密程序对其进行译码,而且在某一块执行结束后必须立即对它进行清除,这样在任何时刻内不可能从内存中得到完整的解密程序代码。这种方法除了能防止反汇编外还可以使解密者无法设置断点,从而从一个侧面来防止动态跟踪。 对程序段进行校验:对一个加密程序的解密工作往往只是对几个关键指令的修改,因此对程序段特别是关键指令的保护性校验是十分必要的,这样可以防止解密者对指令进行非法篡改。具体方法有累计、累减、累或和异或和程序段等方法。 迷惑、拖垮解密者:为了迷惑和拖垮解密者,可以在加密系统中多多设置专门针对解密者的"陷阱",这样既可以消耗解密者的时间和精力,还可以磨灭解密者的斗志和毅力。 (1)设置大循环:程序越简单,就越易读,跟踪也就越方便,便于这个原因,在加密系统中设置大循环,可以在精力上消耗解密者,延长跟踪破译加密系统的时间。这种反跟踪技术已经被广泛应用,而且取得了较好的效果。它的具体实现方法是:在加密程序中设置多重循环,并使上一层循环启动下一层循环,下一层循环启动下下一层循环,如此循环,而且还可以频繁地调用子程序,还要保证不能有一层循环被遗漏不执行。 (2)废指令法:在加密程序中设置适当的无用程序段,而且在这其中设置如大循环等程序,这种方法在反跟踪技术中被称为废指令法。要实现废指令法有三点要保证:①废指令要精心组织安排,不要让解密者识破机关,这是废指令法应具备的基本点,因为它的目的是诱导解密者去研究破解自身,并在破解过程中拖垮解密者,所以废指令法本身的伪装十分重要;②所用的废指令应大量选用用户生疏的指令或DOS内部功能的调用,以最大程度地消耗解密者的精力和破译时间;③要确保不实现任何功能的废指令段不能被逾越,这是废指令法要注意的一个重要问题,因为它如果能被轻易逾越,那么就说明加密系统所采取的废指令法是失败的反跟踪技术。 (3)程序自生成技术:程序的自生成是指在程序的运行过程中,利用上面的程序来生成将要执行的指令代码,并在程序中设置各种反跟踪措施的技术。这样可以使得反汇编的指令并非是将要执行的指令代码,同时还可以隐蔽关键指令代码,但由于实现代价较高,一般只对某些关键指令适用。 |