восстанавливает измененные вирусом байты в первоначальном виде.
3) Вставка в середину файла. Этот способ заражения файла встре-
чается редко. Во-первых, этот способ используется узкоспециализи-
рованными вирусами, поражающими определенный класс программ, осо-
бенности структуры которого заранее известны, например, только
файл СOMMAND.COM. Примером такого вируса может служить вирус RC-
346 (Lehigh). Во-вторых, и это гораздо более частый случай, встав-
ка в середину возможна для обычных вирусов, цепляющихся к концу
EXE-файл, если в заголовке этого файла неправильно указана его
длина, т.е. часть файла используется в качестве буфера или
неявного оверлея, как например, в головном модуле системы FOXBASE.
В этом случае вирус считает, что файл имеет длину, указанную в за-
головке, и записывает свой код в область буфера или оверлея. При
этом он оказывается в середине действительно занимаемого данной
программой файла. В-третьих, файл может быть заражен несколькими
вирусами, однотипно заражающими файл (обычно дописывающими свой
код в конец файла). В этом случае, вирус первым заразивший данный
файл, оттесняется к середине файла последующими вирусами. Являясь
сравнительно редкими, указанные случаи довольно часто не учитыва-
ются создателями антивирусных программ, в частности, детекторов и
фагов, которые увлекаясь оптимизацией времени выполнения своих
программ, принимают неправильные допущения о расположении кода ви-
руса в теле зараженной программы. В результате файл может быть не
детектирован как зараженный или вылечен неправильно.
2.4.2. Структура файлового резидентного вируса
Для понимания функционирования файлового вируса необходимо неко-
торое знакомство с системой прерываний компьютера типа IBM PC. Ми-
нимальные необходимые сведения приводятся в приложениях 8 и 9.
Файловые резидентные вирусы, помимо отдельных файлов, заражают,
если так можно выразиться, и память компьютера. Предельно упрощая,
память компьютера можно рассматривать как еще один файл, который
можно заражать, дописываясь "в голову", т.е. в область младших ад-
ресов свободного участка памяти, "в хвост", т.е. в область старших
адресов свободного участка памяти и наконец, "в середину", т.е. в
область адресов, уже используемых операционной системой или какой-
нибудь программой (старшие адреса вектора прерываний, буфера и
т.д.).
Вместе с тем, структура резидентного вируса существенно отлича-
ется от структуры нерезидентного вируса. Резидентный вирус можно
представлять как состоящий из двух относительно независимых час-
тей: инсталлятора и модуля обработки прерываний. Последний, в свою
очередь, состоит из ряда программ обработки. Несколько упрощая,
можно считать, что на каждое перехватываемое прерывание приходится
своя программа обработки.
Инсталлятор получает управление при выполнении зараженной про-
граммы и играет роль своеобразной ракеты-носителя, запускающей ви-
рус на орбиту, т.е. в оперативную память. Он отрабатывает один
раз є после запуска зараженной программы и его целесообразно рас-
сматривать как специализированный файловый вирус, заражающий опе-
ративную память и, возможно, обычные файлы. В последнем случае ин-
сталлятор можно рассматривать как доработанный для заражения опе-
ративной памяти файловый вирус. Структуру инсталлятора можно упро-
щенно представить следующим образом:
Шаг 1: Проверить версию MS DOS
Шаг 2: Восстановить измененные байты зараженной программы.
Шаг 3: Проверить зараженность оперативной памяти. Если память
заражена, то передать управление программе-вирусоносителю, иначе
перейти к шагу 4.
Шаг 4: Закрепиться в оперативной памяти. Переписать свое тело в
заданный участок оперативной памяти и выполнить некоторые действия
по закреплению этого участка за собой.
Шаг 5: Перехватить требуемые прерывания. Заменить адреса в соот-
ветствующих элементах вектора прерываний на адреса своих программ
обработки.
Шаг 6: Передать управление зараженной программе.
Приведем некоторые пояснения к упрощенной схеме инсталлятора
файлового вируса. На шаге 3 инсталлятор, подобно обычному файлово-
му вирусу, каким-то образом определяет зараженность оперативной
памяти. Эта проверка может выполняться самыми разнообразными спо-
собами. Одним из наиболее распространенных является введение неко-
торого нового прерывания или функции существующего прерывания. Ин-
сталлятор выдает это прерывание, и получаемый ответ, например 5555
в регистре AX, играет роль сигнала "память заражена" и "память еще
не заражена", своеобразный аналог 62 секунд для нерезидентных фай-
ловых вирусов. Второй способ состоит в сканировании памяти и по-
иске сигнатуры, характерной для данного вируса. Поиск может начи-
наться с определенной, характерной точки, например, с адреса пере-
хватываемого вирусом прерывания (обычно 21). Могут быть использо-
ваны и другие способы или их комбинация.
Если проверка показала, что память еще не заражена, то на шаге 4
вирус выполняет ее заражение. Как уже указывалось, заражение может
производиться как путем записывания тела вируса на участок свобод-
ной памяти, так и "вписыванием" тела в уже используемый участок. В
первом случае вирус должен обеспечить резервирование этой памяти,
чтобы она не была затерта другими программами. Простейшие вирусы
выполняют это с помощью функций 21-31 или 27 MS DOS. Такие вирусы
видны при просмотре списка резидентных программ утилитами типа
MAP, MEMANAL и т.д. Более сложный способ предполагает манипуляцию
с цепочкой блоков MCB (см. прил.7): вирус сам создает дополнитель-
ный блок MCB для захваченного участка памяти.
После закрепления в оперативной памяти инсталлятор выполняет так
называемый перехват прерываний є обеспечение передачи управления
модулям вируса, обрабатывающим соответствующие прерывания. Это мо-
жет делаться "в лоб", т.е. путем использования соответствующих
функций MS DOS или "с черного хода" є нестандартным способом,
обеспечивающим, в общем случае, более высокую степень маскировки.
При любом способе конечный эффект состоит в том, что при возникно-
вении определенного прерывания вирусу будет передаваться управле-
ние. При этом вирус может содержать дополнительный механизм, обес-
печивающий то, что он будет получать управление всегда первым. Та-
кие резидентные вирусы будем называть всплывающими. Всплытие помо-
гает вирусу обходить простейшие программы-сторожа, основанные на
перехвате тех же прерываний, поскольку они будут получать управле-
ние после вируса. Этот способ использует, в частности, вирус RCE-
1800 (Эдди). Отсюда следует, что анализ списка резидентных про-
грамм и объема памяти, сообщаемого MS DOS, является весьма полез-
ным диагностическим приемом, применимым как при анализе многих ре-
зидентных файловых вирусов, так и при анализе бутовых вирусов. Су-
ществует целый ряд программ, выдающих список резидентных программ.
Автор рекомендует использовать для этой цели программу RELEASE,
которая являясь резидентной, не только позволяет получить этот
список в любой момент, но дает возможность снять ненужные резиден-
тные программы. Сведения об объеме оперативной памяти (установлен-
ной и свободной) проще всего получить с помощью программы CHKDSK,
вxодящей в MS DOS (она также выдает очень важные сведения об объе-
ме памяти, занятой сбойными кластерами, и количестве скрытых фай-
лов), хотя имеется целый ряд других программ с аналогичными функ-
циями (SMAP, MEMANAL, MEMSTAT и др). В случае наличия опасности
заражения вирусом полезно включить вызов CHKDSK в файл
AUTOEXEC.BAT, а за ним поместить строку с данными, которые получе-
ны при загрузке на незараженной системе, например:
c:\dos\chkdsk
echo ПРОВЕРЬТЕ СООТВЕТСТВИЕ ПОЛУЧЕННЫХ ЗНАЧЕНИЙ ЭТАЛОННЫМ !
echo 188416 in 8 hidden, 61440 in bad, 655360 totalmem, pause
515424 free memory
Функционирование резидентного файлового вируса можно представить
как две стадии: стадию инсталляции и стадию слежения. При запуске
зараженной программы управление получает инсталлятор, который
обеспечивает закрепление вируса в оперативной памяти, перехват
требуемых прерываний и, возможно, маскировку (с целью затруднить
свое обнаружение среди резидентных программ). Эта фаза работы ре-
зидентного вируса получила название фазы инсталляции. В дальнейшем
каждый раз при возникновении одного из перехваченных вирусом пре-
рываний управление получает один из модулей обработки соответству-
ющего прерывания. При этом вирус может анализировать поступивший
запрос и, в зависимости от его вида, выполнять те или иные дейст-
вия. Например, загрузка программы в оперативную память и ее выпол-
нение в MS DOS реализованы с помощью прерывания 21-2B. Если вирус
перехватывает это прерывание, то он может определить имя файла, из
которого выполняется загрузка, и заразить программу в этом файле.
Следует также отметить, что способ поиска "жертвы" у резидентных
вирусов существенно отличается от способа, используемого нерези-
дентными вирусами. Нерезидентные вирусы получают управление после
загрузки в память зараженной программы, а затем ищут файл-жертву,
используя параметры PATH, СOMSPEC или другую информацию о располо-
жении выполняемых программ. Если жертва найдена, то она заражает-
ся, а затем управление возвращается зараженной программе. Резиден-
тные вирусы реагируют на определенные прерывания. Получив управле-
ние после перехваченного прерывания, они выполняют соответствующие
действия. Как уже указывалось, обычно резидентные файловые вирусы
выполняют заражение запускаемых программ (по прерыванию 21-4B),
однако наиболее инфицирующие из резидентных вирусов заражают файлы
при их открытии или чтении. Например, вирус RCE-1800, кроме ука-
занных действий перехватывает и прерывания по чтению, заражая, в
частности, оба файла, копируемые командой COPY, если хотя бы один
из них имеет расширение ЕХЕ или СОМ.
2.4.3. Структура бутового вируса
Бутовые вирусы являются весьма специализированной разновидностью
резидентных файловых вирусов. Упрощенно бутовый вирус можно пред-
ставить себе как специализированный резидентный вирус, который за-
ражает единственный "файл" є загрузочный сектор гибкого или жест-
кого диска. Четкой границы между резидентными файловыми вирусами и
бутовыми вирусами не существует: в последнее время появились гиб-
риды, сочетающие заражение файлов с заражением бутсектора винче-
стера. Это подчеркивает близость основных принципов организации
этих двух типов вирусов.
Этот тип вирусов распространяется, инфицируя дискеты, причем как
загружаемые (т.е. содержащие копию MS DOS), так и незагружаемые
(т.е. содержащие любую информацию). Заражение незагружаемых дискет
связано с определенным психологическим расчетом, который, к сожа-
лению, слишком часто оправдывается: при перезагрузке MS DOS поль-
зователи обычно забывают проверить, вставлена ли дискета в диско-
вод A, и часто перезагрузка выполняется с вставленной в указанный
дисковод дискетой, с которой вирус и попадает на винчестер.
Инфицированная дискета всегда содержит часть кода вируса в бут-
секторе, поэтому бутовые вирусы легко обнаружить. При просмотре
бутсектора дискеты на незараженном компьютере легко видеть измене-
ния загрузчика (дамп стандартного бутсектора приведен в прил.6).
Структура стандартного загрузчика лишь незначительно меняется от
версии к версии MS DOS, поэтому изменения легко выявить визуально
(особенно первых трех байтов, содержащих команду JMP на начало
загрузчика) или с помощью подходящей программы (Scan, Aidstest и
др.). Такая проверка должна обязательно проводиться для всех по-
ступающих дискет.
Как уже указывалось, файловые вирусы обычно состоят из одного
сегмента. Впрочем, первую команду JMP, подставляемую большинством