磁盘加密文件的零类中断反跟踪探究
2017-03-12李娜
李 娜
(锦州师范高等专科学校,辽宁锦州121000)
一个应用软件往往由若干个程序段组成,而每个程序段又可由若干子程序组成.程序中各种运算、判断、分支转移和循环过程很多,在众多的指令群中,巧妙利用计算机系统的一些特殊中断并隐蔽地调出,就会制造跟踪障碍,达到防止跟踪的目的[1].这种反跟踪方法更隐蔽、更巧妙.如果想要了解程序中到底由哪些特殊中段实现反跟踪的,就必须逐条跟踪程序的运行,这就要花费大量时间和精力.因为在跟踪的过程中,还要克服大量的抵制单步运行的反跟踪措施,一般会使跟踪者丧失信心——计算机零类中断就是运用这一原理而产生的[2].
1 零类中断原理
计算机系统都设有一个零类中断,即“被零除”产生的中断,其中断功能是自动完成的.无论在程序哪个位置,只要是除法指令且除数为零,都产生“被零除”的错误,并由INT 00H中断处理程序对此进行处理[3、4].因此,如果将某个加密程序段作为INT 00H 中断的新的中断处理程序,并预先留驻内存,要执行这段程序时,只需造成一个被零除的错误就可以了,而无需明显地使用中断指令或子程序调用去实现.在跟踪情况下运行程序时,如果没有逐条跟踪到人为设置好的除法指令,或设断点跟踪时没有将断点设置到指令处,就不能发现一个程序段在悄悄地进行调用执行.设计较好的反跟踪程序,还可以使跟踪行为得不到除数为零的结果,自然也就无法去跟踪中断程序段了.跟踪者如果不了解秘密执行的程序段的运行情况,就会使跟踪失败.有的跟踪者自以为对程序进行了完整的跟踪,而没有发觉已经失去了对一段程序的了解.
2 程序实现
此种方法的程序B1.ASM如下:
title B1. ASM
data segment
char db’program OK!’,0dh,0ah,24h
disp db’Run INT 00H!’ 0dh,0ah,24h
oldint dw 0,0
data ends
stack segment para stack
dw 20 dup (?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
begin:mov ax,data
mov ds,ax
mov es,ax
……
push ds
push es
cli
xor ax,ax
move es,ax
mov ax,es:[0000h]
mov oldint,ax
mov ax,es:[0002h]
mov oldint +2,ax
mov ax,seg int00
mov ds,ax
mov dx,offset int00
mov ax,2500h
int 21h
sti
pop es
pop ds
……
push es
mov ax,0000h
mov es,ax
mov ax,es[0004h]
mov bx,es[000ch]
xor bx,ax,
div bx
pop es
……
Push es
cli
mov ax,0000h
mov es,ax
mov ax,oldint
mov es:[0000h],ax
mov ax,oldint +2
mov es:[00002h],ax
sti
pop es
mov dx,offset char
mov ah,09h
int 21h
jmp eeee
;……
int00 proc near
push dx
push ax
push ds
cli
mov ax,0000h
mov es,ax
mov byte ptr es:[0004h],0cfh
mov byte ptr es:[000ch],0cfh
mov dx,seg disp
mov ds,dx
mov dx,offset disp
mov ah,09h
int 21h
sti
pop ds
pop dx
pop ax
pop ax
add,ax,1
push ax
iret
int00 endp
; ……
eeee: mov ah,4ch
int 21h
code ends
ends begin
程序中,开始设置了新的零类中断向量,也就是将INT 00H指向程序中的一个子程序.在程序执行的过程中,检测INT 01H和INT 03H的中断向量内容,并将INT 01H中断向量与INT 03H中断向量进行“异或”处理.这样做的目的是:当程序正常执行时,INT 01H和INT 03H 中断向量的值是一致的.通过两个数“异或”处理后得到一个零值,然后由除法指令DIV产生一个零类中断,即INT 00H中断.当程序被调试软件跟踪运行时,由于INT 00H和INT 03H的中断向量不一致,经过“异或”运算得到的结果不可能出现零值,这样也就产生不了零类中断,从而也就进入不了特定子程序,使跟踪失败.程序在正常运行时会显示“Run INT 00H!”和“Program Ok!”,而在被调试跟踪情况下运行就只显示“Program Ok!”.很明显,程序没有执行特定的子程序段,用户可以在特定的子程序中断安排关键数据及指令等内容,以防破译.
3 结语
为了便于理解,本文所给出的程序比较简单,而真正的反跟踪手段要复杂得多.例如,可以动态解码过程得到一系列数据,由这些数再循环运算产生被零除的结果,进而产生INT 00H中断.程序反跟踪技术作为磁盘加密的一个重要手段,研究其具有实际意义,因此还需在实践中不断摸索.