Алгоритм работы
Word-макровирусов
Большинство известных
Word-вирусов (версий 6, 7 и Word 97) при запуске переносят свой код (макросы) в
область глобальных макросов документа ("общие" макросы), для этого
они используют команды копирования макросов MacroCopy, Organizer. Сору либо при
помощи редактора макросов. Вирус вызывает его, создает новый макрос, вставляет
в него свой код, который и сохраняет в документе.
При выходе из Word
глобальные макросы (включая макросы вируса) автоматически записываются в
DOT-файл глобальных макросов (обычно это NORMAL.DOT). Таким образом, при
следующем запуске Word вирус активизируется в тот момент, когда WinWord грузит
глобальные макросы, т. е. сразу.
Затем вирус
переопределяет (или уже содержит в себе) один или несколько стандартных
макросов (например, FileOpen, FileSave, FileSaveAs, FilePrint) и перехватывает
команды работы с файлами. При вызове этих команд вирус заражает файл, к
которому идет обращение. Для этого вирус конвертирует файл в формат Template
(что делает невозможным дальнейшие изменения формата файла, т. е.
конвертирование в какой-либо не-Template-формат) и записывает в файл свои
макросы, включая автомакрос.
Таким образом, если
вирус перехватывает макрос FileSaveAs, то заражается каждый DOC-файл,
сохраняемый через перехваченный вирусом макрос. Если перехвачен макрос
FileOpen, то вирус записывается в файл при его считывании с диска.
Второй способ внедрения
вируса в систему используется значительно реже. Он базируется на так называемых
Add-in-файлах, т. е. файлах, являющихся служебными дополнениями к Word. В этом
случае NORMAL.DOT не изменяется, a Word при запуске загружает макросы вируса из
файла (или файлов), определенного как Add-in. Этот способ практически полностью
повторяет заражение глобальных макросов за тем исключением, что макросы вируса
хранятся не в NORMAL.DOT, а в каком-либо другом файле.
Возможно также
внедрение вируса в файлы, расположенные в каталоге STARTUP. Word автоматически
подгружает файлы-темплейты из этого каталога, но такие вирусы пока не
встречались.
Рассмотренные выше
способы внедрения в систему представляют собой некоторый аналог внедрения
резидентных DOS-вирусов. Макровирусы, которые не переносят свой код в область
системных макросов можно рассматривать аналогом нерезидентных вирусов. Для
заражения других файлов-документов они либо ищут их при помощи встроенных в
Word функций работы с файлами, либо обращаются к списку последних
редактированных файлов (Recently used file list). Затем такие вирусы открывают
документ, заражают его и закрывают.
Алгоритм работы
Excel-макровирусов
Методы размножения
Excel-вирусов (включая Excel 97) в целом аналогичны методам Word-вирусов. Различия
заключаются в командах копирования макросов (например, Sheets.Copy) и в
отсутствии NORMAL.DOT, его функцию (в вирусном смысле) выполняют файлы в
STARTUP-каталоге Excel.
AmiPro-вирусы
При работе с каким-либо
документом редактор AmiPro создает два файла — непосредственно текст документа
(расширение имени файла — SAM) и дополнительный файл, содержащий макросы
документа и, возможно, прочую информацию (расширение имени — SMM). Формат обоих
файлов достаточно прост. Они представляют собой обычный текстовый файл, в
котором как редактируемый текст, так и команды управления присутствуют в виде
обычных текстовых строк.
Документу можно
поставить в соответствие какой-либо макрос из SMM-файла (команда
AssignMacroToFile). Этот макрос является аналогом AutoOpen и AutoClose в MS
Word и вызывается редактором AmiPro при открытии или закрытии файла.
Видимо, в AmiPro
отсутствует возможность помещать макросы в общую область, поэтому вирусы для
AmiPro могут заразить систему только при открытии зараженного файла, но не при
загрузке системы, как это происходит с MS Word после заражения файла
NORMAL.DOT.
Как и MS Word, AmiPro
позволяет переопределять системные макросы (например, SaveAs, Save) командой
ChangeMenuAction. При вызове переопределенных функций (команд меню) управление
получают зараженные макросы, т. е. код вируса.
Сетевые вирусы
К сетевым относятся
вирусы, которые для своего распространения активно используют протоколы и
возможности локальных и глобальных сетей. Основным принципом работы сетевого
вируса является возможность самостоятельно передать свой код на удаленный
сервер или рабочую станцию. "Полноценные" сетевые вирусы при этом
обладают еще и возможностью запустить на выполнение свой код на удаленном
компьютере или, по крайней мере, "подтолкнуть" пользователя к запуску
зараженного файла.
Бытует ошибочное
мнение, что сетевым является любой вирус, распространяющийся в компьютерной
сети. Но в таком случае практически все вирусы были бы сетевыми, даже наиболее
примитивные из них: ведь самый обычный нерезидентный вирус при заражении файлов
не разбирается, сетевой (удаленный) это диск или локальный. В результате такой
вирус способен заражать файлы в пределах сети, но отнести его к сетевым никак
нельзя.
Наибольшую известность
приобрели сетевые вирусы конца 80-х, их также называют сетевыми червями
(worms). К ним относятся вирус Морриса, вирусы Cristmas Tree и Wank Worm. Для
своего распространения они использовали ошибки и недокументированные функции
глобальных сетей того времени. Вирусы передавали свои копии с сервера на сервер
и запускали их на выполнение. Эпидемия вируса Морриса захватила в свое время
несколько глобальных сетей в США
Сетевые вирусы прошлого
распространялись в компьютерной сети и, как правило, так же как и
компаньон-вирусы, не изменяли файлы или сектора на дисках. Они проникали в
память компьютера из компьютерной сети, вычисляли сетевые адреса других
компьютеров и рассылали по этим адресам свои копии. Эти вирусы иногда также
создавали рабочие файлы на дисках системы, но могли вообще не обращаться к ресурсам
компьютера (за исключением оперативной памяти).
После нескольких
эпидемий сетевых вирусов ошибки в сетевых протоколах и программном обеспечении
были исправлены, а "задние двери" закрыты. В результате за последние десять
лет не было зафиксировано ни одного случая заражения сетевым вирусом и не
появилось ни одного нового сетевого вируса.
Вновь проблема сетевых
вирусов возникла лишь в начале 1997
г. с появлением вирусов Macro.Word.ShareFun и Win.Homer.
Первый из них использует возможности электронной почты Microsoft Mail. Он
создает новое письмо, содержащее зараженный файл-документ (ShareFun является
макровирусом), затем выбирает из списка адресов MS-Mail три случайных адреса и
рассылает по ним зараженное письмо. Поскольку многие пользователи устанавливают
параметры MS-Mail таким образом, что при получении письма автоматически
запускается MS Word, то вирус "автоматически" внедряется в компьютер
адресата зараженного письма.
Этот вирус иллюстрирует
первый тип современных сетевых вирусов, которые объединяют возможности
встроенного в Word и Excel языка Бейсик, протоколы и особенности электронной
почты и функции автозапуска, необходимые для распространения вируса.
Второй вирус (Homer)
использует для распространения протокол FTP (File Transfer Protocol) и передает
свою копию на удаленный ftp-сервер в каталог Incoming. Поскольку сетевой
протокол FTP не позволяет запускать файлы на удаленном сервере, этот вирус
можно охарактеризовать как полусетевой, однако это реальный пример возможностей
вирусов по использованию современных сетевых протоколов и поражению глобальных
сетей.
Конечно же возможны и
другие способы проникновения вирусов в современные сети, однако мне не хотелось
бы излагать их здесь, поскольку это подтолкнет вирусописателей на реализацию
этих идей.
Прочие вредные
программы
К вредным программам
помимо вирусов относятся также "троянские кони" (логические бомбы),
intended-вирусы, конструкторы вирусов и полиморфик-генераторы.
"Троянские
кони" (логические бомбы)
"Троянский
конь" — это программа, наносящая какие-либо разрушительные действия, т. е.
в зависимости от определенных условий или при каждом запуске уничтожающая
информацию на дисках, "приводящая" систему (к зависанию) и т. п.
Большинство известных
мне "троянских коней" подделываются под какие-либо полезные
программы, новые версии популярных утилит или дополнения к ним. Очень часто они
рассылаются по BBS-станциям или электронным конференциям. По сравнению с
вирусами "троянские кони" не получают широкого распространения по
достаточно простым причинам: они либо уничтожают себя вместе с остальными
данными на диске, либо демаскируют свое присутствие и уничтожаются пострадавшим
пользователем.
К "троянским
коням" также можно отнести "дропперы" вирусов — зараженные файлы,
код которых подправлен таким образом, что известные версии антивирусов не
определяют вируса в файле. Например, файл шифруется каким-либо специальным
образом или упаковывается редко используемым архиватором, что не позволяет
антивирусу "увидеть" заражение.
Следует отметить также
"злые шутки" (hoax). К ним относятся программы, которые не причиняют
компьютеру какого-либо прямого вреда, однако выводят сообщения о том, что такой
вред уже причинен, либо будет причинен при каких-либо условиях, либо предупреждают
пользователя о несуществующей опасности. К "злым шуткам" относятся,
например, программы, которые "пугают" пользователя сообщениями о
форматировании диска (хотя никакого форматирования на самом деле не
происходит), определяют вирусы в незараженных файлах (как это делает широко
известная программа ANTITIME), выводят странные вирусоподобные сообщения
(драйвер диска CMD640X от какого-то коммерческого пакета) и т. д. — варианты
зависят от чувства юмора автора такой программы. Видимо, к "злым шуткам"
относится также строка CHOLEEPA во втором секторе винчестеров фирмы Seagate. К
этой же категории шуток можно отнести заведомо ложные сообщения о новых
супервирусах. Такие сообщения периодически появляются в электронных
конференциях и обычно вызывают среди пользователей панику.
Intended-вирусы
К таким вирусам
относятся программы, которые на первый взгляд являются стопроцентными вирусами,
но не способны размножаться по причине ошибок. Например, вирус, который при
заражении "забывает" поместить в начало файлов команду передачи
управления на код вируса, либо записывает в нее неверный адрес своего кода,
либо неправильно устанавливает адрес перехватываемого прерывания (что в
подавляющем большинстве случаев завешивает компьютер) и т. д.
К категории
intended-вирусов также относятся вирусы, которые по приведенным выше причинам
размножаются только один раз из "авторской" копии. Заразив какой-либо
файл, они теряют способность к дальнейшему размножению.
Появляются
intended-вирусы чаще всего при неумелой перекомпиляции уже существующего вируса
либо по причине недостаточного знания языка программирования, либо из-за
незнания технических тонкостей ОС.
Конструкторы вирусов
Конструктор вирусов —
это утилита, предназначенная для изготовления новых компьютерных вирусов.
Известны конструкторы вирусов для DOS, Windows и макровирусов. Они позволяют
генерировать исходные тексты вирусов (ASM-файлы), объектные модули и/или
непосредственно зараженные файлы.
Некоторые конструкторы
(VLC, NRLG) снабжены стандартным оконным интерфейсом, позволяющим при помощи
системы меню выбрать тип вируса, поражаемые объекты (СОМ и/или ЕХЕ), наличие
или отсутствие самошифровки, противодействие отладчику, внутренние текстовые
строки, выбрать эффекты, сопровождающие работу вируса, и т. п. Прочие
конструкторы (PS-MPC, G2) не имеют интерфейса и считывают информацию о типе
вируса из конфигурационного файла.
Полиморфные
генераторы
Полиморфик-генераторы,
как и конструкторы вирусов, не являются вирусами в прямом смысле этого слова,
поскольку в их алгоритм не закладываются функции размножения, т. е. открытия,
закрытия и записи в файлы, чтения и записи секторов и т. д. Главной функцией
подобного рода программ является шифрование тела вируса и генерация
соответствующего расшифровщика.
Обычно полиморфные
генераторы распространяются их авторами без ограничений в виде файла-архива.
Основным файлом в архиве любого генератора является объектный модуль,
содержащий этот генератор. Во всех встречавшихся генераторах этот модуль
содержит внешнюю (external) функцию — вызов программы генератора. То есть
автору вируса, если он желает создать настоящий полиморфик-вирус, не приходится
корпеть над кодами собственного за/расшифровщика. При желании он может
подключить к своему вирусу любой известный полиморфик-генератор и вызывать его
из кодов вируса. Физически это достигается следующим образом: объектный файл
вируса связывается с объектным файлом генератора, а в исходный текст вируса
перед командами его записи в файл вставляется вызов полиморфик-генератора,
который создает коды расшифровщика и шифрует тело вируса.
Резидентные вирусы
Под термином
"резидентность" (005'овский термин TSR — Terminate and Stay Resident)
понимается способность вирусов оставлять свои копии в операционной системе,
перехватывать некоторые события (например, обращения к файлам или дискам) и
вызывать при этом процедуры заражения обнаруженных объектов (файлов и
секторов). Таким образом, резидентные вирусы активны не только в момент работы
зараженной программы, но и после того, как программа закончила свою работу. Резидентные
копии таких вирусов остаются жизнеспособными вплоть до очередной перезагрузки,
даже если на диске уничтожены все зараженные файлы. Часто от таких вирусов
невозможно избавиться восстановлением всех копий файлов с дистрибутивных дисков
или backup-копий. Резидентная копия вируса остается активной и заражает вновь
создаваемые файлы. То же верно и для загрузочных вирусов, форматирование диска
при наличии в памяти резидентного вируса не всегда вылечивает диск, поскольку
многие резидентные вирусы заражают его повторно после того, как он
отформатирован.
Нерезидентные вирусы,
напротив, активны довольно непродолжительное время — только в момент запуска
зараженной программы. Для своего распространения они ищут на диске незараженные
файлы и записываются в них. После того как код вируса передает управление
программе-носителю, влияние вируса на работу ОС сводится к нулю вплоть до
очередного запуска какой-либо зараженной программы. Поэтому файлы, зараженные
нерезидентными вирусами, значительно проще удалить с диска, при этом вирус не
заразит их повторно.
DOS-вирусы
DOS предусматривает два
легальных способа создания резидентных модулей:
драйверами,
указываемыми в CONFIG.SYS, и при помощи функции KEEP (INT 21h, AH=31h или INT
27h). Многие файловые вирусы для маскировки своего распространения используют
другой способ — обработку системных областей, управляющих распределением памяти
(МСВ). Они выделяют для себя свободный участок памяти (включая UMB), помечают
его как занятый и переписывают туда свою копию. Некоторые вирусы внедряют свои
TSR-KO-пии в свободные участки памяти в таблице векторов прерываний, в
видеопамять, в рабочие области DOS, в память, отведенную под системные буферы и
в НМА-память. Подробнее эти способы описаны в разделе 3.9 "Обнаружение
резидентного вируса".
После выделения блока
памяти вирус копирует в него своей код и переопределяет одно или несколько
прерываний, необходимых ему для поиска заражаемых файлов, выполнения
деструктивных действий или звуковых и видеоэффектов.
При инфицировании
файлов нерезидентные и некоторые резидентные вирусы ищут на диске (дисках) эти
файлы при помощи функций DOS FindFirst и FindNext (INT 21h,
AH=llh,12h,4Eh,4Fh). Резидентные вирусы используют более широкий список функций
DOS, при обращении к которым происходит заражение файла. Фактически в этом
списке присутствуют все функции, по значениям входных или выходных параметров
которых можно определить имя файла, к которому идет обращение (к таким
параметрам относятся значения соответствующих регистров или областей памяти). В
результате к "вирусоопасным" функциям прерывания 21h относятся
функции выполнения (ЕХЕС, АХ=4ВОО), загрузки в память (AH=4Bh), поиска
(FindFirst и FindNext, AH-llh.^MEMFh), создания (Create, АН-ЗСЬ), открытия
(Open, AH=3Dh), закрытия (Close, AH=3Eh), изменения атрибутов (ChMode, AH=43h),
переименования (Rename, AH=56h) и некоторые другие функции работы с файлами.
Известно несколько
способов проверки резидентным вирусом наличия своей копии в памяти компьютера.
Первый заключается в том, что вирус вводит новую функцию некоторого прерывания,
действие которой заключается в возврате значения "я здесь". При
старте вирус обращается к ней, и если возвращенное значение совпадает со
значением "я здесь", значит, память компьютера уже заражена и
повторное заражение не проводится. При проверке вторым способом вирус
записывает значение "я здесь" в какую-либо редко используемую область
памяти — в таблицу векторов прерываний или в область данных BIOS (0040:00??).
При последующих стартах зараженных программ вирус проверяет это значение и не
вызывает процедуру заражения памяти. Существуют и другие способы, например,
есть вирусы, которые просто сканируют память компьютера.
Некоторые резидентные
файловые вирусы (как правило, вирусы, созданные при помощи конструкторов типа
VCL и PS-MPC) определяют свою TSR-копию некорректно и копируют себя в
оперативную память при каждом запуске зараженного файла. Естественно, что в
этом случае компьютер либо сразу зависает, либо через какое-то время перестает
выполнять программы из-за нехватки свободной памяти.
Загрузочные вирусы
Подавляющее большинство
резидентных загрузочных вирусов для выделения системной памяти для своей
резидентной копии использует один и тот же прием: они уменьшают объем DOS-памяти
(слово по адресу 0040:0013) и копируют свой код в "отрезанный" блок
памяти. Объем DOS-памяти обычно уменьшается на единицу (1 Кб) в случае коротких
загрузочных вирусов, код которых занимает один сектор дискового пространства
(512 байт). Вторая половина килобайта используется такими вирусами, как буфер
чтения-записи при заражении дисков. Если же размер вируса больше 1 Кб, он
использует нестандартные методы заражения, требующие большего объема буфера
чтения-записи. Соответственно объем памяти уменьшается на несколько килобайтов
(среди известных вирусов максимальное значение у вируса RDA.Fighter - 30 Кб).
В дальнейшем некоторые
вирусы "ждут" загрузки DOS и восстанавливают первоначальное значение
объема системной памяти. В результате они оказываются расположенными не за
пределами DOS, а как отдельный блок DOS-памяти. Некоторые загрузочные вирусы
вообще не используют и не изменяют значение объема системной памяти. Они
копируют себя в какую-либо область памяти, не используемую вплоть до загрузки
DOS, ждут загрузки DOS и затем инсталлируют свой код в системе всеми возможными
в DOS способами.
Эти вирусы используют
несколько способов перехвата момента загрузки DOS. Наиболее популярный способ —
проверка значения INT 21h (прерывание DOS-функций). Если это значение
изменилось, вирусы считают, что инсталляция DOS завершена. Проверка значения
INT 21h проводится при вызовах INT 8, ICh (для этого вирусы помимо прерываний
обращения к дискам перехватывают также прерывания таймера) или при вызовах INT
13h. Менее популярный способ — проверка данных, считываемых с диска (для этого
требуется только перехват INT 13h). Если буфер чтения содержит заголовок
ЕХЕ-файла, вирусы считают, что загрузка DOS завершена, поскольку в память для
выполнения загружается ЕХЕ-файл.
Для того чтобы
перехватить обращения к дискам, большинство загрузочных вирусов перехватывают
INT 13h — основное прерывание для работы с дисками. Реже используется перехват
INT 40h — прерывание для работы с гибкими дисками. Еще реже используются
различные экзотические способы перехвата прерываний BIOS и DOS, возникающих при
работе с дискетами.
В случае перехвата INT
13h/40h вирусы обрабатывают команды чтения-записи секторов (АН=2,3), проверяют
диск на зараженность и записывают в его загрузочный сектор или в MBR винчестера
свой код. Реже перехватываются другие команды — от команды Reset Disk (AH=0)
вплоть до команд "длинного" чтения-записи (AH=OAh,OBh).
Большая часть
загрузочных вирусов не проверяет системную память на наличие своей уже
установленной TSR-копии: они либо используют "стелс"-приемы, при
которых повторный запуск кода вируса невозможен, либо ориентируются на то, что
код вируса загружается однократно в момент загрузки DOS, после этого коды
загрузочных секторов дисков больше не выполняются ни при каких условиях. Часть
вирусов проверяет наличие своей копии. Для этого используются либо специальные
вызовы INT 13h с каким-нибудь нестандартным значением, либо помечается заведомо
неиспользуемый байт (или слово) в таблице векторов прерываний или в области
данных BIOS (0040:00??). Существуют и другие способы обнаружения своей
TSR-копии.
Windows-вирусы
Для того чтобы
оставить выполняемый код в памяти Windows, существуют три способа, которые (за
исключением Windows NT) уже применялись различными вирусами.
Самый простой
способ — зарегистрировать программу как одно из приложений, работающих в данный
момент. Для этого программа регистрирует свою задачу, окно которой может быть
свернутым, регистрирует свой обработчик системных событий и т. д. Второй способ
— выделить блок системной памяти при помощи DPMI-вызовов и скопировать в нем
свой код (вирус Ph33r). Третий способ — остаться резидентно как VxD-драйвер
(Wnidows З.хх и Windows95) или как драйвер Windows NT.
Перехват
обращений к файлам производится одним из двух способов: либо перехватываются
вызовы INT 21h (Hook_V86_Int_Chain,Get/Set_V86_Int_Vector,
Get/Set_PM_Int_Vector), либо перехватывается системный вызов API. Затем
резидентные Windows-вирусы действуют примерно так же, как и DOS-вирусы:
перехватывают обращения к файлам и заражают их.
Для обнаружения
уже имеющейся в памяти резидентной копии используются примерно те же способы,
что описаны выше, за исключением VxD-вирусов. Известные VxD-вирусы загружаются
в память при загрузке Windows. Для этого они записывают команду запуска в файл
конфигурации Windows SYSTEM. INI. Если в этом файле уже есть команда запуска
вирусного VxD-файла, то вирус не производит повторной регистрации своего
VxD-файла.
Макровирусы
Большинство
макровирусов можно считать резидентными, поскольку они присутствуют в области
системных макросов в течение всего времени работы редактора. Они, так же как
резидентные, загрузочные и файловые вирусы, перехватывают системные события и
используют их для своего размножения. К подобным событиям относятся различные
системные вызовы, возникающие при работе с документами Word и таблицами Excel
(открытие, закрытие, создание, печать и т. д.), вызов пункта меню, нажатие на
какую-либо клавишу или достижение определенного момента времени. Для перехвата
событий макровирусы переопределяют один или несколько системных - макросов или
функций.
При заражении
некоторые макровирусы проверяют наличие своей копии в заражаемом объекте и
повторно себя не копируют. Другие макровирусы не делают этого и переписывают
свой код
при каждом
заражении. Если при этом в заражаемом файле или области системных макросов уже
определен макрос, имя которого совпадает с макросом вируса, то такой макрос
оказывается уничтоженным.
"Стелс"-вирусы
"Стелс"-вирусы
теми или иными способами скрывают факт своего присутствия в системе. Известны
"стелс"-вирусы всех типов за исключением Windows-вирусов —
загрузочные вирусы, файловые DOS-вирусы и даже макровирусы. Появление
"стелс"-вирусов, заражающих файлы Windows, скорее всего дело времени.
Загрузочные
вирусы
Загрузочные "стелс"-вирусы
для скрытия своего кода используют два основных способа. Первый из них
заключается в том, что вирус перехватывает команды чтения зараженного сектора
(INT 13h) и подставляет вместо него незараженный оригинал. Этот способ делает
вирус невидимым для любой DOS-программы, включая антивирусы, неспособные
"лечить" оперативную память компьютера. Возможен перехват команд
чтения секторов на уровне более низком, чем INT 13h.
Второй способ
направлен против антивирусов, поддерживающих команды прямого чтения секторов
через порты контроллера диска. Такие вирусы при запуске любой программы
(включая антивирус) восстанавливают зараженные сектора, а после окончания ее
работы снова заражают диск. Поскольку для этого вирусу приходится перехватывать
запуск и окончание работы программ, то он должен перехватывать также
DOS-прерывание INT 21h.
С некоторыми
оговорками "стелс"-вирусами можно назвать вирусы, которые вносят
минимальные изменения в заражаемый сектор (например, при заражении MBR правят
только активный адрес загрузочного сектора — изменению подлежат только 3 байт)
либо маскируются под код стандартного загрузчика.
Файловые
вирусы
Большинство
файловых "стелс"-вирусов использует те же приемы, что приведены выше:
они либо перехватывают DOS-вызовы обращения к файлам (INT 21h), либо временно
лечат файл при его открытии и заражают при закрытии. Так же как и для
загрузочных вирусов, существуют файловые вирусы, использующие для своих
"стелс"-функций перехват прерываний более низкого уровня — вызовы
драйверов DOS, INT 25h и даже INT 13h.
Полноценные
файловые "стелс"-вирусы, использующие первый способ скрытия своего
кода, в большинстве своем достаточно громоздки, поскольку им приходится
перехватывать большое количество DOS-функций работы с файлами:
открытие-закрытие, чтение-запись, поиск, запуск, переименование и т. д., причем
необходимо поддерживать оба варианта некоторых вызовов (FCB/ASCII), а с
появлением Windows 95/NT необходимо также обрабатывать третий вариант — функции
работы с длинными именами файлов.
Некоторые вирусы
используют часть функций полноценного "стелс"-ви-руса. Чаще всего они
перехватывают функции DOS FindFirst и FindNext (INT 21h, AH=llh, 12h, 4Eh, 4Fh)
и уменьшают размер зараженных файлов. Такой вирус невозможно определить по
изменению размеров файлов, если, конечно, он резидентно находится в памяти.
Программы, которые не обращаются к указанным функциям DOS (например,
Norton'oBCKHe утилиты), а напрямую используют содержимое секторов, хранящих
каталог, показывают правильную длину зараженных файлов.
Макровирусы
Реализация
"стеле"-алгоритмов в макровирусах является, наверное, наиболее
простой задачей — достаточно всего лишь запретить вызов меню File/Templates
или Tools/Macro. Достигается это либо удалением этих
пунктов меню из списка, либо их подменой на макросы FileTemplates и ToolsMacro.
Частично
"стелс"-вирусами можно назвать небольшую группу макровирусов, которые
хранят свой основной код не в самом макросе, а в других областях документа — в
его переменных или в Auto-text.
Полиморфик-вирусы
Полиморфик-вирусами
являются те, обнаружение которых невозможно (или крайне затруднительно)
осуществить при помощи так называемых вирусных масок — участков постоянного
кода, специфичных для конкретного вируса. Достигается это двумя основными
способами — шифрованием основного кода вируса с непостоянным ключом и случайным
набором команд расшифровщика или изменением самого выполняемого кода вируса.
Существуют также другие, достаточно экзотические примеры полиморфизма —
DOS-вирус Bomber, например, не зашифрован, однако последовательность команд,
которая передает управление коду вируса, является полностью полиморфной.
Полиморфизм
различной степени сложности встречается в вирусах всех типов — от загрузочных и
файловых DOS-вирусов до Windows-вирусов и даже макровирусов.
Полиморфные
расшифровщики
Простейшим
примером частично полиморфного расшифровщика является следующий набор команд, в
результате применения которого ни один байт кода самого вируса и его
расшифровщика не является постоянным при заражении различных файлов:
MOV гед_1, count
;гед_1, гед_2, гед_3 выбираются из
MOV гед_2, key
; AX,BX,CX,DX,SI,DI,ВР
MOV гед_3,
_offset ;count, key, _offset также
могут меняться
„LOOP:
ххх byte
ptr [гед_3], гед_2 ;хог, add или sub
DEC гед_1
Jxx „loop ;ja или jnc
;дальше следуют
зашифрованные код и данные вируса
Более сложные
полиморфик-вирусы используют значительно более сложные алгоритмы для генерации
кода своих расшифровщиков: приведенные выше инструкции (или их эквиваленты)
переставляются местами от заражения к заражению, разбавляются ничего не
меняющими командами типа NOP, STI, CLI, STC, CLC, DEC неиспользуемый регистр,
XCHG неиспользуемые регистры и т. д.
Полноценные же
полиморфик-вирусы используют очень сложные алгоритмы, в результате работы
которых в расшифровщике вируса могут встретиться операции SUB, ADD, XOR, ROR,
ROL и другие в произвольном количестве и порядке. Загрузка и изменение ключей и
других параметров шифровки производится также произвольным набором операций, в
котором могут встретиться практически все инструкции процессора Intel (ADD,
SUB, TEST, XOR, OR, SHR, SHL, ROR, MOV, XCHG.JNZ, PUSH, POP...) со всеми
возможными режимами адресации. Появляются также полиморфик-вирусы, расшифровщик
которых использует инструкции вплоть до Intel386, а летом 1997 г. обнаружен
32-разрядный полиморфик-вирус, заражающий ЕХЕ-файлы Windows 95.
В результате в
начале файла, зараженного подобным вирусом, идет набор бессмысленных на первый
взгляд инструкций, причем некоторые комбинации, которые вполне работоспособны,
не берутся фирменными дизассембле-рами (например, сочетание CS:CS: или CS:NOP).
И среди этой "каши" из команд и данных изредка проскальзывают MOV,
XOR, LOOP,JMP — инструкции, которые действительно являются
"рабочими".
Уровни
полиморфизма
Существует
деление полиморфик-вирусов на уровни в зависимости от сложности кода, который
встречается в расшифровщиках этих вирусов. Такое деление впервые предложил д-р.
Алан Соломон, через некоторое время Вессе-лин Бончев расширил его.
Уровень 1. Вирусы, которые имеют некоторый набор
расшифровщиков с постоянным кодом и при заражении выбирают один из них. Такие
вирусы являются полуполиморфиками и носят также название олигоморфик
(oligomorphic).
Примеры:
Cheeba, Slovakia, Whale.
Уровень 2. Расшифровщик вируса содержит одну или
несколько постоянных инструкций, основная же его часть непостоянна.
Уровень 3. Расшифровщик содержит неиспользуемые
инструкции — мусор типа NOP, CLI, STI и т. д.
Уровень 4. В расшифровщике используются
взаимозаменяемые инструкции и изменение порядка следования (перемешивание)
инструкций. Алгоритм расшифровки при этом не изменяется.
Уровень 5. Используются все перечисленные выше
приемы, алгоритм расшифровки непостоянен, возможно повторное шифрование кода
вируса и даже частичное шифрование самого кода расшифровщика.
Уровень 6. Permutating-вирусы. Изменению подлежит
основной код вируса — делится на блоки, которые при заражении переставляются в
произвольном порядке. Вирус при этом остается работоспособным. Подобные вирусы
могут быть не зашифрованы.
Приведенное выше
деление не свободно от недостатков, поскольку производится по единственному
критерию — возможности обнаруживать вирус по коду расшифровщика при помощи
стандартного приема вирусных масок:
Уровень 1. Для обнаружения вируса достаточно иметь
несколько масок.
Уровень 2. Обнаружение по маске с использованием
wildcards.
Уровень 3. Обнаружение по маске после удаления
инструкций-"мусора".
Уровень 4. Маска содержит несколько вариантов
возможного кода, т. е. становится алгоритмической.
Уровень 5. Невозможность детектирования вируса по
маске.
Недостаточность
такого деления продемонстрирована в вирусе 3-го уровня полиморфичности, который
так и называется — Level3. Этот вирус, являясь одним из наиболее сложных
полиморфик-вирусов, по приведенному выше делению попадает в уровень 3,
поскольку имеет постоянный алгоритм расшифровки, перед которым стоит большое
количество команд-"мусора". Однако в этом вирусе алгоритм
генерирования "мусора" доведен до совершенства: в коде расшифровщика
могут встретиться практически все инструкции процессора i8086.
Если произвести
деление на уровни с точки зрения антивирусов, использующих системы
автоматического расшифрования кода вируса (эмуляторы), то деление на уровни
будет зависеть от сложности эмуляции кода вируса. Возможно определение вируса и
другими приемами, например расшифрова-ние при помощи элементарных
математических законов и т. д. Поэтому мне кажется более объективным деление, в
котором помимо критерия вирусных масок участвуют и другие параметры:
1. Степень
сложности полиморфик-кода (процент от всех инструкций процессора, которые могут
встретиться в коде расшифровщика).
2. Использование
антиэмуляторных приемов.
3. Постоянство
алгоритма расшифровщика.
4. Постоянство
длины расшифровщика.
Мне не хотелось
бы излагать эти пункты подробнее, поскольку это может подтолкнуть
вирусописателей к созданию подобных монстров.
Изменение
выполняемого кода
Наиболее часто
этот способ полиморфизма используется макровирусами, которые при создании своих
новых копий случайным образом меняют имена собственных переменных, вставляют
пустые строки или меняют свой код каким-либо иным способом. Таким образом
алгоритм работы вируса остается без изменений, но код вируса практически
полностью меняется от заражения к заражению.
Реже этот способ
применяется сложными загрузочными вирусами. Такие вирусы внедряют в загрузочные
сектора лишь достаточно короткую процедуру, которая считывает с диска основной
код вируса и передает на него управление. Код этой процедуры выбирается из
нескольких различных вариантов (которые также могут быть разбавлены
"пустыми" командами), команды переставляются между собой и т. д.
Еще реже этот прием встречается у файловых вирусов,
ведь им приходится полностью менять свой код, а для этого требуются достаточно
сложные алгоритмы. На сегодняшний день известны всего два таких вируса, один из
которых (Ply) случайным образом перемещает свои команды по своему телу и
заменяет их на команды JMP или CALL. Другой вирус (ТМС) использует более
сложный способ — каждый раз при заражении он меняет местами блоки своего кода и
данных, вставляет "мусор", в своих ассемблерных инструкциях
устанавливает новые значения адресов данных, меняет константы и т. д. В
результате вирус и не шифрует свой код, он является полиморфик-вирусом, так как
в его коде нет постоянного набора команд. Более того, при создании своих новых
копий вирус меняет свою длину.
Источник: i-net |