Опубликовано в Gazeta.Ru от 04-08-1999 (Выпуск No 107)
Оригинал: http://gazeta.ru/flopovod/04-08-1999_virus.htm


Валерий Котов, <enterpress@mail.ru>
Вирусы


Вирусы. Они бывают разные - например, грипп, гепатит, герпес; а бывают еще и компьютерные. Вот о них, родимых, и поговорим. Что же это такое - компьютерный вирус?

Объяснений, что такое компьютерный вирус, можно привести несколько. Самое простое - бытовое объяснение для домохозяйки, которая ни разу в жизни компьютера не видела, но знает, что Он есть, и что в Нем водятся Вирусы. Объяснение будет дано на примере клерка, работающего исключительно с бумагами. Идея такого объяснения принадлежит Д.Н.Лозинскому.

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

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

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

В приведенном выше примере про клерка и его контору лист-вирус не проверяет, заражена очередная папка заданий или нет. В этом случае к концу рабочего дня контора будет завалена такими копиями, а клерки только и будут что переписывать один и тот же текст и раздавать его соседям - ведь первый клерк сделает две копии, очередные жертвы вируса - уже четыре, затем 8, 16, 32, 64 и т.д., т.е. количество копий каждый раз будет увеличиваться в два раза. Если клерк на переписывание одного листа тратит 30 секунд и еще 30 секунд на раздачу копий, то через час по конторе будет "бродить" более 1.000.000.000.000.000.000 копий вируса! Скорее всего, конечно же, не хватит бумаги, и распространение вируса будет остановлено по столь банальной причине.

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

"А как же уничтожение данных?" - спросит хорошо эрудированная домохозяйка. Все очень просто - достаточно дописать на лист примерно следующее:
1. Переписать этот лист два раза и положить копии в стопку заданий соседей, если у них еще нет этого листа.
2. Посмотреть на календарь - если сегодня пятница, попавшая на 13-е число, выкинуть все документы в мусорную корзину.

Кстати, на примере клерка очень хорошо видно, почему в большинстве случаев нельзя точно определить, откуда в компьютере появился вирус. Все клерки имеют одинаковые (с точностью до почерка) КОПИИ, но оригинал-то с почерком злоумышленника уже давно в корзине!

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

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

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

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

Основная же особенность компьютерных вирусов - возможность их самопроизвольного внедрения в различные объекты операционной системы - присуща многим программам, которые не являются вирусами. Например, операционная система MS-DOS имеет в себе все необходимое, чтобы самопроизвольно устанавливаться на не-DOS'овские диски. Для этого достаточно на загрузочный флоппи-диск, содержащий DOS, записать файл AUTOEXEC.BAT следующего содержания:
SYS A:
COPY *.* A:\
SYS B:
COPY *.* B:\
SYS C:
COPY *.* C:\

Модифицированная таким образом DOS сама станет самым настоящим вирусом с точки зрения практически любого существующего определения компьютерного вируса.

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

Мнений по поводу даты рождения первого компьютерного вируса очень много. Доподлинно известно только одно: на машине Беббиджа его не было, а на Univac 1108 и IBM-360/370 они уже были ("Pervading Animal" и "Christmas tree"). Таким образом, первый вирус появился где-то в самом начале 70-х или даже в конце 60-х годов, хотя "вирусом" его никто еще не называл.

Поговорим о новейшей истории: "Brain", "Vienna", "Cascade" и далее. Те, кто начал работать на IBM-PC аж в середине 80-х, еще не забыли повальную эпидемию этих вирусов в 1987-89 годах. Буквы сыпались на экранах, а толпы пользователей неслись к специалистам по ремонту дисплеев (сейчас все наоборот: винчестер сдох от старости, а валят на неизвестный передовой науке вирус). Затем компьютер заиграл чужеземный гимн "Yankee Doodle", но чинить динамики уже никто не бросился - очень быстро разобрались, что это - вирус, да не один, а целый десяток.

Так вирусы начали заражать файлы. Вирус "Brain" и скачущий по экрану шарик вируса "Ping-pong" ознаменовали победу вируса и над Boot-сектором.

Время шло, вирусы плодились. Все они были чем-то похожи друг на друга, лезли в память, цеплялись к файлам и секторам, периодически убивали файлы, дискеты и винчестеры. Одним из первых "откровений" стал вирус "Frodo.4096" - файловый вирус-невидимка (стелс). Этот вирус перехватывал INT 21h и, при обращении через DOS к зараженным файлам, изменял информацию таким образом, что файл появлялся перед пользователем в незараженном виде. Но это была только надстройка вируса над MS-DOS. Не прошло и года, как электронные тараканы полезли внутрь ядра DOS (вирус-невидимка "Beast.512"). Идея невидимости продолжала приносить свой плоды и далее: летом 1991 года пронесся, кося компьютеры как бубонная чума, вирус "Dir_II".

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

Первый полиморфный вирус появился в начале 90-х кодов - "Chameleon", но по-настоящему серьезной проблема полиморфик-вирусов стала лишь год спустя - в апреле 1991-го, когда практически весь мир был охвачен эпидемией полиморфик-вируса "Tequila".

Год 1995-й, август. Все прогрессивное человечество, компания Microsoft и Билл Гейтс лично празднуют выход новой операционной системы Windows95. На фоне шумного торжества практически незамеченным прошло сообщение о появлении вируса, использующего принципиально новые методы заражения - вируса, заражающего документы Microsoft Word.

А вирус, получивший к тому времени имя "Concept", продолжал победное движение по планете. Появившись, скорее всего, в каком-то из подразделений Microsoft, "Concept" в мгновение ока завладел тысячами (если не миллионами) компьютеров. Это неудивительно, ведь передача текстов в формате MS Word стала де-факто одним из стандартов, а для того, чтобы заразиться вирусом, требуется всего лишь открыть зараженный документ, и все остальные документы, редактируемые в зараженном Word'e, также оказываются зараженными. В результате, получив по Интернету зараженный файл и прочитав его, пользователь, не зная того сам, оказывался "разносчиком заразы", и вся его переписка (если, конечно же, она велась при помощи MS Word) также оказывалась зараженной! Таким образом, возможность заражения MS Word, помноженная на скорость Интернета, стала одной из самых серьезных проблем за всю историю существования вирусов.

Не прошло и года, как летом 1996-го года появился вирус "Laroux" ("Лару"), заражающий таблицы MS Excel. Как и в случае с вирусом "Concept", новый макро-вирус был обнаружен "в природе" практически одновременно в разных фирмах. Кстати, в 1997 году этот вирус стал причиной эпидемии в Москве.

В том же 1996 году появились первые конструкторы макро-вирусов, а в начале 1997 года появились первые полиморфик-макро-вирусы для MS-Word и первые вирусы для MS Office97. Плюс к тому непрерывно росло число разнообразных макро-вирусов, достигшее нескольких сотен к лету 1997-го.

Так что же происходит, когда вирус попадает в машину?

Так как вирус - программа, которую написал человек, то, естественно, как и все программы, он имеет структуру, которая присуща и другим вирусам. Что главное для вируса? Основным параметром вируса является размножение, если, конечно, его не писали для определенных целей, типа добавить денег на счет "писателя" в каком-то банке. Поэтому главный блок любого вируса - это блок размножения. Как же строится этот "главный" блок вируса? Сколько разных идей было придумано программистами в этих целях? В первых модификациях только "заражали" файлы .cом, .exe, .sys, т.е. те, которые непосредственно содержали исполнимый код. Это понятно, но как искать эти файлы, ведь на диске так много каталогов? Первые модели брали пути, которые они прописывают в переменной PATH, и по ним искали "новые жертвы". Более поздние обыскивали весь диск, открывая по очередности все каталоги системы (очень долгий процесс, поэтому на компьютерах того времени это занимало довольно большой отрезок времени и сразу было видно - вирус). Позже стали делать "резиденты-вирусы". Они "вешались" в памяти и следили за тем, что делает ДОС. Как только ловили обращение системы к какому-то файлу - мгновенно заражали этот файл-бедняжку. Вот так-то. С этим, вроде, решили (как найти жертвы).

Теперь непосpедственно о заpажении. Спеpва поговоpим о .com виpусах, т.е. заpажающих .com файлы. Если вирус помещает свое тело в начале программы, его местоположение всегда жестко закреплено, при запуске этой зараженной программы он выполняется первым, при этом его легко "поймать", притом после своей работы он должен возвращать ту часть программы, на месте которой он расположился. Если тело вируса лежит в середине, то его максимально трудно поймать и вылечить файл, так как необходимо вычислить, где именно он находится, зато у вируса возникают проблемы - необходимо переносить после работы на свое место блок, который был там до заражения. Еще один подводный камень для вируса, передача ему управления. Ему необходимо где-то в начале сделать пеpеход на точку выполнения, но вот только как делается такой пеpеход? Был придуман "фиктивный" переход. Первый из них - это дописать в начале программы переход типа jmp addr, где addr - точка запуска вируса, а после выполнения "черных дел" вирус вернет на место этого jmp-а старый код, но при просмотре программ эту подмену можно легко заметить. Поэтому сейчас применяют более изощренный метод. Дело в том, что команда jmp и call - очень распространенные команды, и их использует практически любая программа. Поэтому вирус ищет в начале программы код, соответствующий jmp addr или call addr и вместо адреса в операнде подставляет свой, а после своего выполнения делает переход на старый адрес. Увидеть подмену адреса - довольно сложный процесс. Если же тело вируса лежит в конце, то у вируса возникают проблемы с запуском и возможностью легкого обнаружения, но при этом нет необходимости переносить блоки, на месте которых находится вирус.

Теперь немного о заражении .exe файлов. У них есть заголовок, в котором прописаны очень важные данные, как-то: требуемый размер памяти, сегмент стека, и, что более важно, точка запуска программы. Следовательно, эту точку можно поменять так, чтобы она как раз попадала на вирус, который может располагаться опять-таки, в трех местах (об этом говорилось выше). Теперь, казалось бы, берется метод заражения файла с допиской тела вируса в конец, и меняется точка запуска на точку запуска вируса. Но при таком расположение вируса его легко обнаружить (антивирусы ругают те программы, у которых точка пуска лежит в конце, ибо это редкость). Еще один камушек для вируса - существование у .exe файлов оверлеев, т.е. кусков кода, которые при запуске не грузятся в память, а их по необходимости подгружают в последствии. Так, если вирус цепляется в конце файла, то у него нет гарантии, что он будет находиться в памяти после запуска. Для этого находится абсолютный конец, т.е. такой участок, где заканчивается сама программа и начинаются оверлеи. Потом сюда вписывается вирус, а оверлеи сдвигают на длину вируса. Другие методы с допиской вируса в начало или середину тоже используются при написании .exe вирусов. Но они для запуска тела в коде программы уже ищут не jmp addr и call adrr, а jmp far addr и call far addr, т.к. .exe файлы нередко превышают длину одного сегмента. Не стоит забывать и о заражении boot и master-boot секторов. Этот способ повел за собой целую цепочку бутовых вирусов. Дело в том, что в boot-записи, которая, для незнающих, находится на диске, в 1 секторе, 0 головке, 0 цилиндре, записана программа, которая "загружает" ОС. Эта программа пускается в самом начале работы, т.е. как только определено наличие жесткого диска. Именно программа, записанная в этой записи, "выкрикивает" известное сообщение: Non system disk or disk error!!!

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

После блока заpажения идет втоpой уже "необязательный" блок - тот, котоpого боятся все пользователи. Это блок действия. Именно этот блок является "пpиятной неожиданностью" в pаботе виpуса. Обычно он запускается не сpазу. Только "глупый" виpус выдает свое пpисутствие сpазу. Умный сначала pазмножится так, чтобы система была уже "обpечена", и узнает о существовании виpуса пользователь или нет - уже не имеет значения. Чаще всего в теле виpуса имеется некий счетчик (Counter), в котоpом учитывается число "успешных" заpажений. После того, как счетчик достигнет опpеделенного значения, идет запуск блока действия. А в еще более изощpенных модификациях существуют 2 счетчика. Пеpвый тоже содеpжит число заpаженных файлов, а втоpой - число заpаженных файлов на дискетах. И только когда оба счетчика достигнут опpеделенного значения, запускается блок действия. Зачем это делается? Да ведь если виpус, скажем, заpазит на жестском диске 1000 файлов и отфоpматиpует его, то он сам себя и убьет. И не достигнет основной цели - выжить. Именно содеpжимое блока действия создало такое pазнообpазие виpусов, что очень тpудно пеpечислить все модификации, но основные виды можно попpобовать. Пеpвый тип - безобидные демонстpатоpы. Они не делают ничего плохого, только мешают пользователю в pаботе. Скажем, вдpуг на экpане появляется кpасный теннисный мячик и, отбиваясь от символов, скачет по экpану. Или ни с того ни с сего начинают опадать буквы вниз (а-ля листопад). Далее следует гpуппа так называемых пугающих виpусов. В пpинципе их можно отнести к пеpвой гpуппе, но действие этих виpусов очень интеpесно. Они обычно очень пpавдиво и популяpно pассказывают пользователю о том, что сейчас, к пpимеpу, его жесткий диск будет отфоpматиpован. И потихоньку pисуют быстpо меняющийся индикатоp пpоцентов очищенного пpостpанства. Hовичок-пользователь увидев это (скоpее всего), потеpяет сознание или, что еще хуже, получит pазpыв сеpдца. Чаще всего, конечно, это шутки, хотя не всегда. Следом идет не менее обшиpная гpуппа так называемых pазpушающих виpусов. Их задачей, естественно, является pазpушение. Самое пpимитивное, что они могут сделать, это отфоpматиpовать жестский диск, дискету или стереть BIOS. Hо пpи этом виpус убьет и себя. Интеpеснее было бы сделать так, чтобы виpус показал свое пpисутствие, но в то же вpемя пользователь не мог так пpосто от него избавиться. Извpащенные умы нашли и здесь очень тонкий метод. Пpедставте себе каpтину: виpус закодиpовал вам жестский диск. И только в том случае, если виpус запущен и находится в памяти, DOS в состоянии пpочесть ту закодиpованную инфоpмацию. Таким обpазом, пользователь пpосто обязан запускать виpус. Тем самым виpусописатель достиг высшей стадии, когда уже виpус не должен искать лазейки для своего запуска, а сам пользователь уже его запускает. Вот это метод! Или, скажем, считать FAT и скопиpовать его в абсолютно дpугое место на диске, а на его месте написать всякую белибеpду. Опять же без запуска виpуса у пользователя система не будет коppектно pаботать.

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

И напоследок небольшая памятка:

При написании заметки использовался материал статей Евгения Касперского и Дениса Морозова.

Пишите нам: info@gazeta.ru
Copyright © Gazeta.Ru
RRU_Network
При перепечатке и цитировании ссылка на источник с указанием автора обязательна. Перепечатка без ссылки и упоминания имени автора является нарушением российского и международного законодательства, а также большим свинством.