李 娜
(錦州師范高等專科學校,遼寧錦州121000)
一個應用軟件往往由若干個程序段組成,而每個程序段又可由若干子程序組成.程序中各種運算、判斷、分支轉移和循環過程很多,在眾多的指令群中,巧妙利用計算機系統的一些特殊中斷并隱蔽地調出,就會制造跟蹤障礙,達到防止跟蹤的目的[1].這種反跟蹤方法更隱蔽、更巧妙.如果想要了解程序中到底由哪些特殊中段實現反跟蹤的,就必須逐條跟蹤程序的運行,這就要花費大量時間和精力.因為在跟蹤的過程中,還要克服大量的抵制單步運行的反跟蹤措施,一般會使跟蹤者喪失信心——計算機零類中斷就是運用這一原理而產生的[2].
計算機系統都設有一個零類中斷,即“被零除”產生的中斷,其中斷功能是自動完成的.無論在程序哪個位置,只要是除法指令且除數為零,都產生“被零除”的錯誤,并由INT 00H中斷處理程序對此進行處理[3、4].因此,如果將某個加密程序段作為INT 00H 中斷的新的中斷處理程序,并預先留駐內存,要執行這段程序時,只需造成一個被零除的錯誤就可以了,而無需明顯地使用中斷指令或子程序調用去實現.在跟蹤情況下運行程序時,如果沒有逐條跟蹤到人為設置好的除法指令,或設斷點跟蹤時沒有將斷點設置到指令處,就不能發現一個程序段在悄悄地進行調用執行.設計較好的反跟蹤程序,還可以使跟蹤行為得不到除數為零的結果,自然也就無法去跟蹤中斷程序段了.跟蹤者如果不了解秘密執行的程序段的運行情況,就會使跟蹤失敗.有的跟蹤者自以為對程序進行了完整的跟蹤,而沒有發覺已經失去了對一段程序的了解.
此種方法的程序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!”.很明顯,程序沒有執行特定的子程序段,用戶可以在特定的子程序中斷安排關鍵數據及指令等內容,以防破譯.
為了便于理解,本文所給出的程序比較簡單,而真正的反跟蹤手段要復雜得多.例如,可以動態解碼過程得到一系列數據,由這些數再循環運算產生被零除的結果,進而產生INT 00H中斷.程序反跟蹤技術作為磁盤加密的一個重要手段,研究其具有實際意義,因此還需在實踐中不斷摸索.