Антивирусные "движки"

Введение


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

Данная статья подробно описывает стандартные технологии и некоторые оригинальные подходы различных антивирусных разработчиков, реализованные в антивирусном "движке". Попутно будут рассмотрены некоторые смежные технические вопросы, необходимые для оценки качества антивирусного "движка" и уточнения используемых в нем технологий.

Хороший или плохой "движок"?


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

Качество детектирования. Насколько хорошо антивирус определяет вирусы. Этот критерий можно оценить по результатам различных тестов, которые проводятся несколькими организациями и обычно представлены на web-ресурсах разработчика.

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

Уровень ложных срабатываний. Если на 100% незараженных файлах антивирус рапортует об обнаружении возможно зараженного файла, то это - ложное срабатывание. Стоит ли доверять такому эвристическому анализатору, который беспокоит пользователя ложными тревогами? Ведь за большим количеством ложных срабатываний пользователь может пропустить действительно новый вирус.

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

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

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


Антивирусный "движок": существующие технологии


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

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

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

Поиск по "сигнатурам" (уникальной последовательности байт);
Поиск по контрольным суммам или CRC (контрольной суммы с уникальной последовательности байт);
Использование редуцированной маски;
Криптоанализ;
Статистический анализ;
Эвристический анализ;
Эмуляция.

Рассмотрим каждый из этих методов подробнее.

Поиск по "сигнатурам"

Сигнатура - это уникальная "строка" байт, которая однозначно характеризует ту или иную вредоносную программу. Сигнатурный поиск, в той или иной модификации, используется для обнаружения вирусов и других вредоносных программ, начиная с самых первых антивирусных программ и до сих пор. Неоспоримое достоинство сигнатурного поиска - скорость работы (при использовании специально разработанных алгоритмов, разумеется) и возможности детектирования нескольких вирусов одной сигнатурой. Недостаток - размер сигнатуры для уверенного детектирования должен быть довольно большой, как минимум 8-12 байт (обычно для точного детектирования используются гораздо более длинные сигнатуры, до 64 байт), следовательно, размер антивирусной базы будет достаточно большой. Кроме этого, в последнее время большую распространенность получили вредоносные программы, написанные на языках высокого уровня (C++, Delphi, Visual Basic), а у таких программ есть отдельные части кода, которые практически не изменяются (так называемая Run Time Library). Неправильно выбранная сигнатура неизбежно приведет к ложному срабатыванию - детектированию "чистого", не зараженного файла как зараженного вирусом. Как решение этой проблемы предлагается использовать или очень большие сигнатуры или использовать детектирование по некоторым областям данных, например, таблицы перемещений (relocation table) или текстовые строки, что не всегда хорошо.

Поиск по контрольным суммам (CRC)

Поиск по контрольным суммам (CRC - cyclic redundancy check), по сути, является модификацией поиска по сигнатурам. Метод был разработан для избежания основных недостатков сигнатурного поиска - размера базы и уменьшения вероятности ложных срабатываний. Суть метода состоит в том, что для поиска вредоносного кода берется не только "опорная" строка - сигнатура, а, вернее сказать, контрольная сумма этой строки, но и местоположение сигнатуры в теле вредоносной программы. Местоположение используется для того, чтобы не подсчитывать контрольные суммы для всего файла. Таким образом, вместо 10-12 байт сигнатуры (минимально) используется 4 байта для хранения контрольной суммы и еще 4 байта - для местоположения. Однако метод поиска по контрольным суммам несколько медленнее, чем поиск по сигнатурам.
Использование масок для обнаружения вредоносного кода довольно часто бывает осложнено наличием шифрованного кода (так называемые полиморфные вирусы), поскольку при этом либо невозможно выбрать маску, либо маска максимального размера не удовлетворяет условию однозначной идентификации вируса без ложных срабатываний.
Невозможность выбора маски достаточного размера в случае полиморфного вируса легко объясняется. Путем шифрования своего тела вирус добивается того, что большая часть его кода в пораженном объекте является переменной, и, соответственно, не может быть выбрана в качестве маски. (Подробнее самошифрующиеся и полиморфные вирусы описаны в приложении в конце статьи).
Для детектирования таких вирусов применяются следующие методы: использование редуцированной маски, криптоанализ и статистический анализ. Рассмотрим эти методы подробнее.

Использование редуцированной маски

При поражении объектов вирус, использующий шифрование, преобразует свой код в шифрованную последовательность данных:
S = F (T), где
T - базовый код вируса;
S - зашифрованные коды вируса;
F - функция шифрования вируса, произвольно выбирающаяся из некоторого множества преобразований {F}.
Способ редуцированной маски заключается в том, что выбирается преобразование R зашифрованных кодов вируса S, такое, что результат преобразования (то есть некоторая последовательность данных S') не будет зависеть от ключей преобразования F, то есть
S = F (T)
S' = R (S) = R (F (T)) = R' (T).
При применении преобразования R к всевозможным вариантам шифрованного кода S результат S' будет постоянным при постоянном T. Таким образом, идентификация пораженных объектов производится путем выбора S' в качестве редуцированной маски и применения к пораженным объектам преобразования R.

Криптоанализ

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

Статистический анализ

Также используется для детектирования полиморфных вирусов. Во время своей работы сканер анализирует частоту использования команд процессора, строит таблицу встречающихся команд процессора (опкодов), и на основе этой информации делает вывод о заражении файла вирусом. Данный метод эффективен для поиска некоторых полиморфных вирусов, так как эти вирусы используют ограниченный набор команд в декрипторе, тогда как "чистые" файлы используют совершенно другие команды с другой частотой. Например, все программы для MS-DOS часто используют прерывание 21h (опкод CDh 21h), однако в декрипторе полиморфных DOS-вирусов эта команда практически не встречается.
Основной недостаток этого метода в том, что есть ряд сложных полиморфных вирусов, которые используют почти все команды процессора и от копии к копии набор используемых команд сильно изменяется, то есть по построенной таблице частот не представляется возможным обнаружить вирус.

Эвристический анализ

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

Статический метод. Поиск общих коротких сигнатур, которые присутствуют в большинстве вирусов (так называемые "подозрительные" команды). Например, большое количество вирусов производит поиск вирусов по маске *.EXE, открывает найденный файл, производит запись в открытый файл. Задача эвристик в этом случае - найти сигнатуры, отражающие эти действия. Затем происходит анализ найденных сигнатур, и, если найдено некоторое количество необходимых и достаточных "подозрительных команд", то принимается решение о том, что файл инфицирован. Большой плюс этого метода - простота реализации и хорошая скорость работы, но при этом уровень обнаружения новых вредоносных программ довольно низок.

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

Эмуляция

Технология эмуляции кода программ (или Sandboxing) явилась ответом на появление большого числа полиморфных вирусов. Идея этого метода состоит в том, чтобы эмулировать исполнение программы (как зараженной вирусом, так и "чистой") в специальном "окружении", называемым также буфером эмуляции или "песочницей". Если в эмулятор попадает зараженный полиморфным вирусом файл, то после эмуляции в буфере оказывается расшифрованное тело вируса, готовое к детектированию стандартными методами (сигнатурный или CRC поиск).
Современные эмуляторы эмулируют не только команды процессора, но и вызовы операционной системы. Задача написания полноценного эмулятора является довольно трудоемкой, не говоря уже о том, что при использовании эмулятора приходится постоянно контролировать действия каждой команды. Это необходимо для того, чтобы случайно не выполнить деструктивные компоненты алгоритма вируса.
Следует особо отметить, что приходится именно эмулировать работу инструкций вируса, а не трассировать их, поскольку при трассировке вируса слишком велика вероятность вызова деструктивных инструкций или кодов, отвечающих за распространение вируса.

База данных антивирусного "движка"

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

Поддержка "сложных", вложенных объектов

За последние несколько лет антивирусные "движки" сильно изменились. Если первым антивирусам для того, чтобы считаться первоклассной программой, было достаточно проверять системную память, исполняемые файлы и загрузочные сектора, то уже через несколько лет в связи с ростом популярности специальных утилит упаковки исполняемых модулей перед разработчиками возникла задача распаковать упакованный файл перед тем, как его сканировать.
Затем новая проблема - вирусы научились заражать архивные файлы (да и сами пользователи зачастую пересылали зараженные файлы в архивах). Антивирусы были вынуждены научиться обрабатывать и архивные файлы. В 1995 году появился первый макровирус, заражающий документы Microsoft Word. Стоит заметить, что формат документов, используемый Microsoft Word, закрытый, и очень сложен. Ряд антивирусных компаний до сих пор не умеют полноценно обрабатывать такие файлы.
Сегодня, в связи с огромной популярностью электронной почты, антивирусные "движки" также обрабатывают и базы почтовых сообщений и сами сообщения.

Методы детектирования

В типичном антивирусном "движке", который реализован в каждой антивирусной программе, используются все необходимые технологии для обнаружения вредоносных программ: эффективный эвристический анализатор, высокопроизводительный эмулятор и, что самое главное, грамотная и гибкая архитектура подсистемы детектирования вредоносных программ, позволяющая использовать все перечисленные выше методы детектирования.
Почти в каждом антивирусном "движке" базовым является метод детектирования по контрольным суммам. Этот метод был выбран исходя из требования минимизации размера антивирусных баз. Однако архитектура "движка" часто настолько гибка, что позволяет использовать любой из перечисленных выше методов детектирования, что и делается для некоторых особо сложных вирусов. Это позволяет добиться высокого уровня детектирования вирусов. Подробнее архитектура антивирусного "движка" представлена на схеме далее в тексте.
Практическое применение способов обнаружения полиморфных вирусов (криптоанализ и статистический анализ, применение редуцированной маски и эмуляция), сводится к выбору наиболее оптимального по быстродействию и объему требуемой памяти метода. Код большинства самошифрующихся вирусов довольно легко восстанавливается процедурой эмуляции. Если использование эмулятора не является оптимальным решением, то код вируса восстанавливается при помощи подпрограммы, реализующей обратное преобразование - криптоанализ. Для детектирования неподдающихся эмуляции вирусов, и вирусов, для которых не представляется возможным построить обратное преобразование, используется способ построения редуцированных масок.
В некоторых, наиболее сложных, случаях применяется комбинация приведенных выше способов. Часть кода расшифровщика эмулируется, при этом из расшифровщика выделяются команды, реально отвечающие за алгоритм расшифровки. Затем на основе полученной информации строится и решается система уравнений для восстановления кода вируса и его детектирования.
Комбинация способов применяется также при кратном применении шифрования, когда вирус шифрует свое тело несколько раз, используя при этом различные алгоритмы шифрования. Комбинированный способ восстановления информации или "чистая" эмуляция кода расшифровщика часто применяются и по той причине, что каждый новый вирус должен быть проанализирован и подключен в антивирусную базу за минимальные сроки, в которые далеко не всегда укладывается необходимый математический анализ. И в результате приходится пользоваться более громоздкими методами детектирования вируса, несмотря на то, что вполне применимы методы математического анализа алгоритма расшифровщика.

Работа со "сложными" объектами

Антивирусные "движки" поддерживают работу с огромным числом форматов упаковки и архивирования. Разработчики достаточно редко публикуют полный (или хотя бы достаточно подробный) перечень поддерживаемых форматов. Далее представлена официально опубликованная информация о поддержке "сложных" форматов в Антивирусе Касперского. В других антивирусных продуктах список поддерживаемых форматов должен быть примерно таким же.
"Движок" Антивируса Касперского поддерживает работу с более чем 400 различными утилитами упаковки исполняемых файлов, инсталляторов и архиваторов (всего более 900 модификаций, по состоянию на май 2003). Среди них:

Упаковщики исполняемых файлов и системы шифрования. Самые популярные из них: Diet, AVPACK, COMPACK, Epack, ExeLock, ExePack, Expert, HackStop, Jam, LzExe, LzCom, PaquetBuilder, PGMPAK, PkLite, PackWin, Pksmart, Protect, ProtEXE, RelPack, Rerp, Rjcrush, Rucc, Scramb, SCRNCH, Shrink, Six-2-Four, Syspack, Trap, UCEXE, Univac, UPD, UPX (несколько версий), WWPACK, ASPack (несколько версий), ASProtect (несколько версий), Astrum, BitArts, BJFnt, Cexe, Cheaters, Dialect, DXPack, Gleam, CodeSafe, ELFCrypt, JDPack, JDProtect, INFTool, Krypton, Neolite, ExeLock, NFO, NoodleCrypt, OptLink, PCPEC, PEBundle, PECompact (несколько версий), PCShrink, PE-Crypt, PE-Diminisher, PELock, PEncrypt, PE-Pack (несколько версий), PE-Protect, PE-Shield, Petite, Pex, PKLite32, SuperCede, TeLock, VBox, WWPack32, XLok, Yoda.
Поддержка стольких упаковщиков и архиваторов позволяет сократить время анализа новых вирусов, что приводит к увеличению скорости реакции на появление нового вируса, и добиться высокого уровня обнаружения уже известных вирусов.

Архиваторы и инсталляторы (всего более 60). Самые популярные из них: CAB, ARJ, ZIP, GZIP, Tar, AIN, HA, LHA, RAR, ACE, BZIP2, WiseSFX (несколько версий), CreateInstall, Inno Installer, StarDust Installer, MS Expand, GKWare Setup, SetupFactory, SetupSpecialist, NSIS, Astrum, PCInstall, Effect Office.
Поддержка большого числа разновидностей архиваторов особенно важно для проверки почтовых систем, так как подавляющая часть вирусов пересылается по почте в архивированном виде. Распаковка объектов происходит вне зависимости от уровня вложенности архивов. Например, если зараженный файл упакован утилитой UPX, а затем файл упакован в архив ZIP, который упакован в архив CAB и т.д., то антивирусный "движок" все равно должен быть в состоянии достать исходный файл и обнаружить вирус.
Следует отметить, что подобные рассуждения носят отнюдь не теоретический характер. Так, широко известна троянская программа Backdoor.Rbot, которая распространялась упакованной множеством различных программ (Ezip, Exe32Pack, ExeStealth, PecBundle, PECompact, FSG, UPX, Morphine, ASPack, Petite, PE-Pack, PE-Diminisher, PELock, PESpin, TeLock, Molebox, Yoda, Ezip, Krypton и др.).
Алгоритм распаковки архивов обычно обладает достаточным интеллектом, чтобы не распаковывать всевозможные "архивные бомбы" - архивы небольшого размера, в которые упакованы огромные файлы (с очень высокой степенью сжатия) или несколько одинаковых файлов. Обычно для проверки такого архива требуется много времени, но современные антивирусные "движки" часто распознают подобные "бомбы".

Механизм обновления антивирусных баз и их размер

Обновления антивирусных баз обычно выходят по несколько раз в день. Некоторые в состоянии выпускать обновления раз в час, некоторые - раз в два часа. В любом случае, при современном высоком уровне опасности в Интернет такое частое обновление антивирусных баз вполне оправдано.
Размер обновлений указывает на продуманность архитектуры антивирусного "движка". Так, размер регулярных обновлений лидирующих в отрасли компаний, как правило, не превышает 30 Кб. При этом в антивирусные базы обычно заложено около 70% функциональности всего антивирусного "движка". В любом обновлении антивирусной базы может быть добавлена поддержка нового упаковщика или архиватора. Таким образом, ежедневно обновляя антивирусные базы, пользователь получает не только новые процедуры детектирования новых вредоносных программ, но и обновление всего антивируса. Это позволяет очень гибко реагировать на ситуацию и гарантировать пользователю максимальную защиту.

Эвристический анализатор

В эвристическом анализаторе, входящем в состав почти каждого антивируса, используются оба описанные выше методы анализа - криптоанализ и статистический анализ. Современный эвристический анализатор изначально разрабатывается так, чтобы быть расширяемым (в отличие от большинства эвристических анализаторов первого поколения, которые разрабатывались для обнаружения вредоносных программ только в исполняемых модулях).
В настоящее время эвристический анализатор позволяет обнаруживать вредоносные коды в исполняемых файлах, секторах и памяти, а также новые скрипт-вирусы и вредоносные программы для Microsoft Office (и других программ, использующих VBA), и, наконец, вредоносный код, написанный на языках высокого уровня, таких как Microsoft Visual Basic.
Гибкая архитектура и комбинация различных методов позволяет добиться достаточно высокого уровня детектирования новых вредоносных программ. При этом разработчики прилагают все усилия для того, чтобы количество ложных тревог свести к минимуму. Продукты, представляемые лидерами антивирусной индустрии, чрезвычайно редко ошибаются в детектировании вредоносных кодов.

Схема работы антивирусного "движка"

В приведенной ниже схеме описан примерный алгоритм работы антивирусного "движка". Следует заметить, что эмуляция, поиск известных и неизвестных вредоносных программ происходит одновременно.



Схема работы типичного антивирусного "движка" на примере Антивируса Касперского

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

Оригинальные технологии в антивирусных "движках"

Почти каждый разработчик антивирусных продуктов реализует какие-то свои технологии, позволяющие сделать работу программы эффективнее и производительнее. Некоторые из этих технологий имеют прямое отношение к устройству "движка", так как именно от его работы часто зависит производительность всего решения. Далее будет рассмотрен ряд технологий, позволяющих значительно ускорить проверку объектов и при этом гарантировать сохранение высокого качества детектирования, а также улучшить детектирование и лечение вредоносного программного обеспечения в архивных файлах.
Начать следует с технологии iChecker. Эта технология и ее аналоги реализованы почти в каждом современном антивирусе. Следует отметить, что iChecker - название, предложенное специалистами "Лаборатории Касперского". Эксперты, например, Panda Software называют её UltraFast. Данная технология позволяет добиться разумного баланса между надежностью защиты рабочих станций (и особенно серверов), и использованием системных ресурсов защищаемого компьютера. Благодаря этой технологии значительно сокращается время загрузки (до 30-40%) операционной системы (по сравнению с традиционными антивирусными защитами) и время запуска приложений при активной антивирусной защите. При этом гарантируется, что все файлы на дисках компьютера были проверены и не инфицированы. Основная идея данной технологии - не надо проверять то, что не изменялось, и уже было проверено. Антивирусный "движок" ведет специальную базу данных, в которой хранятся контрольные суммы всех проверенных (и не инфицированных) файлов. Теперь, прежде чем отдать файл на проверку, "движок" подсчитывает и сравнивает контрольную сумму файла с данными, хранящимися в базе данных. Если данные совпадают, то это значит, что файл был проверен и повторная проверка не требуется. Стоит заметить что время, затрачиваемое на подсчет контрольных сумм файла - значительно меньше, чем время антивирусной проверки.
Особое место в работе антивируса занимает лечение заархивированных инфицированных объектов. Именно об этом пойдет речь далее. iCure - технология лечения инфицированных файлов в архивах. Благодаря этой технологии инфицированные объекты внутри архивных файлов будут успешно вылечены (или удалены, в зависимости от настроек антивируса) без использования внешних утилит архивации. На сегодняшний день большинство антивирусов поддерживают следующие типы архивов: ARJ, CAB, RAR, ZIP. Благодаря модульной архитектуре и технологиям обновления антивирусного "движка" пользователь, как правило, может легко обновлять и расширять список поддерживаемых типов архиваторов без перезагрузки антивируса.
iArc - еще одна технология работы с архивными файлами. Эта технология необходима для работы с многотомными архивами. iArc позволяет проверять многотомные архивы и обнаруживать вирусы даже, если они будут упакованы в многотомный архив, который, в свою очередь, также будет упакован в многотомный архив.
Многопоточность. Антивирусный "движок" является многопоточным модулем, и может одновременно обрабатывать (проверять на наличие вредоносных кодов) несколько объектов (файлы, сектора, скрипты и пр.).
Большинство из перечисленных выше технологий в том или ином виде реализовано в каждом современном антивирусном продукте.

Полиморфные вирусы

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

Основные определения: самошифрование и полиморфичность. Используются практически всеми типами вирусов для того, чтобы максимально усложнить процедуру детектирования вируса. Полиморфные вирусы (polymorphic) - это достаточно трудно обнаружимые вирусы, не имеющие сигнатур, то есть, не содержащие ни одного постоянного участка кода. В большинстве случаев два образца одного и того же полиморфного вируса не будут иметь ни одного совпадения. Это достигается шифрованием основного тела вируса и модификациями программы-расшифровщика (декриптора). К полиморфным вирусам относятся те из них, детектирование которых невозможно (или крайне затруднительно) осуществить при помощи так называемых вирусных масок - участков постоянного кода, специфичных для конкретного вируса. Достигается это двумя основными способами - шифрованием основного кода вируса с непостоянным ключом и случайным набором команд расшифровщика или изменением самого выполняемого кода вируса. Существуют также другие, достаточно экзотические примеры полиморфизма: DOS-вирус "Bomber", например, не зашифрован, однако последовательность команд, которая передает управление коду вируса, является полностью полиморфной.
Полиморфизм различной степени сложности встречается в вирусах всех типов - от загрузочных и файловых DOS-вирусов до Windows-вирусов и даже макро-вирусов.

Полиморфные расшифровщики

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

MOV reg_1, count ; reg_1, reg_2, reg_3 выбираются из
MOV reg_2, key ; AX,BX,CX,DX,SI,DI,BP
MOV reg_3, _offset ; count, key, _offset также могут меняться
_loop:
xxx byte ptr [reg_3], reg_2 ; xor, add или sub
DEC reg_1
Jxx _loop ; ja или jnc
; дальше следуют зашифрованные код и данные вируса

Cложные полиморфные вирусы используют значительно более сложные алгоритмы для генерации кода своих расшифровщиков: приведенные выше инструкции (или их эквиваленты) переставляются местами от заражения к заражению, разбавляются ничего не меняющими командами типа NOP, STI, CLI, STC, CLC и т.д.
Полноценные же полиморфные вирусы используют еще более сложные алгоритмы, в результате работы которых в расшифровщике вируса могут встретиться операции SUB, ADD, XOR, ROR, ROL и другие в произвольном количестве и порядке. Загрузка и изменение ключей и других параметров шифровки производится также произвольным набором операций, в котором могут встретиться практически все инструкции процессора Intel (ADD, SUB, TEST, XOR, OR, SHR, SHL, ROR, MOV, XCHG, JNZ, PUSH, POP ...) со всеми возможными режимами адресации. Появляются также полиморфные вирусы, расшифровщик которых использует инструкции вплоть до Intel386, а летом 1997 года обнаружен 32-битный полиморфный вирус, заражающий EXE-файлы 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.
Если произвести деление на уровни с точки зрения антивирусов, использующих системы автоматической расшифровки кода вируса (эмуляторы), то деление на уровни будет зависеть от сложности эмуляции кода вируса. Возможно детектирование вируса и другими приемами, например, расшифровка при помощи элементарных математических законов и т.д.
Более объективной будет классификация, в которой помимо критерия вирусных масок участвуют и другие параметры, например:

Степень сложности полиморфного кода (процент от всех инструкций процессора, которые могут встретиться в коде расшифровщика);
Использование специальных приемов, затрудняющих эмуляцию антивирусами;
Постоянство алгоритма расшифровщика;
Постоянство длины расшифровщика.


Изменение выполняемого кода

Наиболее часто подобный способ полиморфизма используется макро-вирусами, которые при создании своих новых копий случайным образом меняют имена своих переменных, вставляют пустые строки или меняют свой код каким-либо иным способом. Таким образом, алгоритм работы вируса остается без изменений, но код вируса практически полностью меняется от заражения к заражению.
Реже этот способ применяется сложными загрузочными вирусами. Такие вирусы внедряют в загрузочные сектора лишь достаточно короткую процедуру, которая считывает с диска основной код вируса и передает на него управление. Код этой процедуры выбирается из нескольких различных вариантов (которые также могут быть разбавлены "пустыми" командами), команды переставляются между собой и т.д.
Еще реже этот прием встречается у файловых вирусов - ведь им приходится полностью менять свой код, а для этого требуются достаточно сложные алгоритмы. На сегодняшний день известны всего два таких вируса, один из которых ("Ply") случайным образом перемещает свои команды по своему телу и заменяет их на команды JMP или CALL. Другой вирус ("TMC") использует более сложный способ - каждый раз при заражении вирус меняет местами блоки своего кода и данных, вставляет "мусор", в своих ассемблерных инструкциях устанавливает новые значения оффсетов на данные, меняет константы и т.д. В результате, хотя вирус и не шифрует свой код, он является полиморфным вирусом - в коде не присутствует постоянного набора команд. Более того, при создании своих новых копий вирус меняет свою длину.