以IceLord程序为代表的BIOS Rootkit都采用IVT Hook的方式来取得对CPU流程的控制。这类BIOS Rootkit在对IVT进行Hook操作后,会在IVT上留下Hook后的痕迹,即中断向量值会与原始的中断向量值不同。这样能被ShowIVT.bin这样的IVT Hook检测程序所检测到(详见前面的系列文章)。
为了躲避IVT Hook检测程序,BIOS Rootkit可以在自定义的ISA模块先hook int 19h,然后主动调用int 19h中断,触发我们的自定义程序,再在自定义的程序中完成对int 19h原始中断向量值的写回操作,即unhook。这样在ISA模块中我们既完成了hook int 19h再hook int 13h的操作,又避免了在Hook IVT会在IVT留下Hook痕迹的弊端,可谓一举两得。下面我们编写程序来验证。
程序实现
程序Int19h_2.asm在其主函数begin中完成hook int 19h的工作,并主动调用int 19h中断来出发我们的自定义中断例程OurInt19h。而在中断例程OurInt19h函数中,我们在完成特定工作后(如继续Hook int 13h,这里我们并没有实现,只是简单显示一个字符串来进行验证),又恢复原始的int 19h中断向量,即完成unhook的工作。系统继续正常运行,好像什么都没有发生一样。程序如下:
;---------------------------- 字符串常量 ------------------------------
msgShow db 'Our own Int 19h procedure!',0
;----------------------------------------------------------------------
;----------------------------- 打印16进制(字节)------------------
whexb:
push ax
push dx
pushf
mov dh,dl
and dl,00fh
and dh,0f0h
ror dh,4
call @whb1
mov dh,dl
call @whb1
popf
pop dx
pop ax
ret
@whb1:
cmp dh,0ah
jc @whb2
add dh,7
@whb2:
add dh,'0'
mov ah,0eh
mov al,dh
int 10h
ret
;----------------------------- 打印字符串 ------------------------
write:
pusha
pushf
push bx
call wherexy
mov ah,9
xor cx,cx
xchg cl,bh
and cl,7fh
@wri1:
mov al,[cs:si]
cmp al,0
je @wri2
int 10h
inc si
inc dl
call gotoxy
jmp short @wri1
@wri2:
pop bx
cmp bh,80h
js @wri3
popf
popa
wcrlf:
pusha
pushf
mov ax,0e0dh
xor bl,bl
int 10h
mov al,0ah
int 10h
@wri3:
popf
popa
ret
;----------------------------- 打印16进制地址(DX:CX) ------------------------
whexptr:
push ax
push bx
call whexw
xchg dx,cx
xor bl,bl
mov ax,0e3ah
int 10h
call whexw
xchg dx,cx
pop bx
pop ax
ret
;----------------------------- 调整光标位置-----------------------
wherexy:
push ax
push bx
push cx
mov ah,3
mov bh,0
int 10h
pop cx
pop bx
pop ax
ret
;----------------------------- 调整光标位置-----------------------
gotoxy:
push ax
push bx
mov ah,2
mov bh,0
int 10h
pop bx
pop ax
ret
;----------------------------- 延迟函数 -----------------------
delay:
sti
push ax
push es
pushf
push byte 0
pop es
mov al,[es:046ch]
add ah,al
@dly1:
mov al,[es:046ch]
cmp ah,al
jne @dly1
popf
pop es
pop ax
ret
;---------------------------------------------------------------------
pop ip
pop cs
popf
;---------------------------------------------------------------------