APP下载

磁盘加密文件的零类中断反跟踪探究

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中断.程序反跟踪技术作为磁盘加密的一个重要手段,研究其具有实际意义,因此还需在实践中不断摸索.

猜你喜欢

程序段断点子程序
基于WinCC的物料小车控制系统设计与仿真
砂泥互层断点组合类型及其合理性分析
——以大庆长垣萨尔图油田为例
数控系统手轮回退功能的研究与实现*
用Eclipse调试Python
一类无限可能问题的解法
基于NC程序段的提高数控加工监控阈值与信号同步的方法*
数控铣床FANUC 0i 系统刀具半径补偿系统参数设置解析
浅谈子程序在数控车编程中的应用
基于保护协调配合的最小断点集选取方法
子程序在数控车加工槽中的应用探索