Глава 18. Элементы теории вирусов.

- Нет, я его вычесывал.

- А отчего же блохи?

- Не могу знать. Статься может, как-нибудь из брички поналезли.

Н.В. Гоголь. Мертвые души.

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

I. Предварительные замечания.

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

Я не согласен с теми, кто считает, что в деле борьбы с вирусами все уж так безна­дежно. Компьютерные вирусы есть, и число их множится, но одновременно растет число антивирусных средств. Конечно, создатели вирусов идут несколько впереди, но не такой уж это большой разрыв. Так ли все это плохо? Представьте себе на секунду, что с земли неожиданно исчезли все болезнетворные микробы. Что в этом случае про­изошло бы с иммунной системой человека? Она атрофировалась бы. После этого че­ловечество могло бы вымереть просто от насморка - ведь же гарантий, что микро­бы, исчезнув, не появятся вновь.

По-видимому, на развитии вирусов сказались следующие факторы:

1. Резкое увеличение парка ЭВМ в основном за счет персональных компьютеров. Это создало благоприятную среду для распространения компьютерных вирусов.

2. Большое значение для распространения вирусов имеет все большее использо­вание локальных и глобальных компьютерных сетей. Компьютерная сеть пред­ставляет собой уже некое новое образование со своими свойствами и, увы, сла­быми средствами защиты.

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

4. Все более усложняющаяся программная среда, стоящая между человеком и ком­пьютером. Вероятно, на каком-то этапе развития таких сред появление (даже случайное) саморазмножающихся алгоритмов неизбежно. Рост уязвимости ком­пьютерных систем наводит на мысль, что надежность в будущем станет одним из главенствующих требований к программному обеспечению.

Что же тогда делать? Да то, что делают во всем мире: совершенствовать законы, разрабатывать новые антивирусные средства, организовывать специальные службы по компьютерным преступлениям, создавать новые операционные системы. А появление вирусов - вещь неизбежная. Компьютерная преступность, каки любая другая, имеет и социальные корни, и, намой взгляд, эти корни в значительной степени идентичны.

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

Не могу не остановиться еще на одном аспекте, связанном с компьютерными ви­русами. Нет слов, написание вируса и его распространение - акт не совсем нравствен­ный. Но как следует расценивать тот факт, что антивирусные программы сопровожда­ются утверждениями, что автором того или иного вируса является тот или иной чело­век. Это, намой взгляд, является еще более безнравственным, т.к. обвинительное зак­лючение выносит, как известно суд. На каком, спрашивается, основанииделаются столь безответственные утверждения. Оказывается, например, на основании того, что в теле вируса имеется строка с зашифрованной фамилией (или координатами) автора. Авто­ры антивирусов грешат отсутствием элементарной логики. Разве фамилию в теле ви­руса (и любой другой программы) может поставить только автор? Для того чтобы ут­верждать авторство данного вируса, нужны чисто юридические доказательства.

Конечно, операционная система MS DOS весьма предрасположена к созданию ви­русов. Этому способствуют отсутствие средств разделения доступа к ресурсам, боль­шое количество недокументированных способов (темне менее известных) обхода стан­дартных процедур. Однако я категорически не согласен с теми, кто приводит в пример другие операционные системы, аргументируя малым количеством вирусов, существую-щихдля них. Сравните количество компьютеров, работающих с операционной систе­мой MS DOS или Windows, с количеством компьютеров, работающих под управлением других операционных систем, и все станет ясно. Здесь работает закон больших чисел. Кому же взбредет в голову писать вирус, работающий в среде UNIX, если в округе этой системой никто не пользуется. Для авторов вирусов, несомненно, важен тот факт, что его детище живет и распространяется. С распространением операционной системы Windows стали множиться и вирусы, работающие в этой системе. Число их в настоящее время уже достаточно велико. В настоящее время оно уже сравнимо (с учетом вирусов, поражающих документы Word и Exel) с вирусами для MS DOS.

Мысли из предыдущего абзаца не претендуют на строгость и высказаны в плане дискуссии. Главный вопрос, по-видимому, здесь в том, могут ли вирусы затормозить

или существенно повлиять на развитие информационных технологий. Возможно, в

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

Некоторые определения.

того чтобы рассматривать свойства компьютерных вирусов, дадим предвари­тельно несколько простых определений.

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

Введем понятие активного состояния вируса.

Выполняющийся вирус будем считать активным.

Вирус, находящийся в оперативной памяти, будем считать активным, если он спо­собен получить управление при выполнении каких-либо программ.

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

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

Компьютер с активным вирусом либо зараженным жестким диском будем считать зараженным.

Сигнатура - это строка в теле вируса, по которой можно осуществлять его поиск на диске или в оперативной памяти.

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

П. Файловые вирусы в MS DOS.

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

Мы, однако.традиционно разделим вирусы, обитающие в среде MS DOS на фай­ловые и бутовые (загрузочные). В разделе IV мы поговорим о других видах.

Файловые вирусы (ФВ) могут заражать как СОМ так ЕХЕ-программы. Ниже пе­речислены стандартные способы заражения

« Часто авторы вирусов прибегают к весьма изощренным методам заражения.

1. Способы заражения СОМ-программ. На Рис. 18.1 представлены три способа заражения СОМ-программ. Легко-заметить, что заражение осуществляется так, чтобы вирус получал управление сразу после запуска программы. Как Вы по­нимаете, команда ГМР символизирует здесь просто передачу управления. Вме­сто нее с тем же успехом пользуются командами ЯЕТ или САЬЬ с соответству­ющей корректировкой стека.

 

В и рус

 

JMP

 

 

 

 

 

 

 

тело

 

Тело

 

программы

 

программь

 

 

м_

 

 

Вирус

 

JMP

 

 

Тело

 

 

 

 

Вирус

 

 

программы

 

 

Рис. 18,1. Способы заражения СОМ-программы.

В конце главы будет приведен пример "заражения" программы по типу Ь.

2. Заражение ЕХЕ-программ. Заразить ЕХЕ-программу несколько сложнее, хотя идея заражения довольно ясна. Тело вируса приписывается к какой-либо части программы, а в заголовке меняются значения регистров CS и IP (см. Главу 14). Таким образом, при запуске программы управление вначале опять передается вирусу. Наиболее изощренные вирусы корректируют еще значения SS и SP, дабы не угодить в область стека, а также проверяют программу на наличие в ней оверлеев. Наличие в программе оверлея может привести к тому что управление никогда не будет передано вирусу, и программа перестанет запускаться.

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

Появившийся некоторое время назад вирус DIR является своего рода качествен­ным развитием файловых вирусов. Данный вирус корректирует РАТтак, что при запуске любой программы управление передается ему. После того как он оказался в памяти, стандартные утилиты уже не могут обнаружить искаженную структуру FAT.

4. Активизация вирусов. Часть вирусов, которые называют не резидентными, ак­тивизируются лишь временно, во время запуска зараженной программы. Как правило, за время активизации они пытаются заразить одну или несколько про­грамм. Поиск программ для заражения может производиться в текущем катало­ге, корневом каталоге, через PATH в окружении или посредством поиска по все­му дереву каталогов (алгоритм достаточно сложен для реализации его на ассем­блере, и, кроме того, для осуществления поиска требуется время).

Вирусы, называемые резидентными, активизируются во время запуска програм­мы и остаются активными в течение всего времени работы компьютера. Некоторые вирусы остаются активными даже после перезагрузки через Ctrl Alt Del, т.к. обраба­тывают соответствующее прерывание.

Рассмотрим подробнее, как вирусы устанавливают себя в памяти. При запуске программы управление передается вирусу. В его задачу входит: а) установить себя в память; б) передать управление запущенной программе. Есть три области памяти, где может прижиться вирус. Это старшие адреса памяти, младшие адреса памяти и сис­темная область. Установка вируса посередине адресного пространства неэффективна, т.к. сразу же даст о себе знать - перестанут запускаться программы. Остаться резиден­тным в старших адресах памяти наиболее простая задача. Вирус перемещает себя в нужную область памяти, а затем корректирует текущий МСВ, уменьшая размер блока на размер захваченной области. Сложнее остаться резидентным в младших адресах памяти. Свободного блока может не быть, и придется перемещать программу. Если это ЕХЕ-программа, то не избежать корректировки адресов. Кроме того, придется пра­вильно создать свой МСВ и, следовательно, скорректировать предьцгущий. Зато вирус в младших адресах памяти не так бросается в глаза. Некоторые вирусы "прикрепля­ют" себя к телу легальной резидентной программы, что значительно затрудняет их обнаружение. Если вирус не слишком большой, то сможет найти себе место и в сис­темной области. Это может быть системный стек, системный буфер (тогда должно

быть уменьшено число системных буферов), область данных DOS и BIOS или область векторов прерываний. Отметим, что есть вирусы, которые, как ни странно, для уста­новки себя в памяти используют стандартное прерывание 27Н. Оказавшись в памяти, такой вирус еще раз запускает зараженную программу, оставляя занятым лишь блок, который он занимает. Передает управление сразу нее, а по выходу из этой програм­мы передает управление DOS через прерывание 27Н (!). Заметим также, что вирус может состоять из нескольких частей, которые могут располагаться в разных областях памяти и взаимодействовать друг с другом.

Вирус, помещая себя в память, перехватывает некоторые прерывания, чтобы кон­тролировать ситуацию и иметь возможность размножаться. Как правило, это 21-е и 13-епрерывания. Посредством этих прерываний можно контролировать обращение системы к диску и при благоприятной возможности заразить программу. Чаще всего для этой цели используется функция DOS 4BH, вызываемая каждый раз для запуска программы46. Есть, однако, вирусы, которые заражают файл даже при его открытии или чтении. Конечно, легко написать программу, которая путем отслеживания преры­ваний 13Н и 21Н фиксировала бы подозрительные действия, происходящие в системе (такие программы называют мониторами). Однако многие вирусы трассируют преры­вания, определяя значения векторов до того, их перехватили какие-то программы, или же используют недокументированные точки входа в системные процедуры. По­этому такие программы, даже запущенные до активизации вируса, не способны отсле­живать его действия. Возможно также, что вирус направит вектор в область памяти,

46 Некоторые антивирусные программы проверяют подозрительные области памяти на нали­чие команды СМР АН ,4ВН.где будет находиться небольшая процедура, которая нестандартным способом (напри­мер, через iret) передаст управление вирусу, который будет находиться в другой об­ласти пространства.

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

К файловым вирусам следует отнести и вирусы-спутники. Действие этихвирусов весьма остроумно. том, что рядом с создается

ма, с таким же именем. Понятно, что это есть в чистом сам вирус. Когда мы запускаем ЕХЕ-программу, то по правилам операционная система ищет вначале СОМ-модуль и запускает его. Активизируясь, вирус затем запускает и саму программу. Пос­ле этого запуск незараженной программы вызывает появление в том же подкаталоге ее СОМ-двойника. В более простом варианте вирус является нерезидентным, и зара­жение происходит во время запуска программы.

III. Бутовые (загрузочные) вирусы.

На столе лежит дискета У нее испорчен boot. Через дырочку в конверте

Ее вирусы грызут.

Программистский фольклор.

Стандартный механизм заражения такими вирусами таков: вместо программы заг­рузки подставляется другая программа, которая:

При запуске системы вначале загрузит в память резидентную часть вируса.

2. Перенаправит нужные векторы прерываний на эту резидентную часть.

3. Запустит программу загрузки так, чтобы процесс загрузки продолжался.

Все такие вирусы, как правило, работают с прерыванием 13Н, которое перехваты­вают при загрузке системы. Хитрость здесь в том, чтобы обманывать программы, про­сматривающие диск. При попытке просмотреть ВООТ-сектор вместо него подставля­ется истинный, без вируса.

Часто одного сектора недостаточно тела вируса, и другую свою часть он пря­чет в свободных секторах, которые можно найти в начале, либо в секторах, которые затем он помечает как сбойные. Свободные секторы найти совсем несложно. Действи­тельно, вся дорожка цилиндра 0 стороны 0 пустует, кроме первого сектора, где распо­лагается Partition Table или ВООТ-сектор (для дискеты). На дискетах бутовые вирусы прячутся также в последних секторах корневого каталога. Наконец, вирусы могут со­держать в себе свой загрузчик. Такие вирусы при записи в ВООТ-сектор затирают старый загрузчик. Некоторые вирусы (знаменитый вирус BRAIN) используют свобод­ные кластеры на диске, которые ищут по FAT-таблице, помечая их как испорченные.

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

Нижепредслявдендезассемблированныйфрате^ называемого 6-ммарта

(Рис. 18.2).Текст всего вируса не приводится из этических соображений. Вирус находится в MBS винчестера илив ВООТ-секторедискеты. Истинные же секторы хранитвдругом мес­те. BIOS считываетэтотсектор по адресу0000:7С00Ни передаеттудауправление.

ORG О

JMP BEG_VIRVIR_OFF DW    BEG_1FREE

DW    ?        сегментный адрес,   куда будет скопирован ;вирус,   одновременно это размер свободной ; памяти в параграфах с резервированием ;места для вируса

13_OFF DW    ? ;адрес обработчика прерывания 13Н

13_SEG DW ?

INT_13 PROC /обработчик прерывания 13Н

BEG_VIR:

XOR AX,AX MOV DS,AX

стека

CLI

MOV SS,AX MOV AX,7C00H MOV SP,AX STI

; 4-байтный адрес в стек для последующего

; скрытого   (RETF) перехода на истинную программу

;загрузки

PUSH DS ■ PUSH AX

/запомнить адрес обработчика прерывания 13Н

MOV   АХ, [13Н*4]

MOV 13_0FF,AX

MOV    AX, [13H*4+2]

MOV 13_SEG,AX /уменьшить объем свободной памяти на 2 килобайта

MOV    АХ, [413Н]

DEC AX

DEC AX

MOV [413H],AX

/перевести объем в параграфы

MOV CL,06

SHL AX,CL

MOV ES,AX /запомнить   сегментный адрес

MOV     FREE,АХ

/установить   собственный   обработчик   прерывания 13Н

MOV    АХ, OFFSET INT_13

MOV [13Н*4],АХ

MOV [13H*4+2],ES /подготовить копирование тела вируса в конец памяти /чтобы по адресу 0000:7СООН считать истинную программу. /загрузки

MOV   СХ,1ВЕН /размер вируса

MOV    SI,7C00H /откуда

XOR DI,DI

CLD

REPZ MOVSB

/ переход в тело вируса,  которое уже скопировано в новое место JMP    DWORD PTR CS:VIR_OFF

BEG1:

Рис. 18.2. Фрагмент вируса б марта.

На Рис. показано начало работы вируса. Далее идут также достаточно про­зрачные вещи: из укромного места считывается программа загрузки, и ей передается управление. В дальнейшем вся деятельность вируса будет связана с работой 1 ЗН-го прерывания. В частности, вирус должен будет обеспечить свое размножение - запись на гибкие и жесткие диски.

IV. Другие вирусы.

Существуют вирусы, встречающиеся гораздо реже, чем файловые или бутовые ви­русы. К таким, в частности, относятся вирусы, которые можно назвать

Они работают на уровне загружаемых драйверов устройств, внедряясь в системную

область после загрузки операционной системы либо используя для заражения файл CONFIG.SYS. Последнее довольно интересно, т.к. использование строки 'DEVICE-требует, чтобы загружаемый драйвер находился на диске в виде файла. Здесь возможны различные уловки, например, вирус вначале активизируется через программу загруз­чик, подставляет необходимую строку в CONFIG.SYS и образует соответствующий драй­вер. Далее загрузка идет своим чередом, и вирус оказывается загруженным в область драйверов. После загрузки, естественно, строка в CONFIG.SYS и драйвер в конце унич­тожаются. Другие вирусы внедряются непосредственно в драйвер устройства.тный механизм заражения драйвера таков: вирус приписывает себя к концу драйвера и модифицирует адреса программы стратегии и программы прерываний (см. главу 16) так, чтобы при вызове драйвера обращение вначале происходило к вирусу.

Определенную группу вирусов называют "червями". Эти вирусы орудуют в ком­пьютерных сетях. Переходя от компьютера к компьютеру, они могут практически не использовать дисковое пространство и работать только на уровне оперативной памя­ти. Существование таких вирусов для локальных IBM-сетей пока неизвестно.

До сих пор мы говорили о вирусах, "работающих" на уровне машинных команд. К таковым относятся и вирусы, написанные на языках высокого уровня (есть такие ви­русы, работающие в среде MS DOS). В любом случае сам механизм встраивания в прикладную или системную программу происходит на уровне команд микропроцес­сора. Однако возможен совершенно иной тип вируса (автору неизвестно о существо­вании таких вирусов на персональных компьютерах). Такие вирусы можно назвать командными. Принципиально нет ничего, что могло бы помешать их

Современные прикладные пакеты (редакторы, электронные таблицы, системы управ­ления баз данных и т.п.) часто имеют свои языки управления заданиями. Эти языки могут быть весьма мощными и гибкими, в принципе позволяющими создавать саморазмножаю­щиеся объекты. Похожая ситуация складывается и в среде операционных систем. В MS DOS существует возможность написания пакетных файлов - выполняемых программ, со­стоящих из команд операционной системы. Существенно то, что вместо команд операци­онной системы может стоять любая программа - обычный загрузочный модуль, выполня­ющийся в среде операционной системы. Таким образом мы можем до бесконечности по­полнять и совершенствовать набор стандартных команд. Не составит труда написать про­грамму, которая бы разыскивала ВАТСН-файлыи дописывала быкним несколько строк.

Наконец, принципиально возможен ещеодиНтип вирусов. Такие вирусы можно на­звать транслируемыми. Ктексту программы на языке высокого уровня дописывается не­которое количество строк. После трансляции вирус оказывается неотъемлемой частью программы. Процесс же дописывания строк к текстам программ будет продолжаться.

V. Вирусы в операционной системе Windows.

С появлением операционной системы Windows 95 поле деятельности производите­лей компьютерных вирусов в значительной степени расширилось. Здесь бы я выделил три типа вирусов, которые так или иначе связаны с новой операционной системой: 1.   Вирусы, написанные на Visual-Basic и внедряющиеся в файлы, создаются для MSWORD и MSEXEL. Эпидемия этих вирусов прокатилась некоторое время назад, в настоящее же время они стали неотъемлемой частью нашей жизни. Принцип функционирования этих вирусов весьма прост. Многие программы создают файлы, которые могут содержать   себе макрокоманды. Причем можно сделать так, что эти макрокоманды будут выполняться каждый раз перед заг­рузкой этого файла (макросАШоОреп). ;Макро-вирусвставляет свою процеду­ру так, что она выполняется перед загрузкой документа. Поэтому образом ви­рус будет каждый раз получать управление. Все техники.

Операционная система UNIX имеет весьма развитый командный язык.

2. Вирусы, в целом написанные для MS DOS, но использующие так или иначе наличие операционной системы Windows. Здесь речь может идти о самых раз­ных проявлениях. Есть вирусы, поражающие ЕХЕ-файлыв формате NE. При­чем DOS-часть этих файлов. Так что они активизируются только при запуске этих файлов в MS DOS. Есть вирусы, встраивающиеся в загрузочные файлы Windows и т.д.

3. Полноценные Windows-вирусы. Пока преобладает, скажем так, не резидентный подход. Заражается ЕХЕ-файл (формат NE или РЕ). При запуске такой програм­мы вирус активизируется на время, необходимое для поиска программы-жерт­вы. Появились также вирусы с иным механизмом поражения. В частности, за­пись вируса в виде VXD-файла. Вирус также корректирует SYSTEM.INI, так чтобы данный "драйвер" загружался каждый раз при загрузке Windows. SYSTEM.INI используется также для заражения программ, всегда загружаемых

при запуске WINDOWS. Вообще понятие резидентной программы в Windows

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

VI. Борьба с вирусами.

- Скажите мне, - спросил Рунев-ский, - каким образом вы узнае­те, кто упырь, а кто нет?

- Это совсем немудрено.

А.К. Толстой. Упырь.

- Меры вот какие. Взял я на кух­не свечечку...

М.А. Булгаков. Мастер и Маргарита.

Мы попробовали провести некоторую классификацию проявлений вирусов. По этим признакам можно судить о присутствии вирусов на диске или в памяти, не имея специальных средств:

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

(не так заметно) и т.д.

б) Нехватка памяти. Некоторые программы сообщают о нехватке памяти, некото­рые выдают сообщения об ошибке или зависают. В любом случае это должно

Вас насторожить.в) Когда вирус "садится" на программу, то происходит автоматическая коррек­тировка времени и даты файла. Если вирус не восстанавливает старые значе­ния, то это может служить хорошим признаком несанкционированного досту­па к Вашей программе. Интересно, что установка во времени корректировки файла 62 секунды (проверьте, что установить 63 или 61 секунду невозможно, и объясните почему) является для многих вирусов признаком зараженности программы.

г) Проявления, связанные с развлекательными функциями вируса. Это могут быть необычные или шутливые сообщения, странные явления на экране (осыпание букв и т.д.), звуковые сигналы и музыка и т.д.

д) Проявления, связанные с разрушительными функциями вирусов. Это может быть

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

е) Проявления, связанные с некорректной работой вируса или наличием ошибок в нем. Классическим примером может служить отсутствие обработки критичес­ких ошибок для MS DOS (см. Глава 9). Некоторые вирусы, заражая программу, безнадежно портят ее (иногда ошибка, а иногда и намеренные действия). Часто вирусы некорректно работают с операционной системой. Например, не работа­ют на DOS 6.O. Портят содержимое регистров при входе в программу. Проявле­ний здесь огромное количество. Некорректная загрузка Windows также должна Вас насторожить.

ж) Иногда о наличии в программе вируса можно судить по присутствию в нем некоторых характерных строк, которые можно обнаружить даже при "тексто­вом" просмотре. Вотэтитипичные строки: *.СОМ, * EXE, РАТН= COMMAND. "Умные" вирусы, однако, шифруют строки, подобные этим.

з) Нерезидентные вирусы после запуска зараженной программы должны найти новую жертву, прежде чемпередать управление программе. Поиск, вообщего-воря, может потребовать времени. Поэтому отмечайте для себяте случаи, когда некоторые программы начнут запускаться медленнее обычного.

Появление новых операционных систем, таких, как Windows, вносит серьезные коррективы в дело обнаружения вирусов. Сразу скажу, что обнаружение вирусов способами, описанными выше, становится все менее и менее возможным. Из-за ог­ромного количества файлов как в самой операционной системе, так и в используе­мых пакетах, никто уже не просматривает списки файлов. Да и сами программы запускаются или с рабочего стола, или из меню. Наличие же ошибок в операцион­ных системах Windows 95 и Windows 98 приучает пользователей к не совсем коррек­тной работе системы. Зависания, некорректные загрузки и неожиданные перезаг­рузки компьютера теперь списывают на систему, а о вирусах забывают. Все это дос­таточно печально и наводит на мысль том, что компьютерным вирусам далее будет жить все вольготнее. Наше время ознаменовано также широким распространением локальных и глобальных компьютерных сетей, что еще в большей степени усложня­ет возможность обнаружения вируса.

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

Антивирусные ревизоры. Суть работы этих программ заключается в том, что состояние программ, системных файлов, Ьоо^секторов и т.п. запоминается. При запуске ревизора происходит сравнение контрольных сумм. При обнаружении из­менений выдается сообщение или производятся, какие-либо другие действия. Ра­зумеется, ревизор не может точно сказать, обнаружен вирус или изменения вызва­ны другими причинами. Основным требованием, предъявляемым к таким програм­мам, является умение обнаружить изменения, производимые вирусом, даже если вирус находится в памяти. Ревизия должна производиться по крайней мере каж­дый раз после запуска операционной системы. Существуют резидентные ревизо­ры, которые могут проверять контрольную сумму программы перед самым ее за­пуском.

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

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

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

Резидентные сторожа. программа, позволяющая выявить или бло-

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

Программа может иметь и своего собственного сторожа, который запускается при запуске программы и далее проверяет возможность ее заражения. В конце главы при­водятся примеры того, как в принципе может быть построен такой сторож.

VII. О вирусных технологиях.

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

Начнем с возможности поиска вируса по сигнатуре. В первых статьях о вирусах сигнатуре уделялось большое внимание. Приводились таблицы наиболее удачных, по мнению авторов, сигнатур. Многие вирусы шифровали свое тело, но, поскольку, алго­ритм шифрования не менялся, сигнатуры все равно существовали. Способ шифрова­ния может быть достаточно прост - обычно используется команда XOR: две команды типа XOR AL,B, где В произвольный байт не меняют содержимое регистра AL. Легко видеть, что способ шифровки можно изменить, меняя значение байта В. Меняя слу­чайным образом, способ шифровки, вирус каждый раз будет представать в новом об­личье. Есть, однако, одно "но" - участок, который занимается расшифровкой, не может быть зашифрован, и, следовательно, по нему вирус может быть обнаружен и расшиф­рован. Казалось бы, вопрос с сигнатурой решен - она должна существовать для любо­го вируса. Однако существует подход, позволяющий создавать вирусы, поиск которых по сигнатуре невозможен. В простейшем варианте данный способ заключается в том, что значащие команды "разбавляются" незначащими, которые никак не влияют на ра­боту вируса. Это могут команды NOP, MOVMEM.AX, PUSH AX/POP АХ, CLD, STIh т.д. Причем количество незначащих команд может также варьироваться, и поэтому будет все время меняться длина вируса48. В более изощренном варианте команде или группе команд ставится в соответствие команда или группа команд, результат выпол­нения которых эквивалентен первой. Чтобы уяснить идею сказанного, ниже приво­дится таблица соответствия для некоторых команд или их групп команд49.

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

может быть достигнут сочетанием шифрования тела вируса и модификацией его

части, занимающейся расшифровкой. Вирусы, шифрующие свое тело, называют "ви­русами-призраками" .

Изменение длины зараженной программы является существенным признаком при­сутствия вируса. Однако авторы вирусов и здесь нашли возможность обойти эту про­блему. Наиболее очевидным способом является перехват функций DOS FindFirst и

48 Первые работы по компьютерной вирусологии придавали большое значение длине файло­вых вирусов.

« Вообще говоря, следовало бы дать определение эквивалентности команд или групп команд. Например, есть отличие между эквивалентностью команд MOVAX.BXhXCHG ВХ,АХ/ MOVBX,AX, с одной стороны, и команд MOVAX.BX и MOVMEM,BX/MOVAX,MEM - с другой. Во втором случае меняется содержимое ячейки MEM. Я думаю, дальнейший анализ читатель сможет провести сам.

FindNext и подстановка длины незараженного файла. Надо, однако, иметь в виду, что некоторые программы читают директорию напрямую, посредством INT25H и их не обманешь. Более изощренный метод заключается втом, чтобы при заражении файла в директорию поставить длину незараженной программы, во время же запуска програм­мы и при выполнении некоторых других функций DOS подставляется истинная дли­на. При этом, естественно, речь идет о ситуации, когда вирус находится в памяти. Казалось бы, все, но найден еще один поразительный способ. Идея, как ни странно, удивительно проста: файл можно заархивировать, и тогда его длина уменьшиться. К такому файлу приписывается вирус и необходимые байты, и длина зараженной про­граммы не меняется. В более упрощенном варианте этот метод заключается в том, чтобы найти в файле цепочку повторяющихся байтов, которую можно заменить про­сто тройкой байт (все понятно, правда?), а на освободившееся место поместить вирус. Наконец, есть еще одна возможность маскировать свое присутствие в файле. Дело в том, что единицей записи на диск на уровне операционной системы является кластер. Длина кластера может составлять несколько секторов (см. главу 14). Если вирус не слишком длинен, он может помещать информацию (например, отрезок программы, который он занял) в свободные секторы последнего кластера, которого, вообще гово­ря, может и не быть. Длина программы при этом меняться не будет. Однако при копи­ровании такие программы могут быть безнадежно испорчены.

MOVAX,BX

PUSHBX

XCHGAX,BX

MOVMEM,BX

 

ЮРАХ

MOVBX,AX

MOVAX,MEM

JMPL1

MOVMEM,BX

ЮРМЕМ

LEA BX,L1

 

LEABX,L1

CALL

MOVMEM,BX

 

PUSHBX

 

LEA BX,MEM

 

MOVBX,MEM

 

JMP[BX]

 

REIN

 

 

ADDAX,CX

PUSHCX

MOVMEM,CX

PUSHCX

 

LP

ADDAXjMEM

LP

 

ADD AX, 1

 

ADDCX,1

 

LOOP LI

 

SUB AX, 1

 

POPCX

 

JNZL1

 

 

 

MOVAX.CX

 

 

 

POPCX

Вирус может быть обнаружен при визуальном просмотре диска или файла. Здесь обман пользователей происходит либо путем подстановки незараженного кластера, либо даже удалением вируса из файла перед просмотром. Последний вариант весьма неуклюж, однако, работает и создает определенные сложности при поиске вируса. Ви­русы, маскирующие свое присутствие на компьютере, называют "стелс-вирусами".

На этом я закончу рассуждения о вирусных технологиях. Замечу, что развитие их сделало бесполезным многие антивирусные программы или даже их виды. Например,использование недокументированных точек входа в MS DOS делает бесполезной ра­боту многих программ-сторожей. Заражение программ во время операций копирова­ния делает весьма проблематичным обнаружение факта заражения.

VII.

И как пьяный сторож, Выйдя за дорогу.

С. Есенин

Здесь приводится пример того, как к можно подсоединить дру-

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

Рис. 18.3 - программа подсоединяет к СОМ-программе программу-сторож (Рис. 18.5,имя PO.COM).

Рис. 18.4- программа удаляет из СОМ-программы программу -сторож.

Рис. 18.5 - программа-сторож. При запуске СОМ-программы вначале получает управление сторож. Наша программа не делает ничего, лишь выводит строку и пере­дает управление основной программе.

Приведенные программы демонстрируют некоторые простейшие технологии, о которых мы говорили выше.

; программа установки  сторожа  на СОМ-файл CODE SEGMENT

ASSUME CS:CODE,   DS:CODE, SS:CODE

ORG 10OH

BEGIN:

; блок анализа командной строки XOR SI, SI XOR DI,DI MOV DL,1

LOO:

CMP BYTE PTR [81H+SI],0DH

JZ NO_PAR

MOV AL, [81H+SI] CMP AL, ' '

JZ SPACE XOR DL,DL

MOV   [PATH2+DI] ,AL

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

SPACE:

L001:

INC DI

JMP   SHORT L001

OR DL,DL /если DL=0, тогда первый параметр закончился JZ NO_PAR

INC SI

JMP  SHORT LOO

NONPAR:

OR ли параметр

JNZ CONT /сообщение,   затем выходим MOV DX,OFFSET TEXT1 MOV AH,9 INT 21H JMP _END

CONT:

/открываем файл,   .на который посадим сторожа

LEA  DX,PATH2

MOV AH,3DH

MOV AL,2

INT 21H

MOV BX,AX

MOV HANDL2,BX ;найдем длину

XOR DX,DX

XOR CX,CX

MOV

MOV AL,2 INT 21H /LEN-->AX

на длину

/правильнее было бы проверять длину файла + длина сторожа /здесь мы предполагаем,   что сторож не длиннее  1.5 Кб

MOV LEN2,АХ

СМР АХ,64000

JNA _NO JMP _END

_NO:

/открываем для  чтения "сторож" LEA  DX,PATHI MOV AH,3DH MOV AL,0

; читаем в   буфер ■

MOV ВХ,АХ

MOV

LEA DX,BUF

MOV СХ,2000     ;полагаем,  что 2000  байт хватит

INT 21H

MOV ,г закроем

MOV

INT 21H

;пишем в конец файла

MOV BX,HANDL2

MOV АН,40Н

LEA DX,BUF

MOV CX,LEN1

INT 21H j; на начало файла

XOR CX,CX

XOR DX,DX

MOV АН,42H

MOV AL,0

INT 21H

считаем 3 байта

LEA

MOV CX,3

MOV AH,3FH

INT 21H

в нужное место

MOV CX,0

MOV DX,LEN2

MOV AL,0

MOV AH,42H

INT 21H

/пишем

LEA

MOV CX,3

MOV AH,4OH

INT 21H

на начало

XOR CX,CX

XOR DX,DX

MOV АН,42H

MOV AL,0буфер, команда ADR MOV BYTE PTR BUF,OE9H

MOV AX,LEN2

MOV WORD   PTR BUF+1,AX

пишем три байта MOV AH,4OH LEA DX,BUF MOV CX,3

INT 21H

;закроем

MOV

INT 21H

LEA DX,TEXT2 MOV AH,9

INT 21H

_END:

PATH1 PATH2 TEXT1 TEXT2 HANDL2

ЯЕТЫ

ВВ   ' РО. СОМ1, 0    ; имя сторожа ВВ  80  ОиР(О)        ;имя СОМ-программы ВВ   'Нет параметра1,13,10, '$' ВВ   'Сторож установлен', 13,10, '$' В¥1 ?   ; дескриптор файла

файлов

LEN1 DW ? LEN2        DW ?

BUF DB 2000 CODE ENDS

END BEGIN

DUP(?)

Рис. 18.3. Программа установки сторожа на СОМ-программу. ; программа удаления сторожа с СОМ-файла

CODE SEGMENT

ASSUME CS:CODE, DS:CODE ORG 100Н

BEGIN:

анализа командной строки

XORSI,SI XORDI,DI MOV DL, 1

LOO:

CMP   BYTE   PTR   [81H + SI],ODH JZ NO_PAR MOV AL, [81H+SI]

CMP AL, ' '

JZ SPACE

XOR DL,DL

MOV [PATH1+DI],AL

INC DI

SHORT L001

SPACE:

LOOl:

JMP

OR JZ

INC JMP

DL, DL ;если DL=0, NO PAR

тогда  первый параметр закончился

SI

SHORT

LOO

NO_PAR:

OR

JNZ CONT /сообщение,   затем выходим MOV  DX, OFFSET TEXT1 MOV AH,9

INT 21H

JMP _END

CONT:

/открываем файл,

ли параметр

которого удалим сторожа

LEA DX,PATH1 MOV AH,3DH MOV AL,2

INT 21H

MOV

/найдем конец файла MOV AH,42H MOV AL, 0

XOR  CX,CX ■ MOV DX,1 INT 21H

MOV LEA

■ MOV CX, 2 .

INT 21H

DX,WORD

LEN,DX

(без сторожа)

MOV MOV

/теперь перейдем

MOV

MOV AL,О XOR CX,CX

'INT 21H

PTR BUF     /В DX длина файла

на конец

; прочесть 3 байта MOV AH,3FH . LEA DX,BUF

MOV CX,3

INT 21H

: снова на начало MOV AH,42H MOV AL, 0 XOR CX,CX XOR DX,DX

INT 21H

ї пишем три байта MOV AH,40Н LEA DX,BUF

MOV CX,3

INT 21H

/теперь читаем в буфер но вначале назад MOV АН,42Н MOV AL,0 XOR CX,CX XOR DX,DX

INT 21H : чтение в буфер

MOV CX,LEN. LEA DX,BUF MOV AH, 3FH

INT 21H

/закрытие файла MOV АН, 3EH

int 21h

создать файл    (переписать старый) MOV АН,ЗОН LEA  DX,РАТНІ

MOV сх, о

INT 21H

записать  в него буфер MOV AH,40Н LEA DX,BUF

MOV CX,LEN   ;длина файла   без сторожа

int 21h

закрыть

MOV

INT 21H

LEA DX,TEXT2

MOV АН,9

INT 21H

_END:

RETN

РАТН1    DB  80  DUP(O)        ;имя СОМ-программы ТЕХТ1    DB   'Нет параметра', 13,10, '$' ТЕХТ2     DB   'Сторож удален', 13, 10, '$' ;длины файлов LEN        DW ?

BUF        DB   64000 DUP(O) CODE ENDS

END BEGIN

Рис. 18.4. Программа удаления сторожа с СОМ-программы.

;программа РО,ASM .286

CODE SEGMENT

ASSUME CS:CODE

ORG ООН

BEGIN:

;здесь три первых байта DB  3 DUP(?) /сохранить регистры

PUSH AX

PUSH DX

PUSH SI

PUSH DI

три  первых байта

MOV DI,100H

MOV SI, [DI+1]

.MOV DX,SI     ;еще понадобится

ADD SI,100H

MOV AL, [SI]

MOV [DI],AL

MOV AL, [SI]+1

MOV        [DI]+1,AL

MOV AL,   [SI]+2

MOV [DI]+2,AL

;выполнить нужные действия

;например,   проверка контрольной суммы /**********************************

;вывод строки

ADD DX,100H

LEA      AX,TEXT1 ADD DX,AX MOV    AH, 9 INT 21H MOV     AH, 0 INT 16H

; передать управление основной программе ;в начале восстановим регистры

POP DI

POP SI

POP DX

POP AX

PUSH 100H ;команды 286-го процессора, MOV AX, 100H/PUSH AX RETN

TEXT1 DB "Сторож сделал свое дело. Сторож может уходить.", 13,10 DB "Жмите любую клавишу.",13,10,"$"

END:

CODE ENDS

END BEGIN .

Рис. 18.5. Программа сторож (каркас).

Далееприводитсякраткоепояснениевышеприведенныхпрограмм.

1. Первая программа, получая в командной строке имя СОМ-программы, подсоеди-няеткней P0.COM. Сохраняет в первых трех байтах сторожа первые три байта самой программы. В начале основной программы ставится JMPADR, meADR -смещение сторожа. Приэтомуясните себе, что этоненачалосторожа. Это начало плюсЗ байта. В этихтрех байтах будет храниться начало программы.

2. Наш сторож не выполняет никакихдействий, кроме вывода строки. Самое глав­ное - разберитесь в адресации. Адрес любой строки здесь будет складываться из ЮОНдлины основной программы, смещения относительно начала програм­мы "сторож".

3. Программа удаления "сторожа" делает действия, обратные программе на Рис. 18.3.Т.е. восстанавливает первыетри байта и удаляет лишний код.

А теперь я предлагаю Вам, дорогой читатель, на основе наших программ написать свои программы, дополнительно выполняющие следующие действия:

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

2. Усовершенствуйте программу установки так, чтобы она проверяла возможную ситуацию, когда длина программы и "сторожа" превосходит 64 Кб.

3. Наконец предусмотрите проверку того, установлен сторожили нет. Простей­ший вариант: в конце программы "сторож" поместите строку, наличие которой потом будете проверять.