Инструменты пользователя

Инструменты сайта


msx:floppy_disk_filesystem_structure:030

Первая страницаПредыдущая страницаНазад к обзоруСледующая страницаПоследняя страница

III. Компьютерные вирусы


Нам разрешается прослыть невеждами, мистиками, суеверными дураками. Нам одного не простят: если мы недооценим опасность.

А. и Б. Стругацкие. Жук в муравейнике)

Когда в разговорах заходит речь о вирусах, реакция собеседников бывает весьма разнообразной: от хихикания и собирательства анкдотов до суеверного страха и комплекса вирусомании. Немногие знают о том, что уже существует наука вирусология. Вирусы — это опасность, а опасность нужно изучать, классифицировать и разрабатывать методы защиты от нее и борьбы с нею. Проявление эмоций становится неуместным.

Мир вырос за последние годы. Отошли в прошлое времена, когда пользователи смотрели на вирус, как на новое чудо. Вирусы поражают компьютеры сотнями тысяч и миллионами. В тот самый момент, когда Вы читаете эти строки, примерно 50 тысяч пользователей на Земле борются с поселившимся у них вирусом.

За рубежом масштабы «эпидемий» достаточно велики. Многие вычислительные сети уже пострадали от вирусов. Наибольший вред приносят программы–разрушители, уничтожающие базы данных различных коммерческих фирм. Проникнув в вычислительную сеть фирмы, вирус может поставить организацию на грань разорения. Обычно ущерб тщательно скрывается фирмой, чтобы не прослыть неблагонадежной. Из числа зарегистрированных наибольшие потери понесла фирма «Фольксваген» — 1 млрд. долл.!

Вредоносные программы (собственно вирусы, «троянские кони» и защищенные от копирования программы) весьма разнообразны по производимому эффекту: это и «рождественские елки», и «веселые проказники», и страшные «убийцы» дисков, и даже разрушители винчестеров.

Компьютерным вирусом будем называть программу, обладающую способностью к скрытому саморазмножению в среде стандартной операционной системы ЭВМ путем включения в прямо или косвенно исполняемый код (загружаемые программы или компоненты операционной системы), своей возможно модифицированной копии,сохраняющей способность к дальнейшему размножению [1].

Идея создания компьютерных вирусов довольно давно «витала в воздухе». В 1959 один американский научный журнал публикует статью L.S. Penrose о самовоспроизводящихся механизмах. Затем эта идея переносится на компьютеры — исследователи создают программы–«организмы», способные «питаться» себе подобными и оставлять потомство. Но пока создание самовоспроизводящихся программ не выходит за рамки исследований. Ограниченные ресурсы и небольшая мощность ЭВМ не располагают к написанию вирусов. К тому же компьютеры еще недостаточно распространены.

Наступает 1987 год, — и вирус поражает компьютеры в Лехайском университете. Это первое зарегистрированное массовое заражение, первая эпидемия,— но, к несчастью, не последняя. В одно мгновение погибли годы работы студентов, десятки курсовых работ. С того времени много эпидемий и даже пандемий пронеслось по миру, унося миллионы часов напрасно затраченного машинного времени, нанося зачастую непоправимый материальный и интеллектуальный ущерб людям и обществу.

До недавнего времени (1989) считалось, что на небольших учебных компьютерах вирусы создавать невозможно. Поэтому большинство пользователей ПЭВМ «YAMAHA» всерьез не воспринимали информацию о вирусах. Но радость была преждевременной — после создания в Новосибирске первого вируса для «Ямахи» стали появляться новые, злые и разные. Авторам известно 5 вирусов — и это отнюдь не все !

Советские вирусологи (самые знаменитые — Безруков, Лозинский, Котик) при разработке антивирусных программ–мониторов как–то классифицируют все известные им вирусы. Мы отдаем предпочтение классификации Н.Н.Безрукого (Киев), как самой простой и эффективной [2].

В этом разделе мы приводим статью Земцова и Налимова, в которой они описывают вирус собственного приготовления. В Приложении VII–VIII Вы сможете найти наряду с текстом этого вируса еще и дизассемблированные одним из авторов вирусы BR-256-1 и BR-256-2 (имена по классификации Безрукого).

III.1. Как мы делали компьютерный вирус

Данный раздел написан П.А.Земцовым и Е.В.Налимовым (ВЦ СО АН СССР, г.Новосибирск)

В последнее время страницы массовых изданий пестрят сообщениями о разного рода компьютерных вирусах, передающихся от компьютера к компьютеру и вызывающих тот или иной вредный эффект («затирание» дисков, порчу информации в базах данных или же просто замедление скорости работы компьютера). Вирусы весьма изощренны как по производимому эффекту, так и по способам распространения; обычно вирус — это большая и сложная программа. Но большая программа требует большого и мощного компьютера. И если для пользователей 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 занимает немного места:

На нулевом секторе остается еще около 130h байт.
Поэтому вирус был размещен во второй половине 0–го сектора (в байтах 100h–1FFh).

Мы решили не использовать остающиеся 30h байт в первой половине сектора, поскольку многие системы редактирования дисков (например, Disk Fixer) показывают за один раз лишь половину сектора, и мало кто смотрит вторую половину нулевого сектора (вирус должен быть незаметным!).

Основной проблемой разработки была экономия памяти. В отличие от вирусов на IBM PC (больших и сложных программ), наш должен быть маленькой сложной программой, точнее, он должен помещаться в 256 байт. Уже на одно сообщение и программу его выдачи уходит более 50 байт. Места нам очень сильно не хватало, пришлось применять различные виды оптимизации. Разумеется, это снизило наглядность и читаемость программ, но эти качества и не являются определяющими, когда речь идет о вирусе.

Итак, мы нашли место на дискете, где держать вирус, и место в оперативной памяти, где должна разместиться его копия (очевидно, что если мы собираемся «заражать» вирусом другие дискеты, мы должны хранить в памяти весь вирус, даже те его части, которые уже отработали и после этого непосредственно не нужны).

Осталось лишь найти способ подключения вируса к стандартной операционной системе MSX-DOS. MSX-DOS находится в ПЗУ дисковода (16 Кбайт в адресах 4000h ÷ 8000h на подключаемом слоте). Находящийся в ОЗУ DOS — это всего лишь вызовы ПЗУ. Подключаться туда нам было бы довольно трудно (но не невозможно; просто пришлось бы в те же 256 байт размещать более сложную программу), если бы разработчики MSX-DOS (J.Suzuki и Т.Patterson) не использовали так называемые ловушки.

Ловушка (англ. «hook» — «крючок») — это место в оперативной памяти, в старших ее адресах, в котором размещается обычно команда RET(байт C9h). В программе из ПЗУ стоит команда CALL по этому адресу. Обычно эта пара команд (CALL, RET) ничего не делает, но зато пользователю дается возможность вместо команды RET записать команду JP (безусловный переход) на какую–нибудь свою собственную подпрограмму.

Вызовы ловушек расставлены в MSX-DOS во всех важных местах (открытии и закрытии файлов, записи каталога и т.д.). Остается лишь выбрать полезный для нас.

Мы выбрали ловушку F26Dh, которая вызывается при записи на дискету Таблицы Размещения Файлов (FAT), например,при записи файла или его уничтожении.

В этот момент происходит «оживленный обмен» с диском, поэтому факт модификации 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 было выбрано место, которое, в силу его нестандартности, никто не использует. Это область ловушек BASIC. Каждая ловушка 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). Так что приводимая программа является лишь скелетом настоящей антивирусной программы.

Итак, чисто технически задача разрешима. Разумен вопрос: зачем же теперь, раскрыв все, запускать вирус?

Во–первых, это само по себе уже интересный эксперимент. Во–вторых, мы нигде не написали, что запустили его. Мы его разработали. А запустим мы его или нет — пусть это останется нашей маленькой тайной.

И наконец, несколько общих советов для желающих уберечься от вирусов:

  1. Загружайте систему со своего диска.
  2. Перед началом работы выключите компьютер, а не нажимайте кнопку RESET.
  3. Будьте внимательны, когда используете чужие COM–файлы. Например, запуская незнакомый COM–файл, защитите диск.
  4. И последний совет: соблюдайте меры предосторожности и имейте постоянных партнеров. Случайные связи опасны !

Первая страницаПредыдущая страницаНазад к обзоруСледующая страницаПоследняя страница

msx/floppy_disk_filesystem_structure/030.txt · Последние изменения: 2022-09-15 20:55 — GreyWolf