В.В.Водолазкий Бутовые вирусы на марше "Восьмое марта близко-близко, Сердце стучит, как лесной олень..." Народное творчество Обычно статья о компьютерных вирусах начинается с подробного изложения, кто это сделал и зачем, а заканчивается призывом "сурово наказать безответственных "технокрыс" (естественно, по просьбам трудящихся). Мы же постараемся отойти от шаблона и рассказать более подробно о работе бутовых вирусов (поражающих системный загрузчик - boot sector) и о том, как с ними бороться. В известной монографии Н.Н.Безрукова [1] утверждается, что бутовые вирусы постепенно вымирают. Но, к сожалению, не все оптимистичные прогнозы оправдываются. Для более предметного обсуждения наш рассказ будет построен на одном из самых распространенных (на момент написания статьи) вирусе. Он получил условное название "6 Марта", так как активизируется только в этот день, и мы надеемся, что данная публикация, во-первых, позволит предотвратить его проявление в массовых масштабах, а, во-вторых, поможет программисту в случае необходимости позаботиться о своей системе самому. Этот вирус представляет собой "злобствующую" вариацию на тему М-05 (Марихуана) и свидетельствует о знакомстве его автора с передовыми достижениями австралийской вирусной технологии на 1988 год. Имеющиеся в распоряжении автора антивирусные средства : AIDSTEST (версия 138), -V (версия 170) не обнаруживают данный вирус, а VR (версия 90) просто зависает. Итак, рассмотрим устройство вируса. Вирус "6-ое марта" Вспомним, как происходит процесс загрузки с гибкого или жесткого дисков. Первый сектор нулевой дорожки диска 0/0/1 (далее мы будем кодировать номер сектора следующим образом : H/T/S - головка/дорожка/сектор) считывается в оперативную память ЭВМ по адресу 07C0:0000 и затем управление передается по этому же адресу. В обязанности программы, записанной в этом секторе, входит загрузка необходимого программного обеспечения (если диск содержит операционную систему) или выдача предупреждения об отсутствии системы на диске. С точки зрения бутового вируса это означает: 1) программный код вируса привязывается к конкретной области в адресном пространстве; 2) вирус должен либо умещаться в объем 512 байт (длина сектора), либо обеспечивать последующую дозагрузку своего кода; 3) для обеспечения маскировки присутствия вируса на диске необходимо сохранять оригинальный (первоначальный) загрузчик в каком-либо из секторов для загрузки на место вируса. Как же решены эти проблемы в вирусе "6-ое Марта"? Первая операция, выполняемая вирусом - это перехват вектора прерывания 13 - обслуживание дисковых накопителей и запоминание системного вектора в теле вируса. После этого вирус уменьшает объем доступной системе оперативной памяти на два килобайта: xor ax,ax mov ds,ax . . . mov ax,ds:413h dec ax dec ax mov ds:413h,ax вычисляет сегментный адрес начала освободившегося участка памяти и переписывает туда тело вируса. После этого управление передается копии. В результате активна копия вируса, размещенная в верхних адресах оперативной памяти, к которым для операционной системы уже нет доступа. Область памяти, закрепленная ROM BIOS за загрузчиком (07С0:0000 - 07С0:01FF), теперь свободна и может быть использована для активизации настоящего загрузчика. Что же делает вирус дальше? Естественно, как и любое простейшее [2], он размножается. Вначале осуществляется проверка, заражена ли дискета в дисководе A:. Если нет, вирус осуществляет заражение гибкого диска. Если же загрузка идет с гибкого диска, вирус пытается инфицировать первичный загрузчик (Master Boot Record -- MBR) жесткого диска C:. Это означает, что если вы пытаетесь загрузиться с дискеты, зараженной вирусом, то ваш винчестер немедленно (!) будет заражен. При этом совершенно не важно, есть ли на дискете операционная система, или в загрузочном секторе должна быть программа, сообщающая об отсутствии системы и требующая перезапуска. Такая "прожорливость" обеспечивает вирусу достаточно высокую скорость распространения и значительно затрудняет его ликвидацию (именно за счет огромного числа копий). Но идем дальше. Итак, вирус пытается инфицировать дискету или жесткий диск. После этого осуществляется считывание значения системного времени. Обратите внимание на реализацию: mov ah,4 int 1ah cmp dx,306h ;это 6-ое марта je time_has_come retf ;передача управления ;оригинальному загрузчику time_has_come: ; ; активизация целевой функции ; вируса ; Дело в том, что приведенная последовательность команд будет корректно исполняться только для ЭВМ, совместимых с PC/AT. В PC/XT и наших советских пародиях типа ЕС1840 КМОП-таймера нет, и при включении ЭВМ системная дата и время сбрасываются. Это означает, что для вируса 6-ое марта не наступит никогда! Целевая функция вируса, получающая управление 6-го марта каждого года, состоит в разрушении информации на дисках. На это много ума не надо, и в комментариях данная часть кода не нуждается, а эпитеты читатель без труда подберет сам. Если же время для активизации вируса не пришло, управление передается настоящему загрузчику, спрятанному вирусом в одном из секторов, в зависимости от типа диска - носителя вируса (табл.1.). Таблица 1. Место хранения первоначального загрузчика вирусом "6-ое Марта" ╔═════════════════╤═══════════════════╤══════════════════════════════╗ ║ │ │ Адрес сектора ║ ║ Тип диска │ Тип носителя ├───────────┬─────────┬────────╢ ║ │ │ Головка │ Дорожка │Сектор ║ ╠═════════════════╪═══════════════════╪═══════════╪═════════╪════════╣ ║ 5.25" 1.2 MB │ F9 │ 1 │ 0 │ 0E ║ ╟─────────────────┼───────────────────┼───────────┼─────────┼────────╢ ║ 5.25" 360 KB │ FD │ 1 │ 0 │ 3 ║ ╟─────────────────┼───────────────────┼───────────┼─────────┼────────╢ ║ НМД "Винчестер" │ F8 │ 1 │ 0 │ 7 ║ ╚═════════════════╧═══════════════════╧═══════════╧═════════╧════════╝ После передачи управления загрузчику происходит штатная загрузка системы. При этом в оперативной памяти ЭВМ остается резидентная копия вируса, на которую подключен вектор 13. В примере 1 представлен обработчик вектора обслуживания дисковых накопителей, реализованный в вирусе "6-ое Марта". Vir_Int13 Proc Far push ds push ax or dl,dl ;доступ к ГМД? jnz wint_service xor ax,ax mov ds,ax ;настройка сегмента данных ;на работу с переменными ;BIOS test byte ptr ds:Disk_Motor_Run,1 ; проверяем, включен ли двигатель A: jnz wint_service pop ax pop ds pushf call cs:sys_vect_13 ;вызов истинного обработчика ;вектора 13h, сохраненного в ;теле вируса pushf call Replicate ;вызов процедуры, обеспечива- ;ющей размножение popf retf 2 ;вместо IRET Wint_service: pushf call cs:sys_vect_13 retf 2 Vir_int13 Endp Пример 1. Обработчик вектора 13h Как видно из программы, резидентная часть вируса осуществляет заражение только гибких дисков и только при обращении к дисководу. Процедура Replicate (не приведена) осуществляет заражение загрузочного сектора по следующему алгоритму: 1) считывает загрузочный сектор дискеты во внутренний буфер в верхних областях оперативной памяти; 2) по первым четырем байтам загрузчика определяет, имеется ли на дискете вирус; 3) если вируса на дискете нет, то вычисляется номер сектора, в котором должен храниться оригинальный загрузочный сектор (см. табл.1); 4) вычисленный номер сектора сохраняется в теле вируса; 5) в сектор 0/0/1 производится запись тела вируса; 6) осуществляется сохранение оригинального загрузчика. По окончании процедуры размножения управление возвращается программе пользователя. Ну что же, теперь, когда алгоритм работы вируса более или менее ясен, давайте составим план, как нам "выжечь каленым железом" забравшуюся на диск "заразу". Обнаружение и ликвидация вируса "6-ое Марта" Наиболее распространенный метод поиска вирусов - контекстный. Принцип его состоит в поиске определенных последовательностей байтов (т.н. сигнатур) в подозреваемых файлах (а в нашем случае - в загрузочном секторе). Выбор сигнатуры - дело тонкое и требует некоторого опыта. К счастью, автор вируса подумал об этом за нас, и мы можем использовать его решение. Как уже упоминалось выше, вирус определяет, заражена ли дискета (винчестер) путем проверки первых четырех байт загрузочного сектора. Если указанные байты имеют значение : F5 00 80 9E, то вирус считает, что диск уже инфицирован. Поскольку вирусом не предусмотрено никаких фокусов для защиты от трассировки (перехват INT 09, подстановка спрятанного BOOT-сектора), для обнаружения вируса достаточно выполнить следующие операции: 1) считать загрузочный сектор гибкого диска или MBR жесткого диска C:; 2) сравнить первые четыре байта считанного сектора с приведенным выше образцом (сигнатурой); 3) если сигнатура совпадает, принять решение о наличии вируса. Предположим, что проверка показала : диск заражен. Теперь нам необходимо предпринять ряд мер по его ликвидации. Как правило, уничтожение вирусов на дисках осуществляется после перезагрузки с "чистой" дискеты. Этот метод следует признать единственно верным, но ведь "всяко бывает". Поэтому, прежде чем предпринять какие-либо активные меры, мы должны убедиться в том, что в оперативной памяти нет резидентной части вируса. Для этого мы проверяем значение ячейки 0000:0413, в которой хранится объем доступной системе памяти. Это значение устанавливается в ходе отработки POST-кода, а затем корректируется вирусом. Для поиска вируса мы можем использовать следующий алгоритм: 1) вычисляем сегментный адрес области памяти, следующей за объявленной для системы; 2) если вычисленное значение указывает на видеоОЗУ ($A000), то вируса в памяти нет; 3)сканируем оперативную память, начиная с вычисленного сегментного адреса, по начало области видеоОЗУ; 4) если обнаружены байты сигнатуры, выдать предупреждение пользователю о наличии в памяти вируса. Допустим теперь, что в оперативной памяти вируса нет. Мы можем переходить к проверке диска. Для этого мы считываем во внутренний буфер содержимое сектора загрузки (0/0/1) и проверяем его содержимое на предмет наличия той же самой сигнатуры. Если первые четыре байта содержимого буфера на совпадают с сигнатурой, можно не волноваться - вируса "6-ое Марта" на данном диске нет. Если же вирус обнаружен, его необходимо удалять. Ручное удаление вируса Быстро и надежно! С помощью Norton Utilities. Автор настоятельно рекомендует пользоваться старой доброй версией 4.5. Фокус в том, что в DISKEDIT версии 5.0 есть ошибка, которая не позволяет выбрать ОДИН сектор. В результате у вас появляется реальный шанс развалить всю систему. Если не верите - попробуйте! Для удаления вируса вам необходимо переписать сохраненный вирусом оригинальный занрузочный файл в загрузочный сектор. И все! Для определения места хранения загрузочного сектора вы должны воспользоваться табл. 1. Программное удаление вируса Методика удаления вируса из программы в общем-то не меняется. Возникает только один вопрос. Если при ручном удалении вируса пользователь знает, какой диск стоит у него в дисководе, и может определить, откуда взять сектор, то как это может сделать программа? На это автор может ответить только следующим: "Но ведь вирус-то это может сделать...". Поэтому мы в очередной раз воспользуемся результатами труда автора вируса. В примере 2 представлено начало вируса. Как видно из листинга, вирус сохраняет в своем теле адрес начального сектора. Поэтому, если вы взяли на себя смелость разработать собственный антивирус, то можете использовать эти данные для поиска оригинального сектора. Кстати, этот путь более надежен, чем попытки самому определить тип диска в дисководе. Ведь вирус мог ошибиться при установке типа, но зато точно знает, где хранится оригинальный загрузчик. 550F:0000 E9 00AC jmp Vir_Start 550F:0003 F5 00 80 9E db 0F5h, 00h, 80h, 9Eh 550F:0007 02 Heads_Num db 2 550F:0008 000E OrigSectAdr dw 0Eh 550F:000A 0015 9F00 OldInt13 dd 9F000015h Пример 2. Область данных вируса "6-е марта" Вот и все! Теперь вы знаете, как устроена очередная "компьютерная зараза" и как ее распознать и обезвредить. Будем надеяться, что эта статья попадет вам в руки до того, как вирус успеет себя проявить. В заключение сформулируем несколько положений, ради провозглашения которых собственно и писалась данная статья: 1. Чтобы написать вирус, много ума не надо. 2. Следствие п.1. Чтобы разобраться с вирусом, тоже много ума не надо. 3. Не так страшен вирус, как его малюют авторы антивирусных программ. 4. Помогай себе сам. 5. Учи аппаратуру и операционную систему, с которой работаешь. 6. Не зазнавайся! Всегда может найтись "технокрыса", знающая систему лучше тебя. Литература 1. Н.Н.Безруков. Компьютерная вирусология. Справочное руководство. К. УРЕ, 1990, 400 стр. 2. Кит Педлер, Джерри Девис. Мутант-59. М.: Правда, 1991, 457 стр.