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 напрямую, нужно знать адрес оригинального обработчика. Получить этот адрес не так просто.