телям. Особую опасность с точки зрения распространения компьютер-
ных вирусов представляют любители компьютерных игр, обычно слабо
знающие операционную систему и не вполне понимающие смысл выполня-
емых ими действий. Такие пользователи подвергают значительному ри-
ску своих коллег, работающих с ними на одной ПЭВМ.
Упрощенно процесс заражения вирусом программных файлов можно
представить следующим образом. Код зараженной программы обычно из-
менен таким образом, чтобы вирус получил управление первым, до на-
чала работы программы-вирусоносителя (рис.2). При передаче управ-
ления вирусу, он каким-то способом находит новую программу и вы-
полняет вставку собственной копии в начало (рис.2б) или добавление
ее в конец этой, обычно еще не зараженной, программы (рис.2а). Ес-
ли вирус дописывается в конец программы, то он корректирует код
программы, чтобы получить управление первым. Для этого первые не-
сколько байтов запоминаются в теле вируса, а на их место вставля-
ется команда перехода на начало вируса. Этот способ является наи-
более распространенным. Получив управление, вирус восстанавливает
"спрятанные" первые байты, а после отработки своего тела передает
управление программе-вирусоносителю, и та нормально выполняет свои
функции. Возможны случаи, когда вирус включает себя куда-то в се-
редину программы, например, в область стека (рис.2в). Последние
случаи встречаются редко.
+------------------+ +-------------+ +------------------+
|++++++++++++++++++| |+++++++++++++| |++++++++++++++++++|
|+Команда перехода+|+ |+++++++++++++| |+Команда перехода+|+
|++++++++++++++++++|| |+Тело вируса+| |++++++++++++++++++||
|------------------|| |+++++++++++++| |------------------||
|++++++++++++++++++|| |+++++++++++++| |++++++++++++++++++||
|+ ЗАРАЖЕННАЯ +++|| |+++++++++++++| |+ НАЧАЛО +++||
|++++++++++++++++++|| |+++++++++++++| |++++++++++++++++++||
|+ ПРОГРАММА ++|| |+++++++++++++| |+ ЗАРАЖЕННОЙ +++||
|++++++++++++++++++|| |+++++++++++++| |++++++++++++++++++||
|+ (COM - ФАЙЛ) ++|| |+++++++++++++| |+ ПРОГРАММЫ ++||
|++++++++++++++++++|| |+ЗАРАЖЕННАЯ +| |++++++++++++++++++||
|++++++++++++++++++|| |+++++++++++++| |++++++++++++++++++||
|++++++++++++++++++|+ |+ПРОГРАММА +| |++++++++++++++++++|+
|++++Тело вируса+++| |+++++++++++++| |++++++++++++++++++|
|++++++++++++++++++| |+COM - ФАЙЛ)+| |++++Тело вируса+++|
|++++++++++++++++++| |+++++++++++++| |++++++++++++++++++|
|++++++++++++++++++| |+++++++++++++| |++++++++++++++++++|
|++++++++++++++++++| |+++++++++++++| |++++++++++++++++++|
|+Спрятанные байты+| |+++++++++++++| |+Спрятанные байты+|
|++++++++++++++++++| |+++++++++++++| |++++++++++++++++++|
|++++++++++++++++++| |+++++++++++++| |++++++++++++++++++|
|++++++++++++++++++| |+++++++++++++| |++++++++++++++++++|
+------------------+ +-------------+ |------------------|
а б |++++++++++++++++++|
|+ КОНЕЦ +++|
Рис. 2. |++++++++++++++++++|
Схема заражения вирусом COM-файлов: |+ ЗАРАЖЕННОЙ +++|
а - в конец программы; |++++++++++++++++++|
б - в начало программы; |+ ПРОГРАММЫ ++|
в - в середину программы. |++++++++++++++++++|
+------------------+
в
2.4. Анатомия компьютерного вируса
Наиболее распространенными типами компьютерных вирусов в MS DOS
являются файловые нерезидентные, файловые резидентные и бутовые
вирусы. Многие из пользователей имеют ограниченный опыт работы с
МS DOS. В то же время, для понимания функционирования файловых ви-
русов и средств защиты от них важно понимать структуру файловой
системы и прерываний MS DOS. Поэтому в приложении 6 приводится
краткий обзор структуры файловой системы MS DOS, в приложении 7 -
структуры исполняемых файлов и некоторых управляющих блоков, а в
приложениях 8 и 9 є сведения о прерываниях. Более подробные сведе-
ния можно получить в учебниках по языку ассемблера [Скенлон89], в
электронном справочнике TECHHELP, а также книгах П.Нортона [Нор-
тон90] и Жордена. Разбор анатомии компьютерных вирусов начнем с
анализа структуры нерезидентного файлового вируса, как простейшей
разновидности этого класса системных программ.
Структурно компьютерный вирус можно представить состоящим из
двух частей: головы и хвоста. Головой называется часть вируса,
которая первой получает управление. Хвост вируса - это части виру-
са, расположенные отдельно от головы. В простейшем случае вирус
может состоять из одной головы, и действительно файловые вирусы
обычно так и устроены. Такие вирусы будем называть несегментиро-
ванными. В отличие от них сегментированные вирусы имеют располага-
ющийся отдельно хвост и в какой-то мере аналогичны оверлейным фай-
лам. Примером сегментированных вирусов являются бутовые вирусы,
хотя возможна реализация сегментированных файловых вирусов.
2.4.1. Структура файлового нерезидентного вируса
Файловые вирусы являются наиболее распространенной разновид-
ностью компьютерных вирусов. Принципиально они заражают любой тип
исполняемых файлов, существующих в MS DOS: COM, EXE, OVL и т.д.
Однако основными объектами заражения являются файлы типа COM и
файлы типа EXE. Некоторые сведения о структуре этих файлов приве-
дены в прил. 6. Наиболее просто осуществляется заражение COM-фай-
лов, которые представляют собой почти точную копию участка памяти
с загруженной программой. Единственная требуемая настройка при за-
грузке COM-файлов состоит в загрузке сегментных регистров значени-
ями, соответствующими месту загрузки программы. Значительная часть
COM-файлов начинается с команды перехода, обходящей содержащие в
начале программы данные.
При заражении COM-файлов вирус запоминает в своем теле первые
три или больше байтов программы и вместо них записывает переход на
начало собственного кода. Так поступает большинство файловых виру-
сов, заражающих COM-файлы, но не все. Дело в том, что при дописы-
вании тела вируса в конец заражаемого файла весь код вируса должен
быть написан специальным образом, обычно называемым позиционно-не-
зависимым программированием: при выполнении программы все ссылки
должны адресоваться через соответствующее смещение, которое обычно
хранится в одном из регистров.
Некоторые вирусы используют более примитивный подход: вместо до-
писывания своего тела в конец заражаемого COM-файла они перемещают
туда первые несколько блоков программы, а сами записываются на
место освободившихся блоков. Так, например, поступает вирус RCE-
1813. В этом случае только программа восстановления исходного со-
стояния программы должна быть позиционно-независимой или она долж-
на размещаться где-то в фиксированных адресах памяти, используя
какой-то неиспользуемый ее участок.
Простейший нерезидентный компьютерный вирус, заражающий COM-
файлы в текущем каталоге и дописывающий свое тело в конец файла,
можно представить в виде следующей неформальной спецификации.
Шаг 1: Восстановить первые три байта программы. Три байта
зараженной программы, сохраненные в теле вируса, пересылаются на
свое старое место.
Шаг 2: Проверить среду. Проверить версию операционной системы.
Если не подходящая, то перейти к шагу 11.
Шаг 3: Найти очередную жертву(ы). Найти в текущем каталоге оче-
редной файл типа COM. При неудаче перейти к шагу 11.
Шаг 4: Проверить зараженность потенциальной жертвы. Считать об-
ласть, позволяющую установить, заражен ли уже данный файл вирусом
или нет. Проверить содержимое этой области. Если файл уже заражен,
то перейти к шагу 3, иначе перейти к шагу 5.
Шаг 5: Проверить, подходит ли жертва для заражения. Если длина
файла + длина вируса больше 64К, перейти к шагу 3, иначе перейти к
шагу 6.
Шаг 6: Снять атрибут READ ONLY, запомнить дату создания програм-
мы. Снять указанный атрибут и запомнить в своем теле дату создания
программы.
Шаг 7: Обеспечить передачу управления вирусу. Считать первые три
байта зараженной программы и записать их в своем теле. Сформиро-
вать команду перехода на байт, следующий за концом программы, и
записать соответствующие три байта в начало заражаемой программы.
При неудаче перейти к шагу 11, иначе перейти к шагу 8.
Шаг 8: Дописать тело вируса в конец заражаемой программы. Пере-
двинуть указатель файла в конец программы и установить режим доза-
писи. Переписать свое тело в конец заражаемой программы. При неу-
даче перейти к шагу 11, иначе перейти к шагу 9.
Шаг 9: Восстановить дату создания зараженной программы. Записать
в элемент каталога, соответствующий заражаемой программе, дату,
сохраненную в теле вируса.
Шаг 10: Восстановить атрибут READ ONLY. Присвоить заражаемому
файлу атрибуты, установленные у файла до заражения и сохраненные в
теле вируса. При неудаче перейти к шагу 11, иначе перейти к шагу
10.
Шаг 11: Выход. Восстановить содержимое регистров и передать уп-
равление программе-вирусоносителю.
Как видно из приведенной схемы, данный вирус распространяется не
мгновенно по всей файловой системе, а постепенно, по мере зараже-
ния файлов в текущем каталоге. Поэтому от момента появления в фай-
ловой системе первого зараженного файла до заражения всех файлов в
каталоге должно пройти некоторое время, зависящее от интенсивности
использования зараженной программы.
Наиболее уязвимыми с точки зрения блокирования размножения виру-
са являются шаг 6 (попытка снятия атрибута READ ONLY), шаги 7,8 є
запись в файл, содержащий исполняемую программу, и шаг 9 є уста-
новка даты создания файла, отличающейся от текущей. Для блокирова-
ния этих шагов обычно используются различные резидентные программы
(см. ниже). Кроме того, если на шаге 4 вирус использует для марки-
ровки зараженных файлов легко воспроизводимый признак (например,
простановку в поле даты значения 62 секунды є излюбленный признак
для файловых вирусов), можно блокировать его распространение, при-
своив этот признак всем заражаемым данным вирусом файлам. Этот
прием используется так называемыми программами-вакцинами (см. ни-
же).
Вставка тела вируса при заражении может выполняться не только в
хвост. Код вируса может имплантироваться в начало, конец или сере-
дину файла.
1) Вставка в начало файла. В этом случае первые блоки (или все
тело) заражаемой программы обычно переписываются в конец, поэтому
до передачи управления зараженной программе вирус должен предвари-
тельно переписать эти блоки (или все тело) на первоначальное мес-
то, заменив ими собственный код. С этой целью вирус должен переме-
стить свое тело или хотя бы соответствующую часть своего кода та-
ким образом, чтобы она не была затерта в процессе операции переза-
писи. Некоторые примитивные вирусы, записываясь в начало заражае-
мого файла, не сохраняют его содержимого. При этом, естественно,
зараженный файл уничтожается, а вирус, получив управление, должен
как- то замаскировать тот факт, что вызываемая программа является
неработоспособной. Для этой цели иногда используется какое-нибудь
подходящее сообщение об ошибке.
2) Вставка в конец файла. При этом необходимо обеспечить переда-
чу управления коду вируса до начала работы зараженной программы.
Для файлов типа COM это обеспечивается заменой нескольких первых
байтов программы (обычно трех в соответствии с размером кода ко-
манды перехода микропроцессора 8088/8086) на команду перехода к
началу вируса (инсталлятору). При этом сами первые байты обяза-
тельно должны быть сохранены где-то в теле вируса, что обеспечива-
ет возможность их восстановления (операция поиска этих трех байтов
является составной частью работы любого фага). Когда инсталлятор
вируса получает управление, то обычно в начале своей работы он