\title/FN ═__ Компьютерные вирусы _________________________________________─ ©©© ═__ ┬III. Компьютерные вирусы Нам разрешается прослыть невеждами, мис╨ тиками, суеверными дураками. Нам одного не простят: если мы недооценим опастность. А. и Б. Стругацкие. Жук в муравейнике Когда в разговорах заходит речь о вирусах, реакция собеседников бы╨ вает весьма разнообразной: от хихикания и собирательства анкдотов до суеверного страха и комплекса вирусомании. Немногие знают о том, что уже существует наука вирусология. Вирусы - это опасность, а опасность нужно изучать, классифицировать и разрабатывать методы защиты от нее и борьбы с нею. Проявление эмоций становится неуместным. Мир вырос за последние годы. Отошли в прошлое времена, когда пользо╨ ватели смотрели на вирус, как на новое чудо. Вирусы поражают компьтеры сотнями тысяч и миллионами. В тот самый момент, когда Вы читаете эти строки, примерно 50 тысяч пользователей на Земле борются с поселившимся у них вирусом. За рубежом масштабы "эпидемий" достаточно велики. Многие вычисли╨ тельные сети уже пострадали от вирусов. Наибольший вред приносят прог╨ раммы-разрушители, уничтожающие базы данных различных коммерческих фирм. Проникнув в вычислительную сеть фирмы, вирус может поставить ор╨ ганизацию на грань разорения. Обычно ущерб тщательно скрывается фирмой, чтобы не прослыть неблагонадежной. Из числа зарегестрированных наиболь╨ шие потери понесла фирма "Фольксваген" - 1 млрд. долл.! Вредоносные программы (собственно вирусы, "троянские кони" и защи╨ щенные от копирования программы) весьма разнообразны по производимому эффекту: это и "рождественские елки", и "веселые проказники", и страш╨ ные "убийцы" дисков, и даже разрушители винчестеров. ┌Компьютерным вирусом будем называть программу, обладающую способнос╨ ┌тью к скрытому саморазмножению в среде стандартной операционной системы ┌ЭВМ путем включения в прямо или косвенно исполняемый код (загружаемые ┌программы или компоненты операционной системы), своей возможно модифи╨ ┌цированной копии,сохраняющей способность к дальнейшему размножению [1]─. Идея создания компьютерных вирусов довольно давно "витала в возду╨ хе". В 1959 один американский научный журнал публикует статью L.S. Penrose о самовоспроизводящихся механизмах. Затем эта идея переносится на компьютеры - исследователи создают программы-"организмы", способные "питаться" себе подобными и оставлять потомство. Но пока создание само╨ воспроизводящихся программ не выходит за рамки исследований. Ограничен╨ ные ресурсы и небольшая мощность ЭВМ не располагают к написанию виру╨ сов. К тому же компьютеры еще недостаточно распространены. Наступает 1987 год, - и вирус поражает компьютеры в Лехайском уни╨ верситете. Это первое зарегестрированное массовое заражение, первая эпидемия,- но, к несчастью, не последняя. В одно мгновение погибли годы работы студентов, десятки курсовых работ. С того времени много эпидемий и даже пандемий пронеслось по миру, унося миллионы часов напрасно зат╨ раченного машинного времени, нанося зачастую непоправимый материальный и интеллектуальный ущерб людям и обществу. До недавнего времени (1989) считалось, что на небольших учебных ком╨ пьютерах вирусы создавать невозможно. Поэтому большинство пользователей ПЭВМ "YAMAHA" всерьез не воспринимали информацию о вирусах. Но радость была преждевременной - после создания в Новосибирске первого вируса для "Ямахи" стали появляться новые, злые и разные. Авторам известно 5 виру╨ сов - и это отнюдь не все ! Советские вирусологи (самые знаменитые - Безруков, Лозинский, Котик) при разработке антивирусных программ-мониторов как-то классифицируют все известные им вирусы. Мы отдаем предпочтение классификации Н.Н.Без╨ рукого (Киев), как самой простой и эффективной [2]. В этом разделе мы приводим статью Земцова и Налимова, в которой они описывают вирус собственного приготовления. В Приложении VII - VIII Вы сможете найти наряду с текстом этого вируса еще и дизассемблированные одним из авторов вирусы BR-256-1 и BR-256-2 (имена по классификации Безрукого). ┬Как мы делали компьютерный вирус ┌Данный раздел написан П.А.Земцовым и Е.В.Налимовым ┌(ВЦ СО АН СССР, г.Новосибирск) В последнее время страницы массовых изданий пестрят сообщениями о разного рода компьютерных вирусах, передающихся от компьютера к компью╨ теру и вызывающих тот или иной вредный эффект ("затирание" дисков, пор╨ чу информации в базах данных или же просто замедление скорости работы компьютера). Вирусы весьма изощренны как по производимому эффекту, так и по способам распространения; обычно вирус ┬ это большая и сложная программа. Но большая программа требует большого и мощного компьютера. И если для пользователей IBM PC вирусы давно уже стали привычным явле╨ нием, то на более "скромных" ЭВМ ( в частности, на советских школьных ЭВМ) они еще, к счастью, не зафиксированы, что и породило мнение о том, что они там вообще невозможны. ┌Целью─ настоящего исследования было опровержение таких воззрений пу╨ тем разработки вируса для одной из таких машин. Был выбран компьютер "┌Ямаха─", который весьма похож на модели советских школьных ЭВМ по пара╨ метрам ( 64 Кбайта памяти и 8-битный микропроцессор Zilog-80 ). До сих пор на этих компьютерах вирусы не зафиксированы. Итак, мы решили создать такой вирус. Забегая вперед, скажем, что по╨ пытка оказалась успешной ! Создав вирус, мы посчитали своим долгом рас╨ сказать об этом широким кругам пользователей. Ниже будет описан разра╨ ботанный нами вирус, приведен его исходный текст и текст программы борьбы с ним. Мы отдаем себе отчет в том, что некий злоумышленник может, используя эти материалы, запустить свой вирус, эффект которого состоит, например, в форматировании диска, чем может нанести существенный вред. Однако, злоумышленник ведь может и сам написать аналогичный вирус, и тогда мас╨ сы пользователей будут полностью ┌беззащитны─. Предотвратить это можно лишь одним способом - придав гласности наши материалы. Конечно, зло╨ умышленник может избрать и иной способ распространения вируса, но хоро╨ шо уже то, что наш способ (самый простой) будет для него закрыт. Наш вирус будет поздравлять с днем рождения девушку по имени Наташа. Именно, до наступления определенной даты (дня рождения Наташи) вирус лишь распространяется с диска на диск. А в этот праздничный для Наташи день вирус выдает на экране дисплея сообщение: "Наташа, с днем рожде╨ ния!". После этого компьютер зависает в мертвом цикле. Мы надеялись, что при распространении вирус будет записан и на ее диск, и тем самым в ее день рождения ей будет доставлена "радость". Наш вирус работает с операционной системой MSX-DOS на компьютерах MSX и MSX-2. Работающие на языке MSX-BASIC и в системе CP/M могут не опасаться данного вируса. Перейдем к его описанию. Процедура загрузки операционной системы MSX-DOS происходит следующим образом. Выделив необходимые буфера, программа, находящаяся в ПЗУ дис╨ ковода, загружает 0-й сектор диска по адресу 0C000h; в случае неудачи (например, при выключенном дисководе или затертом нулевом секторе) про╨ исходит переход в MSX-BASIC. В противном случае происходит переход по адресу C01Fh. Там обычно находится программа, которая загружает с диска файл MSXDOS.SYS и передает на него управление. MSX-DOS перемещает сам себя в "конец" свободной памяти и начинает работу. "Конец" свободной памяти (точнее, начало занятой) определяется из системного слова HIMEM (F34Bh), которое может, вообще говоря, содер╨ жать разные значения, в зависимости от условий (числа интерфейсов, на╨ жатия клавиши "CTRL" в момент включения компьютера и т.д.). Таким обра╨ зом, MSX-DOS рассчитан на произвольный верхний адрес памяти и, следова╨ тельно, "не заметит", если еще до его загрузки какая-нибудь программа "захватит себе некоторый участок памяти в "верхних" адресах. "Не заме╨ тят" этого и работающие "под MSX-DOS" программы. Программа загрузки MSX-DOS занимает немного места: \/T0/1 ─┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│ ┴ На нулевом секторе остается еще около 130h байт. ┴ ┴ Поэтому вирус был размещен во второй половине 0-го сектора ┴ ┴ (в байтах 100h ╤ 1FFh). ┴ ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐ \/T1/1- Мы решили не использовать остающиеся 30h байт в первой половине сек╨ тора, поскольку многие системы редактирования дисков (например, Disk Fixer) показывают за один раз лишь половину сектора, и мало кто смотрит вторую половину нулевого сектора (вирус должен быть незаметным!). Основной проблемой разработки была экономия памяти. В отличие от ви╨ русов на IBM PC (больших и сложных программ), наш должен быть маленькой сложной программой, точнее, он должен помещаться в 256 байт. Уже на од╨ но сообщение и программу его выдачи уходит более 50 байт. Места нам очень сильно не хватало, пришлось применять различные виды оптимизации. Разумеется, это снизило наглядность и читаемость программ, но эти ка╨ чества и не являются определяющими, когда речь идет о вирусе. Итак, мы нашли место на дискете, где держать вирус, и место в опера╨ тивной памяти, где должна разместиться его копия (очевидно, что если мы собираемся "заражать" вирусом другие дискеты, мы должны хранить в памя╨ ти весь вирус, даже те его части, которые уже отработали и после этого непосредственно не нужны). Осталось лишь найти способ подключения вируса к стандартной операци╨ онной системе MSX-DOS. MSX-DOS находится в ПЗУ дисковода (16 Кбайт в адресах 4000h ╤ 8000h на подключаемом слоте). Находящийся в ОЗУ DOS - это всего лишь вызовы ПЗУ. Подключаться туда нам было бы довольно труд╨ но (но не невозможно; просто пришлось бы в те же 256 байт размещать бо╨ лее сложную программу), если бы разработчики MSX-DOS (J.Suzuki и Т.Pat╨ terson) не использовали так называемые ┌ловушки. ┌Ловушка─ (англ. "hook"-"крючок") - это место в оперативной памяти, в старших ее адресах, в котором размещается обычно команда RET(байт C9h). В программе из ПЗУ стоит команда CALL по этому адресу. Обычно эта пара команд (CALL,RET) ничего не делает, но зато пользователю дается возмож╨ ность вместо команды RET записать команду JP (безусловный переход) на какую-нибудь ┌свою собственную─ подпрограмму. Вызовы ловушек расставлены в MSX-DOS во всех важных местах (открытии и закрытии файлов, записи каталога и т.д.). Остается лишь выбрать по╨ лезный для нас. \/T0/1 ─┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│ ┴ Мы выбрали ловушку F26Dh, которая вызывается при записи на дискету ┴ ┴ Таблицы Размещения Файлов (FAT), например,при записи файла или его ┴ ┴ уничтожении. ┴ ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐ \/T1/1- В этот момент происходит "оживленный обмен" с диском, поэтому факт мо╨ дификации 0-го сектора не будет заметен, тем более, что 0-й сектор на╨ ходится на той же дорожке диска, что и FAT, из-за чего не будет переме╨ щаться головка дисковода. Кроме того, в этот момент происходит не прос╨ то обмен, а именно запись на диск, что снимает задачу проверки закрытия диска на запись. Если бы мы использовали ловушку чтения с диска, могла возникнуть ситуация, когда пользователь "читает" файл с диска и вдруг получает сообщение Write protect ("Диск закрыт на запись"), а это уже весьма подозрительно! Что же делает та подпрограмма, которая подставляется нами в эту ло╨ вушку? Она считывает с диска 0-й сектор и проверяет, нет ли там уже ви╨ руса. Если диск уже "заражен", то на этом ее работа завершается. В про╨ тивном случае вирус переписывается во вторую половину сектора, а в пер╨ выю половину записываются команды вызова второй половины. После этого модифицированный 0-й сектор записывается обратно. Итак, распространение вируса происходит следующим образом. Ничего не подозревающий владелец зараженного диска загрузил с него MSX-DOS и ра╨ ботает, как обычно. Потом он записал что-нибудь на другой диск (напри╨ мер, скопировал файл с одного диска на другой), и этот другой диск так╨ же заражен! Мы уверены, что это приведет к быстрому распространению ви╨ руса. Но вирус этот не будет страшен, пока не наступит назначенный день. В начале инициализирующей части вируса (работающей при загрузке сис╨ темы) стоит проверка даты. Если дата равна заданной, происходит выдача сообщения и останов компьютера. Это прекрасно работает на компьютерах MSX-2, где имеются встроенные часы с календарем на батарейках. Включа╨ ешь компьютер - и на экране сообщение. На компьютерах MSX такого эффек╨ та не будет, поскольку там часов нет, и нам приходится рассчитывать на сознательность и аккуратность пользователей, устанавливающих дату при входе в систему. Но поскольку это происходит уже после того, как отра╨ ботает инициализирующая часть вируса, необходимо вставить проверку даты также и в подпрограмму-ловушку. При попытке записать какой-нибудь файл в заданный день произойдет то же самое - выдача сообщения. Несколько слов о технических трудностях, с которыми мы столкнулись, и о которых хотим предупредить разработчиков вирусов. 1. ┌Куда считывать 0-й сектор? Проще всего выделить себе при загрузке не 256 байтов, а еще 512 для буфера сектора, но это слишком грубое решение. У MSX-DOS есть свой про╨ межуточный буфер, в котором постоянно ничего не хранится. Адрес этого буфера записан в слове F34Dh, его объем 512 байт. 2. При выходе в BASIC происходит "затирание" тела нашей ловушки ин╨ терпретатором MSX-BASIC. Дело в том, что BASIC "не признает" факт зах╨ вата памяти через ячейку HIMEM. Нужно либо заполнять специальные ячейки BASIC, либо отключать ловушку при входе в BASIC. Первое решение было бы лучше для более быстрого распространения вируса, но, надо признаться, мы не знатоки BASIC и попросту не знали, какие ячейки надо устанавли╨ вать. Отключить ловушку было проще - надо просто установить еще одну ловушку на переход в BASIC, который отключит их обе. Трудность заключа╨ ется в том, что в DOS не предусмотрена ловушка на переход в BASIC. Но в BASIC есть и свои ловушки, и вся задача - найти ту из них, которая всегда вызывается при переходе в BASIC. Такая ловушка была найдена - ее адрес FDC7h, она вызывается каждый раз при вызове подпрограммы INITPAT, устанавливающей шаблоны символов экрана. Ее мы и используем. 3. Но та же подпрограмма INITPAT может вызываться и во время работы DOS. Можно, конечно, отключать наши ловушки и там, но это неинтересно, поскольку желательно, чтобы вирус был подключен в течение максимально возможного времени. Лучше проверять, где мы находимся - в MSX-DOS или в BASIC, и отключаться, только в том случае, если мы находимся в BASIC. Для этого нужен признак текущего режима. Для него вполне подошла ячейка SETROM (F368h), которая всегда в MSX-DOS содержит константу C3h, a в MSX-BASIC константу C9h. 4. Где разместить тело ловушки, устанавливаемой на FDC7h? Выделенное с помощью HIMEM место, где она и так находится, не подходит, так как затирается интерпретатором MSX-BASIC. А почти для всякого свободного места в памяти найдется какая-нибудь программа, которая его использует (ведь программ для компьютера "Ямаха" написано много, и писавшие их лю╨ ди хорошо знали структуру компьютера). То же касается используемых ло╨ вушек - ведь надо, чтобы их никто не устанавливал сам. Мы решили счи╨ тать, что ловушки F26Dh и FDC7h удовлетворяют этому условию. А для размешения тела ловушки FDC7h было выбрано место, которое, в силу его нестандартности, никто не использует. Это область ловушек BA╨ SIC. Каждая ловушка BASIC занимает 5 байт (место, достаточное для того, чтобы разместить межслотный вызов), и обычно эти ловушки пусты (первый байт ловушки константа C9h, т.е. команда RET; на самом деле вся эта об╨ ласть заполнена константами C9h, но это для нас неважно). Если извес╨ тно,что никто не устанавливает какую-то ловушку, то программу в 4 байта в этом месте можно разместить. Но программа отключения наших ловушек существенно больше. Чтобы решить эту проблему, следует написать прог╨ рамму так, чтобы каждый ее 5-й байт был равен C9h, что и было сделано. Программа имеет длину 19 байт и размещается нами с адреса FF12h. Мы на╨ деемся, что никто не устанавливает затираемые ей ловушки. 5. Как считать сектор с диска и записать назад? Поскольку в этот момент подключено ПЗУ дисковода, можно вызвать под╨ программу оттуда - вопрос, какую. Проще всего вызвать подпрограмму DSKIO (4010h), но эта подпрограмма неправильно обрабатывается некоторы╨ ми драйверами RAM-дисков, а они уже широко распространились. Поэтому используются подпрограммы DSKRD (46BAh) и DSKWR (4720h). 6. Требуется определить дату, независимо от того, работаем ли мы на MSX или на MSX-2. Для этого в ПЗУ есть подпрограмма DATEIN (553Ch), ко╨ торую мы и используем. 7. Очень серьезная трудность связана с тем, что по адресу C000h при запуске компьютера попадает лишь половина 0-го сектора. Однако вторая половина тоже находится в памяти - весь сектор сначала считывается в память, а потом его первая половина копируется в C000h. Узнать, где на╨ ходится считанный сектор, можно из слова BEGIN (F351h). Соответствен╨ но,инициализатор вируса находится по адресу (BEGIN)+100h. 8. И инициализатор, и тело ловушки находятся на непостоянном месте, и должны быть полностью перемещаемыми. Такая перемещаемость была нами достигнута, хотя и не без труда. 9. Организация получения управления и возврата при загрузке DOS. Для организации получения управления вирусом в самое начало программы, за╨ писанной на 0-м секторе, а конкретно в байты 1Fh╤25h этого сектора за╨ писываются следующие 6 байт: E5h, 2Ah, 51h, F3h, 24h, E9h, или в виде команд Z-80: C01F: E5 PUSH HL C020: 2A F3 51 LD HL,(Begin) C023: 24 INC H C024: E9 JP (HL) Этими шестью байтами, разумеется, затирается то, что там стояло ра╨ нее, а именно, байты: EDh, 53h, 59h, C0h, 32h, D0h, или в командах мик╨ ропроцессора Z-80: C01F: ED 53 59 C0 LD (C059h),DE C023: 32 D0 C0 LD (C0D0h),A Поэтому в специальном месте в теле вируса хранятся эти старые 6 байт, и при возврате из вируса они переписываются по адресам C01F ╤ C025, после чего управление передается по адресу C01F. Ниже (см. Приложение V) приводится ┌исходный текст─ вируса на языке ассемблера Z-80, снабженный комментариями. Из текста удалено только од╨ но место: заменены звездочками день и месяц срабатывания вируса, для обеспечения инкогнито поздравляемого нами человека. Объем программы равен 256 байт. Она работает описанным образом на всех компьютерах MSX и MSX2 (как сетевых, так и центральных), в любой конфигурации дисководов, в том числе и RAM-диском. ┌Как же бороться с такого рода вирусами?─ Проще всего ┬ путем проверки 0-го сектора и ловушки F26Dh. Если память нормальна, в F26Dh записано число C9h, если заражена - число C3h. Конечно, следует изредка смотреть и содержимое других лову╨ шек, ведь это не единственное место, куда можно "посадить" вирус! Если нулевой сектор нормален, в нем байты с 1F по 25 равны EDh, 53h, 59h, C0h, 32h, D0h (в стандартном MSX-DOS; в других версиях они могут быть другими), если же "заражен" - E5h, 2Ah, 51h, F3h, 24h, E9h. Кроме того, вторая половина стандартного 0-го сектора заполнена ну╨ лями, в отличие от второй половины "зараженного" сектора. Ниже (см. Приложение VI) приводится текст программы, проверяющей, подключен ли вирус, а также есть ли он на диске, и способной также обезвредить вирус. Относительно этой программы сделаем несколько замечаний. Это ни в коем случае не есть ┌универсальная─ антивирусная программа - это всего лишь нейтрализатор нашего конкретного вируса. Достаточно лишь использо╨ вать другую ловушку или использовать первую команду перехода к вирусу не PUSH HL, чтобы вирус остался незамеченным для этой программы. Кроме того, должным образом нейтрализовать вирус на диске она сможет, лишь если вирус именно наш - ведь для определения тех байтов, что должны быть записаны с 1Fh по 25h, надо использовать сам вирус. Писать приве╨ денные выше 6 байтов нельзя из-за наличия операционных систем с нестан╨ дартным 0-м сектором (например, Nike-DOS). Так что приводимая программа является лишь скелетом настоящей антивирусной программы. Итак, чисто технически задача разрешима. Разумен вопрос: зачем же теперь, раскрыв все, запускать вирус? Во-первых, это само по себе уже интересный эксперимент. Во-вторых, мы нигде не написали, что запустили его. Мы его разработали. А запустим мы его или нет - пусть это останется нашей маленькой тайной. \/T0/1 ─┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│ ┴ И наконец, несколько общих советов для желающих уберечься от ┴ ┴ вирусов: ┴ ┴ 1. Загружайте систему со своего диска. ┴ ┴ 2. Перед началом работы выключите компьютер, а не нажимайте ┴ ┴ кнопку "RESET". ┴ ┴ 3. Будьте внимательны, когда используете чужие COM-файлы. ┴ ┴ Например, запуская незнакомый COM-файл, защитите диск. ┴ ┴ 4. И последний совет: соблюдайте меры предосторожности и ┴ ┴ имейте постоянных партнеров. Случайные связи опасны ! ┴ ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐ \/T1/1-