ClamAV — антивирус с полностью открытым исходным кодом. Сложно изобрести не круглое колесо: антивирусные движки решают схожие задачи — разбирают файловые форматы, распаковывают содержимое и ищут сигнатуры. Поэтому многие архитектурные решения у них похожи, а изучение кода ClamAV помогает понять, как устроены антивирусы в целом.
Важно понимать место ClamAV в экосистеме. Это не конкурент десктопным антивирусам вроде Kaspersky или Windows Defender — у него нет поведенческого анализа, нет облачной репутации файлов, нет проактивной защиты, кроме ограниченного on-access-сканирования на Linux.
Книга «Обход антивирусов на практике»
Это вторая глава из книги «Обход антивирусов на практике».

В книге рассмотрен реальный обход современных антивирусных технологий, включая облака, сканирование в памяти, песочницы, эмуляторы и многое другое. Центральная тема — как сделать малварь полностью невидимой для антивирусов.
К релизу цена вырастет в два раза, поэтому автор советует предзаказать книгу уже сейчас, пока она продается по себестоимости.
Распаковка баз
Официальные сигнатуры поставляются не россыпью отдельных файлов, а в контейнерах CVD (ClamAV Virus Database). Основная база хранится в main.cvd, часто обновляемые сигнатуры — в daily.cvd, байт‑код — в bytecode.cvd. CVD — это подписанный контейнер. В его начале находится заголовок длиной 512 байт с версией базы, количеством сигнатур, требуемым уровнем возможностей движка, контрольной суммой и цифровой подписью. Следом идет сжатый архив с файлами сигнатур: хешами, байтовыми паттернами, логическими правилами, сертификатами и другими служебными данными.
Посмотреть информацию о контейнере можно с помощью встроенной утилиты sigtool:
Команда покажет версию базы, время сборки, количество сигнатур и результат проверки подписи. sigtool --unpack извлекает файлы в текущий каталог, поэтому для них лучше заранее создать отдельную папку:
mkdir main-unpacked
cd main-unpacked
sigtool --unpack ../main.cvd
Если база установлена системным пакетом Linux, из созданного каталога ее можно распаковать по абсолютному пути:
sigtool --unpack /var/lib/clamav/main.cvd
После распаковки появятся файлы main.hdb, main.hsb, main.mdb, main.ndb, main.crb и main.info. Большинство из них текстовые: их можно открыть в редакторе и искать нужную сигнатуру обычным поиском. Примеры ниже приведены из официальных main.cvd версии 63 и daily.cvd версии 28107, актуальных на 30 августа 2026 года.
Форматы сигнатур
Все форматы (кроме байт‑кода и бинарных каталогов) — текстовые файлы, где каждая строка — одна сигнатура. Поля разделяются двоеточием или точкой с запятой. Рассмотрим основные форматы сигнатур.
Простые текстовые паттерны (.db)
Файлы .db имеют устаревший формат первого поколения. Каждая строка состоит из имени сигнатуры и шестнадцатеричного паттерна, разделенных знаком равенства. После знака равенства используется общий синтаксис байтовых паттернов ClamAV.
| AB | Точный байт 0xAB |
| ?? | Один произвольный байт |
| * | Любое количество произвольных байтов, включая ноль |
| {5} | Ровно пять произвольных байтов |
| {-5} | Не более пяти произвольных байтов |
| {5-} | Не менее пяти произвольных байтов |
| 4142{2-5}4344 | Найти байты 4142, пропустить от двух до пяти любых байтов, затем найти 4344. Фигурные скобки используются, когда по обе стороны пропуска есть фиксированные блоки минимум по два байта |
| (AA\|BB) | Один из перечисленных байтов или последовательностей |
Общий парсер движка поддерживает и более сложные конструкции: маски половины байта, диапазоны в квадратных скобках, отрицательные альтернативы и классы границ. Однако в официальных файлах .db они не встречаются, поэтому здесь не рассматриваются.
При стандартных настройках паттерн с масками должен содержать хотя бы два последовательных точных байта: 41??42 будет отклонен, а 4142??4344 — принят. * и переменные пропуски, например {2-5}, делят паттерн на части, и такой двухбайтовый фрагмент нужен в каждой части.
Это требование связано с реализацией автомата Ахо — Корасик. Для добавления каждой части паттерна в дерево поиска нужен непрерывный фрагмент минимум из двух точных байтов. Сам алгоритм будет рассмотрен ниже.
Фиксированный пропуск {N}, где N — от 1 до 127, обрабатывается иначе: например, {5} превращается в пять ??.
June7=018ccb81c33f005350cb
Паттерн состоит только из точных байтов и не содержит подстановочных конструкций.
VCL-II3=01b9????8135????4747e2f8c3
Каждая последовательность ???? заменяет два произвольных байта.
DOS.Dead=b9ac01{9-11}8d7c14{2-3}2e300547e2f8
Между фиксированными частями допускаются сначала от 9 до 11, а затем от 2 до 3 произвольных байтов.
W98.Hybris.E=10400081*75f16800104000c300000000
Звездочка разрешает промежуток любой длины между двумя фиксированными частями.
SymbOS.Trojan.Doombot=2e0064006c006c00??003a005c00(45|65)00(54|74)0065006c002e0064006c006c00
Конструкция ?? заменяет один байт, а (45|65) и (54|74) допускают прописные или строчные ASCII-буквы E/e и T/t.
DOS.Kasiunia=bb1400baad0e2e3007434a{-4}75f5
Конструкция {-4} допускает от нуля до четырех произвольных байтов.
Загрузчик .db передает паттерн общему механизму поиска с позицией *, поэтому совпадение ищется во всем сканируемом объекте. Обычные фиксированные последовательности могут обрабатываться алгоритмом Бойера — Мура, а конструкции с масками, пропусками и альтернативами — автоматом Ахо — Корасик.
Расширенные паттерны (.ndb, .ndu)
В файлах .ndb хранятся расширенные байтовые сигнатуры ClamAV: все конструкции hex-паттернов из формата .db действуют и здесь. Сигнатуры в контейнере .ndu используют тот же синтаксис, но предназначены для обнаружения потенциально нежелательного ПО (PUA — Potentially Unwanted Applications).
Win.Ransomware.BlackCat-9974801-0:1:*:6c6f636b65723a3a636f72653a3a:90:255

2 дней назад
7








English (US) ·
Russian (RU) ·