Доклад: Маскировка вирусов

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

К-во Просмотров: 766
Бесплатно скачать Доклад: Маскировка вирусов