Создаем вирус и антивирус (Гульев) - страница 45

shutdown_return:

;Устанавливаем регистр DS в соответствии с регистром CS

push cs

pop ds

;Восстанавливаем указатели на стек

;по ранее сохраненным значениям

mov ss,real_ss

mov sp,real_sp

;Закрываем адресную линию A20

call disable_a20

;Разрешаем немаскируемые прерывания

mov ax,000dh

out CMOS_PORT,al

;Разрешаем маскируемые прерывания

in al,INT_MASK_PORT

and al,0

out INT_MASK_PORT,al

sti

ret

set_real_mode ENDP

;Процедура, открывающая адресную линию A20. После открытия

;адресной линии программам будет доступна память свыше 1Мбайт

enable_a20 PROC

mov al,A20_PORT

out STATUS_PORT,al

mov al,A20_ON

out KBD_PORT_A,al

ret

enable_a20 ENDP

;Процедура, закрывающая адресную линию A20. После закрытия

;адресной линии программам будет недоступна память свыше

1Мбайт.

;Адресное пространство будет ”зацикленным” в пределах 1Мбайт

disable_a20 PROC

mov al,A20_PORT

out STATUS_PORT,al

mov al,A20_OFF

out KBD_PORT_A,al

ret

disable_a20 ENDP

;Здесь сохраняется адрес стека

real_sp dw ?

real_ss dw ?

;Эта строка выводится на экран после работы программы

;Символ ”?” заменяется на ”L” в защищенном режиме

qw db 13,10,”?ight General”,13,10,”$”

;Глобальная таблица дескрипторов. Нулевой дескриптор

;обязательно должен быть ”пустым”

GDT_BEG=$

gdtr label WORD

gdt_0 desc_struc <0,0,0,0,0>

gdt_gdt desc_struc

gdt_ds desc_struc

gdt_cs desc_struc

gdt_ss desc_struc

GDT_SIZE=($–GDT_BEG)

END start

Обход резидентных антивирусных мониторов

Обычно все программы используют сервис DOS так:

mov ah,... int 21h

По команде INT управление передается в точку, адрес которой определяется двумя словами, находящимися в таблице векторов прерываний по адресу 0000h:0084h. С этого момента начинается исполнение команд многочисленных обработчиков прерывания INT 21h и не менее многочисленных резидентных программ до тех пор, пока управление, наконец, не получит оригинальный обработчик операционной системы (рис. 5.1):

Рис. 5.1

Разумеется, среди этих многочисленных обработчиков может «затесаться» обработчик, принадлежащий антивирусному монитору, который не дает спокойно работать не только вирусам, но и обычным программам. Поэтому серьезные вирусы и некоторые хорошо написанные программы пытаются определить адрес оригинального обработчика и обратиться к нему напрямую, в обход остальных обработчиков:

mov ah,...

pushf

call dword ptr O21

...

O21 dw ?

S21 dw ?

Но антивирусные мониторы учитывают эту возможность и принимают свои меры.

Определение адреса оригинального обработчика DOS

Для того чтобы обратиться к DOS напрямую, нужно знать адрес оригинального обработчика. Получить этот адрес не так просто.