                                                 'Доктор'  Е. Касперский
                                                 ═══════════════════════

           Компьютерные вирусы - предварительные соображения
           ═════════════════════════════════════════════════

        По поводу термина
        ─────────────────

        Первые исследования саморазмножающихся искусственных конструкций
проводились  в  середине  нынешнего  столетия  -  в работах фон Неймана,
Винера и др. дано определение и проведен математический анализ  конечных
автоматов,  в  том  числе  и самовоспроизводящихся. Термин "компьютерный
вирус"  появился  позднее  -  официально  считается,  что  его   впервые
употребил сотрудник Лехайского университета (США) Фред Коэн в 1984  году
на на 7-й конференции по  безопасности информации, проходившей в США.  С
тех пор  прошло немало  времени, острота  проблемы вирусов  нисколько не
снизилась, однако строгого определения, что же такое компьютерный вирус,
так  и  не  дано,  несмотря  на  то,  что попытки дать такое определение
предпринимались неоднократно.  Поэтому я  наберусь смелости  и попытаюсь
сформулировать собственное определение:

        Компьютерным  вирусом   называется  программа,   которая   может
cоздавать свои копии (не обязательно полностью совпадающие с оригиналом)
и внедрять их в файлы, системные области компьютера, вычислительные сети
и  т.д.  При  этом   копия  должна  сохранять  способность   дальнейшего
распространения.

        По поводу самих вирусов и их авторов
        ────────────────────────────────────

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

        Так кто же пишет вирусы?  На мой взгляд, основную массу  вирусов
создают  люди,  которые  только  что  изучили  язык  ассемблера,   хотят
попробовать  свои  силы,  но  не  могут  найти  для них более достойного
применения. Из под пера подобных умельцев часто выходят либо модификации
"классических"  вирусов,  либо  вирусы  крайне  примитивные  и с большим
числом ошибок (такие вирусы я называю "студенческими").

        Гораздо  меньшая  часть  вирусов  -  "экспериментальные" вирусы,
которые создаются не для того, чтобы пошутить или напакостить владельцам
компьютеров, а в чисто  исследовательских целях. Примером таких  вирусов
являются  вирусы  семейства  "Tiny"  -  попробуйте  написать резидентный
вирус, который короче, чем 133 байта (длина самого маленького вируса  из
семейства - "Tiny-133").

        Самую  опасную  группу  вирусов  составляют   "профессиональные"
вирусы.  Эти  очень  тсчательно   продуманные  и  отлаженные   программы
создаются профессиональными,  часто очень  талантливыми, программистами.
"Профессиональные"  вирусы  часто  используют  достаточно   оригинальные
алгоритмы,   недокументированные   и   мало   кому   известные   способы
проникновения  в  системные  области  данных,  часто  "профессиональные"
вирусы  выполнены  по  технологии  "стелс".  Для  меня остаются загадкой
причины,  которые  могут  заставить  человека  направить  свои   немалые
способности на такую бессмысленную работу.  Не исключено, что  некоторые
из  таких  людей  -  неудачники,  не  сумевшие с пользой воспользоваться
своими знаниями.

        Умрет ли MS-DOS от вирусной болезни?
        ────────────────────────────────────

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

        В нашей же стране  все обстоит гораздо более  серьезно. Основным
источником приобретения  новых программных  продуктов у  нас является их
бесконтрольное   копирование;   очень   часто   персональные  компьютеры
используются  в  "многоперсональном"  режиме.  Для  вируса  -  это самая
благодатная  среда   для  распространения.   В  результате   в   учебных
институтах, в организациях (иногда достаточно серьезных) факт  заражения
вирусом   вполне   обычное   явление,   что-то   вроде  насморка.  Такое
"привыкание" может кончиться  плачевно при заражении  каким-либо опасным
вирусом. Хотя если на компьютере  кроме DOS и большого числа  игр ничего
нет, то  вируса можно  не бояться  - невелика  потеря (кстати,  ситуация
очень распространенная).

        Следует  отметить  быстрый   рост  числа  компьютерных   вирусов
советского производства  (по моим  данным общее  число на  1989г - 1, на
1990г август - 3 или 4, сентябрь - около 6, октябрь - около 15, ноябрь -
около  20).   Это  вполне  естественно  -  когда зарплату платят лишь за
присутствие на  работе и  есть возможность  заниматься на  PC чем угодно
(попробуйте возразить,  что, мол,  это очень  редкая ситуация),  а ничем
полезным или прибыльным заниматься не хочется, то от нечего делать можно
попробовать  запрограммировать  вирус  (тем  более,  что  это  пока   не
преследуется уголовно).



		 1. Классификация компьютерных вирусов
		 ═════════════════════════════════════

	Вирусы  можно  разделить  на  классы  по следующим признакам: по
среде  обитания  вируса,  по  способу  заражения  среды  обитания  и  по
деструктивным возможностям.

	По cреде обитания вирусы можно разделить на сетевые, файловые  и
загрузочные.   Сетевые  вирусы  распространяются  по  компьютерной сети,
файловые внедряются  в выполняемые  файлы, загрузочные  - в  загрузочный
сектор диска (BOOT-сектор) или в сектор, содержащий системный  загрузчик
винчестера  (Master  Boot  Record).  Существуют  сочетания  -  например,
файлово-загрузочные  вирусы,  заражающие  и  файлы и загрузочные сектора
дисков.

	Способы  заражения  делятся  на  резидентный  и   нерезидентный.
Резидентный вируc при  инфицировании компьютера оставляет  в оперативной
памяти  свою  резидентную  часть,  которая затем перехватывает обращение
операционной  системы  к   объектам  заражения  и   внедряется  в   них.
Резидентные вирусы  находятся в  памяти и  являются активными  вплоть до
выключения или перезагрузки компьютера. Нерезидентные вирусы не заражают
память  компьютера  и  являются  активными ограниченное время. Некоторые
вирусы оставляют в  оперативной памяти небольшие  резидентные программы,
которые не распространяют вирус. Такие вирусы считаются нерезидентными.

	По деструктивным возможностям вирусы можно разделить на:

	а) безвредные,  т.е.  никак  не   влияющие  на работу компьютера
	   (кроме  уменьшения  свободной  памяти  на  диске в результате
	   cвоего распространения);

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

        в) опасные вирусы,  которые могут привести  к серьезным сбоям  в
	   работе компьютера;

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


      2. Способы распространения и cтруктура компьютерных вирусов
      ═══════════════════════════════════════════════════════════

	Ниже  приводятся  примеры  структур  и  способов распространения
файловых и загрузочных вирусов.

			 2.1. Файловые вирусы
                         ════════════════════

        Вирус  может  внедриться  в  файлы  трех типов - командные файлы
(BAT), загружаемые драйверы  (SYS) и выполняемые  двоичные файлы (EXE  и
COM).

        Мне известны 2 BAT-вируса. Они не представляют интереса, так как
достаточно примитивны, очень просто обнаруживаются и удаляются.

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

        Незараженный            Зараженный
        файл драйвера           файл драйвера

        ┌─────────┐             ┌─────────┐
        │Заголовок│             │Заголовок│
        ├─────────┤             ├─────────┤
        │ Драйвер │     ──>     │ Драйвер │
        │         │             │         │
        │         │             │         │
        └─────────┘             ├─────────┤
                                │Заголовок│
                                ├─────────┤
                                │ Вирус   │
                                │         │
                                └─────────┘

        Аналогично вирус может записать свои коды в начало драйвера, а
если в файле содержится несколько драйверов, то и в середину файла.


	Выполняемые  двоичные   файлы  имеют   форматы  COM   или   EXE,
отличающиеся  заголовком  и  способом  запуска  программ  на выполнение.
Расширение  имени  файла  (".COM"  или  ".EXE")  не всегда соответствует
действительному формату файла,  что, правда, никак  не влияет на  работу
программы. Файлы  COM и  EXE заражаются  по-разному, следовательно вирус
должен отличать файлы одного формата  от файлов другого.  Вирусы  решают
эту задачу  двумя способами:   одни анализируют  расширение имени  файла
(".COM" или  ".EXE"), другие  - заголовок  файла.   Первый способ  далее
будет  называться  заражением  .COM-   (или  .EXE-)  файлов,  второй   -
заражением  COM-  (или  EXE-)   файлов.  В  большинстве  случаев   вирус
инфицирует  файл  корректно,  т.е.   по  информации, содержащейся в теле
вируса, можно полностью восстановить зараженный файл.

	Файловые   вирусы   при   распространении   внедряются   в  тело
заражаемого файла: в его начало, конец или середину.

	┌─────────┐   ┌─────────┐       ┌─────────┐   ┌─────────┐
	│Программа│──>│Программа│       │Программа│──>│Вирус    │
	│         │   │         │       │         │   ├─────────┤
	└─────────┘   ├─────────┤       └─────────┘   │Программа│
	              │Вирус    │       	      │         │
	              └─────────┘                     └─────────┘

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

	Известны два  способа внедрения  вируса в  начало файла.  Первый
способ  заключается  в  том,  что  вирус переписывает начало заражаемого
файла  в  его  конец,  а  сам  копируется  в  освободившееся  место. При
заражении файла вторым способом вирус создает в оперативной памяти  свою
копию,  дописывает  к  ней   заражаемый  файл  и  сохраняет   полученную
конкатенацию на диск.

	Наиболее  распространенным  способом  внедрения  вируса  в  файл
является дописывание вируса в конец этого файла. При этом вирус изменяет
начало  файла   таким  образом,   что  первыми   исполняемыми  командами
программы, содержащейся  в файле,  являются команды  вируса. В COM-файле
это в большинстве случаев достигается изменением его первых трех  байтов
на коды инструкции JMP  Loc_Virus (передача управления на  тело вируса);
EXE-файл  либо  переводится  в  формат  COM-файла и затем заражается как
COM-файл, либо  модифицируется заголовок  файла.   В заголовке EXE-файла
изменяются значение  стартового адреса  (CS:IP) и  значение длины модуля
(файла), реже - регистры-указатели на стек (SS:SP) и др. Дополнительно к
этому длина EXE-файла перед заражением может увеличиваться до  значения,
кратного параграфу (16 байт).

	     COM-файл		         EXE-файл
           ┌────┬────┐                 ┌─────────┐
        ┌──│JMP │    │            ┌────│Заголовок│
        │  ├────┘    │            │    ├─────────┤
        │  │Программа│            │    │Программа│
        │  │         │            │    │         │
        │  ├─────────┤            V    │         │
        │  │Вирус    │       Стартовый ├─────────┤
        └─>│         │       адрес     │Вирус    │
           │         │       ─────────>│         │
           └─────────┘                 │         │
                                       └─────────┘

	СТАНДАРТНЫМ  СПОСОБОМ  ЗАРАЖЕНИЯ  далее  будет  называться такой
способ,  при  котором  вирус  дописывается  в  конец  файла и изменяет у
COM-файла первые 3 байта (JMP  Loc_Virus), у EXE-файла - увеличивает  до
параграфа его длину и изменяет заголовок.

	Вирус,  после  передачи  ему  управления,  совершает   следующие
действия  (приведен  список  наиболее  общих  действий  вируса  при  его
выполнении; для  конкретного вируса  cписок может  быть дополнен, пункты
могут поменяться местами и значительно расшириться) :

	а) восстанавливает  программу (но  не файл)  в исходном  виде (у
	   COM-программы   восстанавливаются   первые    3   байта,    у
	   EXE-программы вычисляется истинный стартовый адрес);
	б) если вирус резидентный, то он проверяет оперативную память на
	   наличие  своей  копии  и  инфицирует  память компьютера, если
	   копия вируса не найдена;
           если  вирус нерезидентный,  то он  ищет незараженные  файлы в
	   текущем  и   (или)  корневом   оглавлении,  в    оглавлениях,
	   отмеченных   командой   PATH   и   т.д.,   а  затем  заражает
	   обнаруженные файлы;
        в) выполняет,   если   они   есть,   дополнительные    функции :
           деструктивные действия,  графические или  звуковые эффекты  и
           т.д.;  дополнительные  функции   резидентного  вируса   могут
           вызываться  спустя  некоторое   время  после  активизации   в
           зависимости  от  текущего   времени,  конфигурации   системы,
           внутренних счетчиков вируса или других условий, в этом случае
           вирус при активизации обрабатывает состояние системных часов,
           устанавливает свои счетчики и т.д.;
        г) возвращает управление основной программе.

        Действия а)-г) далее будут упоминаться как СТАНДАРТНЫЕ.

	При  восстановлении  программы   в  первоначальном  виде   вирус
использует  информацию  о  программе,  сохраненную  в  теле  вируса  при
инфицировании файла. Это может быть длина файла, первые три байта  файла
в случае COM-файла или несколько  байтов заголовка в случае EXE-файла  и
др.

	Известны два способа проверки резидентным вирусом наличия  своей
копии в памяти компьютера.   Первый заключается в том, что  вирус вводит
новую  функцию  некоторого  прерывания,  действие  которой заключается в
возврате значения "я здесь". При  старте вирус обращается к ней  и, если
возвращенное  значение  совпадает  со  значением  "я  здесь",  то память
компьютера  уже  заражена  и  повторное  заражение  не производится. При
проверке вторым способом вирус просто сканирует память компьютера.   Оба
способа  могут  в  той  или  иной  мере  сочетаться  друг  с другом. При
инфицировании оперативной памяти  вирус ищет свободное  место в памяти и
записывает  туда  свою  копию.   Затем  вирус  переопределяет  одно  или
несколько прерываний, необходимых ему для поиска заражаемых файлов,  для
выполнения деструктивных действий или звуковых и видеоэффектов.

	При инфицировании  файла вирус  может производить  ряд действий,
маскирующих и ускоряющих его распространение. К подобным действиям можно
отнести  обработку  атрибута  read-only,  снятие  его перед заражением и
восстановление после.  Многие файловые  вирусы считывают  дату последней
модификации файла и восстанавливают  ее после заражения. Для  маскировки
своего распространения  некоторые вирусы  перехватывают прерывание  DOS,
возникающее при  обращении к  защищенному от  записи диску  (int 24h), и
самостоятельно обрабатывают его.

	DOS  предусматривает  единственный  способ  создания резидентных
модулей  (помимо  драйверов,  указываемых  в  CONFIG.SYS)  -  при помощи
функции KEEP (int  21h, ah=31 или  int 27h). Многие  файловые вирусы для
маскировки своего распространения используют другой способ:  обрабатывая
системные области, управляющие распределением памяти (MCB), выделяют для
себя свободный участок памяти,  помечают его как занятый  и переписывают
туда свою копию.

        Возможно, конечно,  внедрение вируса  в файл  не описанными выше
способами, если вирус  инфицирует какой-либо конкретный  файл (например,
один из файлов DOS).


			2.2. Загрузочные вирусы
                        ═══════════════════════

	Загрузочные   вирусы   заражают   загрузочный   (BOOT)    сектор
флоппи-диска и загрузочный сектор или Master Boot Record винчестера. При
инфицировании диска вирус переносит оригинальный BOOT-сектор (или Master
Boot  Record)  в  какой-либо  другой  сектор  диска  (например, в первый
свободный)  и  копирует  себя  в  загрузочный  сектор (или в Master Boot
Record).  Если длина вируса больше длины сектора, то в заражаемый сектор
помещается первая  часть вируса,  остальные части  размещаются в  других
секторах  (например,  в  первых  свободных).  Если  продолжение   вируса
размещается  в  первых  свободных  секторах  диска, то они, как правило,
помечаются как сбойные (точнее,  сектора образуют кластер или  кластеры,
которые и помечаются как сбойные, т.н. псевдосбойные кластеры).

						Незараженный диск
	Номер сектора:
            0     1     2      . . .
	┌─────┬─────┬─────┬───   ──┬─────┬─────┬─────┬─────┬─────┬───
        │░░░░░│     │     │        │     │     │     │     │     │
	└─────┴─────┴─────┴───   ──┴─────┴─────┴─────┴─────┴─────┴───
	   │
	   └──  BOOT-сектор  или  Master Boot Record

						Зараженный диск
	    0     1     2      . . .
        ┌─────┬─────┬─────┬───   ──┬─────┬─────┬─────┬─────┬─────┬───
        │▓▓▓▓▓│     │     │        │     │░░░░░│▓▓▓▓▓│▓▓▓▓▓│▓▓▓▓▓│
        └─────┴─────┴─────┴───   ──┴─────┴─────┴─────┴─────┴─────┴───
           │                                │     │     │ ... │
           └──  Начало вируса               │ ┌───┴─────┴─────┘
                                            │ └──  Продолжение вируса
                                            │
					    └── Сохраненный BOOT-сектор
						или Master Boot Record

	СТАНДАРТНЫМ  СПОСОБОМ  далее   будет  называться  такой   способ
РАЗМЕЩЕНИЯ загрузочного вируса на диске, при котором продолжение  вируса
размещается в последовательных секторах диска, образующих  псевдосбойные
кластеры.

	Известные  мне  загрузочные   вирусы  всегда  резидентны.    Они
внедряются в память компьютера при загрузке с инфицированного диска. При
этом системный загрузчик считывает  содержимое первого сектора диска,  с
которого производится загрузка, помещает считанную информацию в память и
передает  на  нее  (т.е.  на  вирус)  управление.  После  этого начинают
выполняться инструкции вируса, который :

	а) уменьшает обьем свободной памяти (слово по адресу 0040:0013);
	б) считывает с диска свое продолжение (если оно есть);
	в) переносит  себя в  другую область  памяти (например,  в самые
	   старшие адреса памяти);
	г) устанавливает необходимые вектора прерываний;
	д) совершает, если они есть, дополнительные действия;
	е) копирует в память оригинальный BOOT-сектор и передает на него
	   управление.

	Действия а)-е) далее будут упоминаться как СТАНДАРТНЫЕ.

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