# Форум на русском языке  > Решения по информационной безопасности  > Антивирусы  >  Методика поиска вируса по сигнатурам - давайте обсудим

## Зайцев Олег

Предлагаю пообсуждать методологический момент (по которому потом можно написать FAQ "Как работает антивирус") - поиск вредоносного объекта по сигнатурам (на примере поиска трояна - его искать проще всего).
Лично мне известны следующие методики (еси выделить без повторов):
1. Сигнатура размером с вредоносный объект (и побайтное сравнение). Медленно, база будет гиганского размера ... но применяется - это по идее вирусная коллекция.
2. Вычисление для всего вредоносного объекта его контрольной суммы (скажем MD5). База на порядки уменьшится в объеме, но скорость проверки будет маленькой (нужно считать CRC всего файла). Есть подозрение, что так работает PestPatrol
3. Замена части вредоносного объекта его контрольно суммой (или несколькими контрольными суммами с разной длинной и местоположением). В свою бытность AVP опирался на две контрольные суммы относительно точки входа (в базе хранились две пары "длина", "смещение", CRC)
4. Использование в сигнатуры, составленной из N байт вредоносного объекта (где N явно должно быть не менее 10-15). При этом можно сделать не тупое сравнение, а сравнение по некоторой маске (типа искать байты EB ?? ?? CD 13)

При использовании методов 3 и 4 возникает еще проблема - относительно чего считать смещение до сигнатуры. Ту тоже возможны варианты:
1. "Тупо-топорный" - берем сигнатуры из фиксированных точек файла. Очень топорно, но удобно - эта операция может проводиться автоматически, и составленная таким образом база может хорошо сжиматься, индексироваться и т.п. Плюс это самый быстрый способ
2. В базе храним смещения для каждой из сигнатур. Смещения или абсолютные, или относительные (скажем, относительно точек входа в EXE или DLL). Для поиска точек входа применяем алгоритмы анализа файла (поиск переходов ... - у Касперского были (и наверное есть) особые записи в базе типа "точка входа" - для поиска точек входа в файл);
3. Смещение не храним, но храним 1-2 начальных байта вируса, размер и CRC остального вирусного кода (при этом строим дерево, индексируя его по этим первым байтам). Затем сканируем файл и увидев некий байт смотрим, есть ли начинающиеся с него вирусы. Если есть - считаем CRC заданного размера и проверяем точно. Есть некое подозрение, что в частности такая методика используется в DrWeb

----------

Надоело быть жертвой? Стань профи по информационной безопасности, получай самую свежую информацию об угрозах и средствах защиты от ведущего российского аналитического центра Anti-Malware.ru:

----------


## Geser

Я думаю есть смысл применять несколько способов в зависимости от ситуации.
1. Хранить MD5 файла для определения модификаций. Т.е. допустим сигнатурный поиск дал положительный результат. Стоит иметь возможность отличить троян от его модификации, т.к. в случае модификации способ удаления/чистки реестра может не подходить.
2. Можно создать список MD5 для всех файлов на диске, и при обновлении баз делать быстрый поиск вредоносных объектов не сканируя диск. Понятно что таким образом отлавливаться будет далеко не всё, но некоторые вещи можно выловить очень быстро без сканирования диска.

Далее стоит поддерживать 2 варианта сигнатур. Один вариант это сигнатуры которые создаются автоматически. Удобно когда получил от кого-то коллекцию вирусов. За пару минут получаешь для всех сигнатуры и программа их уже детектит.
Второй вариант - сложные сигнатуры которые создаются для особо злостных и распространённых троянов вручную, и дают возможность обнаруживать их модифкации.

Кроме всего сказанного выше, если движок не поддерживает пакеры/крипторы, то спокойно можно искать по MD5, т.к., насколько я понимаю, никакая сигнатура не поможет определить пакованный файл.

----------


## Зайцев Олег

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

----------


## Geser

[quote author=Зайцев Олег link=board=18;threadid=226;start=0#msg1306 date=1100175283]
Но такая методика плохо пригодна для анализа скриптов всех видов ...
[/quote]
В смысле Javascript, VBscript...?

----------


## Зайцев Олег

> В смысле Javascript, VBscript...?


Ну да - плюс еще у меня есть отработанная методика извлечения скриптов из документов Office, есть просмотрщик этого - но возникает вопрос, как идентифицировать объект как вирус. Контрольная сумма бесполезна, банальный пробел меняет ее полностью. Программы типа TrojanHunter просто ищут в теле скрипта некую последовательность символов, идентифицирующую скрипт как вирус - но это достаточно опасно и ненадежно. Судя по моим наблюдениям, DrWeb использует две сигнатуры (при этом скрипт перед проверкой вероятно нормализуется (или в момент расчета CRC, или перед проверкой)

----------


## Geser

[quote author=Зайцев Олег link=board=18;threadid=226;start=0#msg1308 date=1100175921]
Ну да - плюс еще у меня есть отработанная методика извлечения скриптов из документов Office, есть просмотрщик этого - но возникает вопрос, как идентифицировать объект как вирус. Контрольная сумма бесполезна, банальный пробел меняет ее полностью. Программы типа TrojanHunter просто ищут в теле скрипта некую последовательность символов, идентифицирующую скрипт как вирус - но это достаточно опасно и ненадежно. Судя по моим наблюдениям, DrWeb использует две сигнатуры (при этом скрипт перед проверкой вероятно нормализуется (или в момент расчета CRC, или перед проверкой)
[/quote]
Ну, если не делать эмуляцию, то других вариантов я не вижу  :Smiley: 
Можно, правда, перед подсчётом контрольной суммы выбрасывать все пробелы и комментарии.

----------


## Зайцев Олег

> Ну, если не делать эмуляцию, то других вариантов я не вижу 
> Можно, правда, перед подсчётом контрольной суммы выбрасывать все пробелы и комментарии.


Я тоже так думаю - эмулятор может немного круто, а вот без парсера (который разберет скрипт на команды ...) никуда. Вывод - или придется писать эмулятор, или плюнуть  :Smiley:

----------


## Minos

Пришла идея по поводу эвристика для скриптов:
Скрипт - набор символов, т.е. к нему можно применить теорему Бейса (реализовать Бейсовый фильтр для скриптов по типу фильтра для спама, нужна только приличная выборка, например netlux).

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

----------


## Зайцев Олег

> Пришла идея по поводу эвристика для скриптов:
> Скрипт - набор символов, т.е. к нему можно применить теорему Бейса (реализовать Бейсовый фильтр для скриптов по типу фильтра для спама, нужна только приличная выборка, например netlux).
> 
> Скрипт - последовательность символов, английского алфавита (33 символа, если мне не изменяет память), т.е. для хранения одного символа нужно 3 бита, это несколько сократит базу, однако исключит из нее локализованные строки сообщений. Поэтому можно попробовать добавлять в сигнатуры наиболее типичные для вируса участки, а далее использовать эти участки как ключи в поиске по базе нормализованных сигнатур с полным кодированием символов.


Это в принципе идея - я как-то не думал о Бейсовом фильтре (он у меня почему-то упорно ассоциировался с резалками спама). А ведь по идее идентификация спама и идентификация скрипта - по сути одно и тоже ... короче говоря, интересная мысль

----------


## Geser

Кстати, скрипты вроде могут быть и в откомпелированном виде? По крайней мере VBA.

----------


## Зайцев Олег

> Кстати, скрипты вроде могут быть и в откомпелированном виде? По крайней мере VBA.


В Office 97 и выше в документе хранится полный исходный текста скрипта, сжатый по собственному алгоритму Microsoft. Я целых два вечера писал утилитку для извлечения и распаковки ... В Office 95 он хранится откомпилированный, в некоем P-коде.

----------


## Minos

[quote author=Зайцев Олег link=board=18;threadid=226;start=0#msg1338 date=1100246489]
Это в принципе идея - я как-то не думал о Бейсовом фильтре (он у меня почему-то упорно ассоциировался с резалками спама). А ведь по идее идентификация спама и идентификация скрипта - по сути одно и тоже ... короче говоря, интересная мысль
[/quote]
Правда, могут возникнуть проблеммы из-за малого "словарного" запаса языков программирования. В качестве теста можно попробовать пропустить несколько сотен скриптовых вирусов и нормальных скриптов через любой бейсовый SPAM фильтр, и посмотреть на сколько эффективно обучается такая система, чтоб не изобретать велосипед с квадратными колесами   :Smiley: .

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

----------


## maXmo

про ДНК есть тут
а что, нельзя выделить характерные черты вирусной активности в скриптах? скажем, в скрипте на js или vbs можно запретить вызов методов ADO для работы с бинарными потоками. Метод ведь нельзя переименовать.

----------


## serge

> Пришла идея по поводу эвристика для скриптов:
> Скрипт - набор символов, т.е. к нему можно применить теорему Бейса (реализовать Бейсовый фильтр для скриптов по типу фильтра для спама, нужна только приличная выборка, например netlux).


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

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

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

----------


## maXmo

Можно сделать так:
коротенькое регулярное выражение типа ADO.[140] выделяет большой кусок текста скрипта (можно нормализовать), для него подсчитывается контрольная сумма. Просто и действует, если вирь не очень полиморфен (есть у кого статистика, насколько сильно плавает код виря?). Для модификации просто добавляется контрольная сумма, регулярное выражение остаётся тем же. Такой алгоритм, думаю, практически не будет давать ложных срабатываний.

Что-то у меня в голове засело, что любое приложение может расширить свою функциональность за счёт скриптовой машины в винде... подробно в это не вникал, вроде можно создавать какой-то ScriptServer или что-то вроде этого
 ???

----------


## Minos

Немного отвлекусь от сигнатур и предложу такую штучку: большая часть серьезных червей и троянов старается завершить процессы известных антивирусов, так почему бы невоспользоваться этим их свойством и не создать процесс-фантом с именем известного антивируса (например spyder или avp) и не мониторить попытки его закрытие. Съест такой процесс не много ресурсов, но позволит детектировать довольно большую часть неизвестных вирусов.

----------


## Geser

> Немного отвлекусь от сигнатур и предложу такую штучку: большая часть серьезных червей и троянов старается завершить процессы известных антивирусов, так почему бы невоспользоваться этим их свойством и не создать процесс-фантом с именем известного антивируса (например spyder или avp) и не мониторить попытки его закрытие. Съест такой процесс не много ресурсов, но позволит детектировать довольно большую часть неизвестных вирусов.


Угу, я видел процесс который занимается тем, что убивает того кто пытается его убить. Забавная штука  :Smiley:

----------

