\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-