        Антивирус Doctor Web для Linux, FreeBSD и Solaris
                         Версия 4.29

             Copyright (c) 1992-2002, Игорь Данилов
     Антивирусная лаборатория И.Данилова, ЗАО "ДиалогНаука"

                   Демон DrWeb Daemon для Unix
             Руководство системного администратора


1. Что такое DrWeb Daemon for Unix ?
2. Настройка DrWeb Daemon
3. О ключах (ключевых файлах)
4. Запуск DrWeb Daemon
5. Проверка работоспособности DrWeb Daemon
6. Режимы проверки, реализуемые DrWeb Daemon (локальное сканирование)
7. Программный API DrWeb Daemon
  7.1. Программный API
  7.2. Использование библиотеки libdwclient.a
8. Контакты


                1. Что такое DrWeb Daemon for Unix ?

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

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

То, что демон всегда готов к выполнению своих функций и имеет понятный и
доступный протокол для запросов сканирования, делает его подходящим
компонентом для создания антивирусных фильтров для почтовых систем и
файловых серверов. Разработчики DrWeb предлагают готовые решения по
интеграции DrWeb Daemon с почтовыми системами CommuniGatePro, Sendmail,
Postfix, Exim, QMail и ZMailer, а также решение по интеграции c файловыми
серверами Samba. Однако это могут быть не единственные, хотя на данный
момент и основные, области применения DrWeb Daemon.

Установка демона производится из пакета Doctor Web и описана в руководстве
по использованию сканера Doctor Web. Там же описана процедура обновления
программы и вирусных баз.


                2. Настройка DrWeb Daemon

Конечно, вы можете запустить демона с настройками по умолчанию, но лучше
все же настроить его для соответствия вашим требованиям и условиям
эксплуатации. Файл drweb32.ini читается DrWeb Daemon из каталога /etc/drweb.
Для использования другого файла конфигурации полный путь к нему необходимо
указать ключом командной строки при запуске DrWeb Daemon, например:

$ /usr/local/DrWeb/drwebd -ini:/usr/local/DrWeb/drwebd.ini

Конфигурационный файл drweb32.ini представляет из себя текстовый файл (что
позволяет редактировать его вашим любимым редактором), построенный по
следующему принципу:

--- начало файла ---
[Имя секции 1]
Параметр1 = значение1, ..., значениеK
.....
ПараметрM = значение1, ..., значениеK

.....

[Имя секции X]
Параметр1 = значение1, ..., значениеK
.....
ПараметрY = значение1, ..., значениеK
--- конец файла ---

Если строка начинается с символа ";" (точка с запятой), то это означает,
что эта строка закомментирована (содержит комментарии) - такие строки
пропускаются DrWeb Daemon при чтении параметров из ini-файла. 

Крайне важно отметить, что если какой-то параметр DrWeb Daemon не задан, 
то это не означает, что у параметра нет значения, - оно будет взято по 
умолчанию (частая ошибка при настройке). Лишь некоторые параметры 
являются необязательными или не имеют значений по умолчанию, о чем 
будет специально сказано. Значения могут быть заключены в кавычки (и
должны быть заключены в кавычки, если содержат пробелы). Некоторые
параметры могут иметь несколько значений, разделителем является ","
(запятая), при описании параметра это будет сказано явно. Если в поле
значения параметра в данном описании значения заключены в {}, то параметр
может принимать только одно из этих значений. 

Имя секции состоит из указания на платформу (секция сканера); в секции
с параметрами DrWeb Daemon также указывается суффикс Daemon. Примеры:

[Linux:Daemon]
; Секция параметров DrWeb Daemon для Linux 
[Linux] 
; Секция параметров сканера для Linux
[BSD:Daemon] 
; Секция параметров DrWeb Daemon для FreeBSD
и так далее.

Параметры будут описываться следующим образом:

ИмяПараметра = ПсевдоЗначениеПараметра
        Описание параметра
        {Может ли иметь несколько значений}
        Значение по умолчанию: {значение | отсутствует }

Параметры, общие для демона и сканера:

EnginePath = { путь к файлу, обычное расширение - dll }
        Расположение модуля drweb32.dll (поисковый модуль). Этот параметр
        также используется модулем обновления для обновления поискового
        модуля.
        Значение по умолчанию:
                "/opt/drweb/drweb32.dll" для Linux
                "/usr/local/drweb/drweb32.dll" для FreeBSD и Solaris

VirusBase = { список путей (масок) к файлам, обычное расширение - vdb }
        Маски для подключаемых вирусных баз. Этот параметр также
        используется модулем обновления для обновления баз антивируса.
        Допустимо перечисление нескольких масок.
        Значение по умолчанию:
                "/opt/drweb/*.vdb" для Linux
                "/usr/local/drweb/*.vdb" для FreeBSD и Solaris

UpdatePath = каталог
        Этот парамтр используется модулем обновления программы и
        при его использовании должен быть задан обязательно.
        Значение по умолчанию: нет


Key = { путь к файлу, обычное расширение - key }
        Расположение файла с регистрационным ключом.
        Значение по умолчанию:
                "/opt/drweb/drweb32.key" для Linux
                "/usr/local/drweb/drweb32.key" для FreeBSD и Solaris

LngFileName = { путь к файлу языковых ресурсов, обычное расширение - dwl }
        Расположение файла локализации.
        Значение по умолчанию:
                отсутствует (все сообщения выводятся на английском)

CheckPackedFiles = { Yes | No }
        Производить ли распаковку исполняемых файлов, упакованных утилитами
        DIET, PKLITE и т. д.
        Значение по умолчанию: Yes

CheckArchives =  { Yes | No }
        Производить ли распаковку архивов форматов ZIP (WinZip, InfoZIP...),
        RAR, ARJ, TAR, GZIP и CAB.
        Значение по умолчанию: Yes

CheckEMailFiles = { Yes | No }
        Производить ли проверку файлов в почтовых (e-mail) форматах.
        Значение по умолчанию: Yes

ScanPriority = { значение }
        Приоритет сканирующих процессов демона. Значение параметра должно
        быть в диапазоне от -20 (высший приоритет) до 20 (низший приоритет)
        Значение по умолчанию: 0

MaxFileSizeToExtract = { значение в Kb }
        Максимальный размер файла, извлекаемого из архива. Если размер
        файла внутри архива превышает это значение, он будет пропущен.
        Замечание: письмо содержащие такой файл будет трактоваться как
        "почтовая бомба" (mailbomb).
        Значение по умолчанию:
                отсутствует (извлекаются файлы любого размера)

MaxCompressionRatio = { значение }
        Максимальный коэффициент сжатия, т.е. отношение длины файла в
        распакованном виде к длине файла в запакованном виде, файла внутри
        архива. Если коэффициент превышает это значение, файл извлечен не
        будет - а значит не будет проверен. Замечание: письмо содержащие
        такой файл будет трактоваться как "почтовая бомба" (mailbomb).
        Значение по умолчанию:
                отсутствует (коэффициентом сжатия игнорируется)

ScanFiles = { All | ByType | ByFormat }
        Файлы, которые необходимо проверять при извлечении из архивов. При
        задании ByType учитываются так называемые расширения файлов (т.е.
        самый последний суффикс после "." в имени файла; если "."
        отсутствует, у файла отсутствует расширение), значения которых
        заданы или по умолчанию, или в параметре (параметрах) FilesTypes. При
        задании ByFormat проверяются только файлы, включенные в проверяемое
        множество, выявляется, могут ли они быть переносчиками вирусов,
        т.е. исполняемыми файлами (имя и расширение файла во внимание не
        принимаются), и после этого только для файлов, являющихся
        предположительно исполняемыми, будет выполнено антивирусное
        сканирование. Важно замечание: внутри почтовых файлов всегда
        действует режим All. Значения ByType и ByFormat могут быть
        использованы только в режимах "локального" сканирования. 
        Значение по умолчанию: All

FilesTypes = { список расширений }
        Типы файлов, которые будут проверяться при сканировании по типу,
        т.е. параметр ScanFiles имеет значение ByType. Допускаются символы
        "*" и "?". 
        Значение по умолчанию:
                "EXE, COM, SYS, OV?, BAT, BIN, DRV, PRG, BOO, SCR, CMD, VXD"
                "386, DLL, FON, DO?, XL?, WIZ, RTF, CL*, HT*, VB*, JS*, INF"
                "AR?, ZIP, R??, PP?, OBJ, LIB, HLP, MD?, INI, MBR, IMG, CSC"
                "CPL, MBP, SH*, PIF, MSG, CHM, REG, XML, PRC, TBB, ASP"

HeuristicAnalysis = { Yes | No }
        Разрешить клиентам DrWeb Daemon использование эвристического
        анализа, что делает возможным обнаружение неизвестных вирусов по
        априорным соображениям об устройстве вирусного кода. Особенностью
        этого типа поиска вирусов является приблизительный, вероятностный
        характер обнаружения заражения, что позволяет говорить не о
        зараженных, а лишь о подозрительных объектах. При отключении этого
        параметра осуществляется только поиск известных вирусов по вирусной
        базе данных. Целый класс программ ввиду использования сходного с
        вирусами кода может вызывать ложные срабатывания эвристического
        анализатора. Кроме того, данный вид проверки может несколько
        увеличить время проверки на вирусы (хотя это увеличение и
        незначительно). Эти обстоятельства могут быть доводами в пользу
        отмены эвристического анализа. Вместе с тем, сохранение этого типа
        анализа увеличивает надежность антивирусной защиты.
        Значение по умолчанию: Yes

MoveFilesTo = { каталог }
        Каталог для перемещения файлов, если для данного типа файлов задано
        действие Move (только для сканера).
        Значение по умолчанию:
                "/opt/drweb/infected" для Linux
                "/usr/local/drweb/infected" для FreeBSD и Solaris

RenameFilesTo = { маска }
        Маска для переименования файлов, если для данного типа файлов
        задано действие Rename (только для сканера).
        Значение по умолчанию:
                "#??" (это означает, что первая буква "расширения" файла
        будет заменена на "#", а две следующие буквы сохранены. Если файл не
        имел "расширения", то оно будет состоять из одного символа "#".

FollowLinks = { Yes | No }
        Следовать ли символическим ссылкам при сканировании.
        Значение по умолчанию: No

LogFileName = { имя файла }
        Имя файла отчета. Можно в качестве имени указать "syslog", при этом
        отчет будет вестись средствами системного сервиса syslogd. При
        использовании syslog обратите внимание на опции
        SyslogFacility и SyslogPriority. Т.к. syslog имеет несколько файлов
        для протоколирования разных событий и разных степеней их важности, то
        основываясь на этих двух параметрах и содержимом конфигурационного
        файла syslog (обычно /etc/syslogd.conf), можно определить, куда будет
        писаться отчет демона.
        Значение по умолчанию: "syslog"

SyslogFacility = { "Daemon" | "Local0" .. "Local7" | "Kern" | "User" | "Mail" }
        Тип записи при использовании системного сервиса syslogd.
        Значение по умолчанию: "Daemon"

SyslogPriority = { "Alert" | "Warning" | "Notice" | "Info" | "Error" }
        Приоритет записи при использовании системного сервиса syslogd.
        Значение по умолчанию: "Alert"

OverwriteLog = { Yes | No }
        Перезаписывать ли файл отчета при каждом старте демона. Параметр не
        имеет смысла, если в имени LogFileName указано "syslog".
        Значение по умолчанию: No

LimitLog = { Yes | No }
        Ограничивать ли размер файла отчета. Параметр не имеет смысла, если
        в имени LogFileName указано "syslog".
        Значение по умолчанию: No

MaxLogSize = { значение в Kb }
        Максимальный размер файла отчета в килобайтах. Если при старте
        демона размер файла отчета превышает это значение, он будет
        перезаписан. Параметр не имеет смысла, если в имени LogFileName
        указано "syslog" или параметр LimitLog имеет значение No.
        Значение по умолчанию: 512

LogScanned = { Yes | No }
        Выводить ли в файл отчета информацию о всех проверяемых объектах
        независимо от того, обнаружены вирусы или нет.
        Значение по умолчанию: No

LogPacked = { Yes | No }
        Выводить ли в файл отчета дополнительную информацию о файлах,
        упакованных утилитами DIET, PKLITE и т. д.
        Значение по умолчанию: Yes

LogArchived = { Yes | No }
        Выводить ли в файл отчета дополнительную информацию об архиваторах.
        Значение по умолчанию: Yes

LogTime = { Yes | No }
        Выводить ли в файл отчета время каждой записи. Параметр не имеет
        смысла, если в имени LogFileName указано "syslog".
        Значение по умолчанию: No

OutputMode = { Terminal | Quiet }
        Режим вывода информации на консоль, Quiet отменяет вывод.
        Значение по умолчанию: Terminal
        
RecodeNonprintable = { Yes | No }
        Режим вывода в лог файл не-ASCII символов (т.е. с кода больше 127)
        Значение по умолчанию: Yes
        
RecodeMode = { Replace | QuotedPrintable }
        Если значение RecodeNonprintable равно "Yes", то задает метод 
        перекодирования не-ASCII символов. Если равно значению "Replace",
        то все такие символы заменяются на RecodeChar.        
        Значение по умолчанию: Replace

RecodeChar = { "?" | "_" | ... }
        Если значение RecodeMode равно "Replace", то задает символ, на который
        будут заменены все не-ASCII символы.
        Значение по умолчанию: "_"
        

Далее описаны настройки, которые могут быть описаны только в секции для
DrWeb Daemon.

SocketMode = { TCP | Unix }
        Тип сокета. Если задан TCP, то следует обратить внимание на
        параметры DaemonPort, SocketReuseAddr и Interfaces; если задано
        значение Unix, то следует обратить внимание на параметры SocketFile
        и SocketAccess.
        Значение по умолчанию: TCP

DaemonPort = { число (десятичное) в диапазоне от 1 до 65535 }
        Номер порта, используемый при работе с TCP-сокетом.
        Значение по умолчанию: 3000

Interfaces = { список имен интерфейсов или IP-адресов }
        Список имен интерфейсов или IP-адресов, на которых (а не с которых)
        демон будет принимать запросы. Это значит, что если хост, где
        установлен DrWeb Daemon, имеет несколько интерфейсов, то можно
        ограничить доступ указанием, на какой интерфейс будут приниматься
        запросы. Например, если указать только localhost, то запросы на
        сканирование можно давать только с локальной машины (т.к. доступ к
        локальному интерфейсу доступен только для локальных программ). Еще
        пример: машина с двумя внешними интерфейсами (например 10.0.0.1 и
        192.168.0.1); если указать в значении только 10.0.0.1, то доступ к
        демону будет возможен только для хостов, которым доступен путь к
        этому интерфейсу.
        Значение по умолчанию: localhost

SocketReuseAddr = { Yes | No }
        Использовать ли флаг SO_REUSEADDR при работе с TCP-сокетами. Этот
        флаг используется для быстрого "освобождения" порта, используемого
        демоном; в обычном режиме порт остается "занятым" еще около 2
        минут. Использование флага настоятельно рекомендуется.
        Значение по умолчанию: No

SocketFile = { путь к файлу }
        Unix-сокет, используемый, если параметр SocketMode имеет значение
        Unix.
        Значение по умолчанию:
                "/var/run/drwebd" (Внимание!!! /var/run доступен для записи
                только программам, выполняющимся с привилегиями root)

SocketAccess = { число (восьмеричное) }
        Права доступа к Unix-сокету (значение в восьмеричной системе
        счисления).
        Значение по умолчанию: 0666

PidFile = { путь к файлу }
        Имя файла, в который при старте демона будет записана информация о
        его PID и о Unix-сокете (если SocketMode имеет значение Unix) или
        номер порта (если SocketMode имеет значение TCP).
        Значение по умолчанию:
                "/var/run/drwebd.pid" (Внимание!!! /var/run доступен для
                записи только программам, выполняющимся с привилегиями root)

BusyFile = { путь к файлу }
        Имя файла занятости демона: создается сканирующей "копией" демона
        при получении команды и уничтожается после передачи результата ее
        выполнения. Имя файла, создаваемого каждой "копией" демона,
        дополняется точкой и ASCIIZ представлением PID (например,
        /var/run/drwebd.bsy.123456).
        Значение по умолчанию: отсутствует (файл не создается)

SocketTimeout = { значение в секундах }
        Время, отведенное для приема/передачи всех данных через сокет
        (время сканирования файла не учитывается).
        Значение по умолчанию: 40

FileTimeout = { значение в секундах }
        Максимальное время проверки одного файла.
        Значение по умолчанию: 40

User = { имя пользователя }
        Пользователь, с привилегиями которого работает демон. Рекомендуется
        завести в системе специального пользователя drweb, который потом и
        будет использоваться демоном и некоторыми фильтрами. Использовать
        DrWeb Daemon с привилегиями root нежелательно, хотя требует
        значительно меньше настройки (особенно в случае с Samba-серверами).
        Значение по умолчанию:
                отсутствует (что означает, что демон будет использовать
                привилегии того пользователя, которым был запущен)

UserID = { числовой ID }
GroupID = { числовой ID }
        ID группы и пользователя, с чьими привилегиями будет работать
        демон. Параметры игнорируются, если задан параметр User.
        Значение по умолчанию: отсутствует

MaxChildren = { число }
        Максимальное количество одновременно работающих "дочерних"
        (сканирующих) процессов. Если демон получает запросов больше, чем
        это число, то еще MaxChildren соединений устанавливаются (в TCP -
        ESTABLISHED), но данные из них не принимаются, остальные остаются в
        состоянии ожидания подтверждения запроса (в TCP - SYN_SENT).
        Таймауты для этих состояний сильно отличаются и зависят от ОС.
        Значение по умолчанию: 16

Как уже отмечалось ранее, DrWeb Daemon имеет встроенные возможности по
фильтрации почтовых сообщений на основе системы анализа заголовков почтовых
сообщений. Правила фильтрации так же задаются в drweb32.ini, проверка
правил осуществляется в порядке их задания, т.е. правило, заданное первым, и
будет проверено первым. Задание правил фильтрации НЕ означает
автоматического их применения. Чтобы включить анализ по заголовкам,
необходимо задать соответствующие опции в поставляемых фильтрах или указать
специальные флаги при использовании собственных решений на базе DrWeb
Daemon. Поиск соответствия правилу осуществляется до первого подходящего
правила - возвращается действие, заданное для этого правила. Если письмо не
соответствует ни одному из правил, то применяется действие Accept (т.е.
применена политика - "все что не запрещено - разрешено").

FilterRule ИмяЗаголовка "маска" { Accept | Reject }
        Описание одного правила фильтрации писем по заголовкам. Поле
        "ИмяЗаголовка" может принимать произвольные значения (например,
        "Subject", естественно, задание имен, никогда не встречающихся среди
        почтовых сообщений, бессмысленно). "Маска" является
        регистронезависимой маской для анализа значения этого заголовка на
        основе регулярных выражений, соответствующих стандарту POSIX 1003.2
        (например, ".*make.*money.*fast.*"). Последнее поле задает действие
        при соответствии значения заголовка маске: Accept - пропустить,
        Reject - не пропустить.


                3. О ключах (ключевых файлах)

В дистрибутиве DrWeb Daemon находится демонстрационный ключ, так называемый
Evaluation Key. При использовании этого ключа на DrWeb Daemon накладываются
следующие ограничения:

- не проверяются архивы в традиционном понимании (ZIP, RAR, TAR, GZIP и
др.), но это НЕ касается "псевдоархивов" (MAIL, HTML, UUE и др.) и упакованных
файлов (упаковщиками DIET, PKLITE и др.);
- невозможно лечение зараженных файлов;
- в режиме локального сканирования ко всем multipart-mime письмам
дописывается evaluation banner.

Параметр Key описан в обоих секциях, т.к. демонстрационные ключи для DrWeb
Daemon и сканера различаются (сканер имеет больше ограничений). После
покупки лицензии на DrWeb Daemon вы получите новый ключевой файл (обычно
имеет название drweb32.key), который подходит сразу и для демона и для
сканера. Теперь необходимо изменить настройки в drweb32.ini. Чтобы подключить 
новый ключевой файл, необходимо в обоих секциях заменить значение
параметра Key на полный путь к файлу drweb32.key.

Например, "Key = /opt/drweb/drweb32.key".

Важное замечание - ключевой файл НЕ является текстовым и не подлежит
редактированию в любом виде, в том числе и автоматической конвертации,
производимой некоторыми программами. Часто приходится сталкиваться с
проблемой, когда ключевой файл был конвертирован не в меру интеллектуальной
почтовой программой из DOS формата (с концами строк вида CR LF (в
шестнадцатиричном виде 0D 0A) в UNIX формат (с концами строк вида LF (в
шестнадцатиричном виде 0A)).

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

=== cut ===
Dr.Web daemon for Linux, version 4.27 (December 28, 2001)
Fri Feb  1 14:43:33 2002 This is an EVALUATION version with limited functionality!
Fri Feb  1 14:43:33 2002 To get your registration key, call regional dealer.
Fri Feb  1 14:43:33 2002 Loading /opt/drweb/drwtoday.vdb - Ok, virus records: 56
Fri Feb  1 14:43:34 2002 Loading /opt/drweb/drw42702.vdb - Ok, virus records: 116
Fri Feb  1 14:43:34 2002 Loading /opt/drweb/drw42701.vdb - Ok, virus records: 90
Fri Feb  1 14:43:34 2002 Loading /opt/drweb/drwebase.vdb - Ok, virus records: 27860
Fri Feb  1 14:43:34 2002 Daemon is installed, TCP socket created on port 3000
=== cut ===

Некоторую неясность вносят слова "... EVALUATION version ...", т.к.
кажется, что загружен Evaluation ключ. Но это не так, когда загружается
ключ, в логе (и если включен вывод на консоль) должны присутствовать (как
минимум) записи Key File: {path/to/file} и Registration info. Вот так
выглядит загрузка демона с Evaluation ключом:

=== cut ===
Dr.Web daemon for Linux, version 4.27 (December 28, 2001)
Fri Feb  1 14:45:26 2002 Key file: /opt/drweb/drwebd.key
Fri Feb  1 14:45:26 2002 Registration info:
Fri Feb  1 14:45:26 2002 0100000002
Fri Feb  1 14:45:26 2002 Evaluation Key (ID Anti-Virus Lab. Ltd, St.Petersburg)
Fri Feb  1 14:45:26 2002 This is an EVALUATION version with limited functionality!
Fri Feb  1 14:45:26 2002 To get your registration key, call regional dealer.
Fri Feb  1 14:45:26 2002 Loading /opt/drweb/drwtoday.vdb - Ok, virus records: 56
Fri Feb  1 14:45:27 2002 Loading /opt/drweb/drw42702.vdb - Ok, virus records: 116
Fri Feb  1 14:45:27 2002 Loading /opt/drweb/drw42701.vdb - Ok, virus records: 90
Fri Feb  1 14:45:27 2002 Loading /opt/drweb/drwebase.vdb - Ok, virus records: 27860
Fri Feb  1 14:45:28 2002 Daemon is installed, TCP socket created on port 3000
=== cut ===

Загрузка демона с полнофункциональным регистрационным ключом выглядит при
этом вот так:

=== cut ===
Dr.Web daemon for Linux, version 4.27 (December 28, 2001)
Fri Feb  1 14:50:03 2002 Key file: /opt/drweb/FILENAME.key
Fri Feb  1 14:50:03 2002 Registration info:
Fri Feb  1 14:50:03 2002 XXXXXXXXXX
Fri Feb  1 14:50:03 2002 USER OR COMPANY NAME
Fri Feb  1 14:50:03 2002 Loading /opt/drweb/drwtoday.vdb - Ok, virus records: 56
Fri Feb  1 14:50:03 2002 Loading /opt/drweb/drw42702.vdb - Ok, virus records: 116
Fri Feb  1 14:50:03 2002 Loading /opt/drweb/drw42701.vdb - Ok, virus records: 90
Fri Feb  1 14:50:04 2002 Loading /opt/drweb/drwebase.vdb - Ok, virus records: 27860
Fri Feb  1 14:50:04 2002 Daemon is installed, TCP socket created on port 3000
=== cut ===


                4. Запуск DrWeb Daemon

В процессе загрузки демона осуществляются следующие действия:

- ищется и загружается конфигурационный файл; если файл не найден, то
загрузка DrWeb Daemon прекращается. Путь к конфигурационному файлу может
быть задан в параметрах запуска с помощью ключа 
-ini:{path/to/your/drweb32.ini} или использовано значение по умолчанию
(/etc/drweb/drweb32.ini). При загрузке проверяется допустимость некоторых
параметров, и, если значение параметра недопустимо, берется значение по
умолчанию;

- производится загрузка файла локализации, если он задан; если неудачно -
используются английские сообщения;

- создается лог-файл. Замечание: каталог с лог-файлом должен быть доступен
пользователю, с чьими привилегиями работает демон, на запись;

- производится загрузка ключевого файла по пути, указанному в drweb32.ini.
Если ключ не найден, то загрузка демона продолжается, но он работает в самом
ограниченном режиме (не проверяются упакованные файлы, почтовые сообщения и
т.д.);

- если задан параметр User (или UserID), то демон пытается изменить свои
привилегии;

- производится загрузка поискового модуля (drweb32.dll). Если модуль не
найден (ошибки в конфигурационном файле) или поврежден, то загрузка
прекращается;

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

- демон "отвязывается" от терминала, поэтому сообщения о дальнейших
проблемах не могут быть выведены на терминал, и выводятся только в лог-файл;

- создается сокет. В случае TCP, возможно, даже не один; если какой-то из них
создать не удалось - загрузка все равно продолжается. В случае UNIX сокета:
убедитесь, что каталог, его содержащий, доступен пользователю, с чьими
привилегиями работает демон, на запись и чтение. Для пользователей, от
которых будут работать интеграционные модули, каталог должен быть доступен
на выполнение, а сам файл сокета - на запись и чтение;

- после этого создается так называемый pid-файл, в котором хранится
информация об идентификаторе процесса демона и о транспортных адресах, по
которым доступен демон. Еще один крайне важный момент: каталог с pid-файлом
должен быть доступен пользователю, с чьими привилегиями работает демон, на
запись, поэтому, если у вас определен параметр User, то обязательно
переопределите и параметр pid-файл, т.к. каталог по умолчанию /var/run не
доступен пользователям на запись. Если создать pid-файл не удалось, то
загрузка прекращается.


                5. Проверка работоспособности DrWeb Daemon

Если в ходе загрузки не возникло проблем, то в итоге мы получаем готовый к
работе демон - т.е. заданное число всегда готовых к работе сканеров.
Проверить, создан ли сокет, можно, выдав команду netstat -a. В случае TCP
сокетов:

--- cut ---
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 localhost:3000          *:*                     LISTEN      
raw        0      0 *:icmp                  *:*                     7           
raw        0      0 *:tcp                   *:*                     7           
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  0      [ ACC ]     STREAM     LISTENING     384    /dev/gpmctl
unix  0      [ ]         STREAM     CONNECTED     190    @0000001b
unix  1      [ ]         STREAM     CONNECTED     1091   @00000031
unix  0      [ ACC ]     STREAM     LISTENING     403    /tmp/.font-unix/fs7100
unix  4      [ ]         DGRAM                    293    /dev/log
unix  1      [ ]         STREAM     CONNECTED     1092   /dev/gpmctl
unix  0      [ ]         DGRAM                    450    
unix  0      [ ]         DGRAM                    433    
unix  0      [ ]         DGRAM                    416    
unix  0      [ ]         DGRAM                    308    
--- cut ---

В случае Unix сокетов:

--- cut ---
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
raw        0      0 *:icmp                  *:*                     7           
raw        0      0 *:tcp                   *:*                     7           
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  0      [ ACC ]     STREAM     LISTENING     384    /dev/gpmctl
unix  0      [ ]         STREAM     CONNECTED     190    @0000001b
unix  1      [ ]         STREAM     CONNECTED     1091   @00000031
unix  0      [ ACC ]     STREAM     LISTENING     1127   /opt/drweb/run/drwebd.skt
unix  0      [ ACC ]     STREAM     LISTENING     403    /tmp/.font-unix/fs7100
unix  4      [ ]         DGRAM                    293    /dev/log
unix  1      [ ]         STREAM     CONNECTED     1092   /dev/gpmctl
unix  0      [ ]         DGRAM                    450   
unix  0      [ ]         DGRAM                    433   
unix  0      [ ]         DGRAM                    416   
unix  0      [ ]         DGRAM                    308    
--- cut ---

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

Для проверки работоспособности DrWeb Daemon можно использовать консольного
клиента для демона (drwebdc), запустив его для получения служебной
информации о демоне. Для TCP сокета:

$ drwebdc -nHOSTNAME -pPORTNUM -sv -sb

Для Unix сокета:

$ drwebdc -uSOCKETFILE -sv -sb

Должна появиться следующая информация:

--- cut ---
Dr.Web daemon version: 4.27
Virus base: /opt/drweb/drwtoday.vdb (56 records)
Virus base: /opt/drweb/drw42702.vdb (116 records)
Virus base: /opt/drweb/drw42701.vdb (90 records)
Virus base: /opt/drweb/drwebase.vdb (27860 records)
Total virusfinding records : 28467
--- cut ---

Если соответствующей информации не появилось, то попробуйте включить
расширенную диагностику. Для TCP сокета:

$ drwebdc -nHOSTNAME -pPORTNUM -sv -sb -w

Для Unix сокета:

$ drwebdc -uSOCKETFILE -sv -sb -w

Более подробный вывод может прояснить ситуацию:

--- cut ---
dwlib: startup: set timeout for whole session to -1 milliseconds (-1 means infinite)
dwlib: ipc: parse address string <inet:3001@localhost>
dwlib: tcp: call resolver for localhost
dwlib: tcp: resolver return 127.0.0.1
dwlib: tcp: connecting to 127.0.0.1:3001
dwlib: fd: connect() failed - Connection refused
Results: dwclient error -2 (internal transport subsystem)
Final code 0x10.
--- cut ---

Далее, взять тестовый файл eicar.txt (идущий в дистрибутиве), с помощью
текстового редактора изготовить из него программу eicar.com (см. указания об
этом внутри самого файла) и попытаться проверить его с помощью демона.
Для TCP сокета:

$ drwebdc -w -nHOSTNAME -pPORTNUM -f eicar.com

Для Unix сокета:

$ drwebdc -w -uSOCKETFILE -f eicar.com

Результатом такой команды должна быть соответствующая диагностика:

--- cut ---
dwlib: startup: set timeout for whole session to -1 milliseconds (-1 means infinite)
dwlib: ipc: parse address string <inet:3000@localhost>
dwlib: tcp: call resolver for localhost
dwlib: tcp: resolver return 127.0.0.1
dwlib: tcp: connecting to 127.0.0.1:3000
Results: daemon return code 0x20 (known virus is found)
Final code 0x1.
--- cut ---

Если ее не появилось, то надо
- посмотреть лог демона: есть ли запись о проверке этого файла;
- включить расширенную диагностику (см. выше).

Если проверка прошла правильно, то это означает, что демон находится в
рабочем состоянии.


                6. Режимы проверки, реализуемые DrWeb Daemon
                   (локальное сканирование)

DrWeb Daemon имеет два основных режима проверки:
- проверка фрагмента памяти, полученного из сокета;
- проверка файла на диске.

Остановимся подробнее на этих двух режимах. В первом режиме DrWeb Daemon
получает данные для проверки из сокета, фактически, это некоторый фрагмент
данных. Этот фрагмент может быть поименованным или нет - это отразится
исключительно на форме записи DrWeb Daemon в лог-файле. Пример работы
демона в таком режиме приведен в предыдущем пункте - клиент читал файл и
отсылал его демону для проверки. В принципе, демон может проверять любой
фрагмент данных, это не обязательно должен быть файл.

Значительно более эффективен режим, в котором демон проверяет указанный
файл на диске, - т.е. клиент (будь то консольный клиент или фильтр для
почты) сообщает демону лишь путь к файлу, а не передает весь файл.
Внимание !!! Важное замечание - путь задается относительно демона (т.к.
клиенты могут находится на других машинах и т.д.). В чем преимущества
такого режима? Во-первых, он более производителен, во-вторых, значительно
проще делать рабочие схемы с лечением (например, на файловых серверах). Но
такой режим требует более тщательной настройки прав, т.к. демону должен
быть доступен на чтение такой файл, а в случае почтовых файлов и демо-ключа
- и права на запись. В грамотно настроенной системе демону в большинстве
случаев не требуется прав администратора (root). Но на это стоит обратить
особое внимание при использовании с почтовыми системами - т.к. фильтры, как
правило, работают от имени почтовой системы (которая также не использует
root привилегий). В наиболее выгодном режиме фильтр создает файл с письмом
(получая его от почтовой системы) и сообщает демону о его местоположении.
Вот на этом этапе нужно грамотно распределить права на каталог, в котором
будут создаваться файлы фильтрами. Можно порекомендовать либо пользователя,
чьи привилегии используются демоном, включать в группу почтовой подсистемы,
либо запускать демона от пользователя почтовой системы.


                 7. Программный API DrWeb Daemon

Этот раздел написан для тех, кто собирается писать собственные модули
интеграции с DrWeb Daemon. Раздел состоит из двух пунктов, первый пункт
описывает собственно API демона, во втором описывается библиотека для
быстрого написания собственных интеграционных модулей.

        7.1. Программный API

Вначале опишем в общих чертах взаимодействие клиента с DrWeb Daemon. Итак,
взаимодействие описывается следующей последовательностью (INT обозначает
параметры, являющиеся 4-хбайтовыми словами в сетевом порядке, STRING(n)
обозначает массив символов заданной длины n):

- клиент устанавливает соединение с демоном;
- выдает команду Cmd(INT), допустимые команды:
        DRWEBD_SCAN_CMD     1 - сканировать буфер или файл
        DRWEBD_VERSION_CMD  2 - вернуть версию DrWeb Daemon
        DRWEBD_BASEINFO_CMD 3 - вернуть информацию о загруженных
                                DrWeb Daemon антивирусных базах
        DRWEBD_IDSTRING_CMD 4 - вернуть информацию о DrWeb Daemon
        DRWEBD_SCANPART_CMD 5 - сканировать фрагмент файла
  для команды сканирования фрагмента файла передаются следующие параметры:
    - Offset(INT) - смещение относительно начала файла
    - Length(INT) - длина фрагмента
  если это была одна из команд сканирования, то также записываются
  дополнительные данные:
    - ScanOptions(INT) - опции сканирования в виде массива битовых флагов
      (флаги действия не относятся к вложениям в письма):
        DRWEBD_RETURN_VIRUSES   0x0001 - вернуть имена обнаруженных вирусов
        DRWEBD_RETURN_REPORT    0x0002 - вернуть отчет проверки
        DRWEBD_RETURN_CODES     0x0004 - вернуть расширенные коды
        DRWEBD_HEURISTIC_ON     0x0008 - использовать эвристический
                                         анализатор
        DRWEBD_CURE_FILES       0x0010 - лечить файл
        DRWEBD_SPAM_FILTER      0x0020 - использовать фильтр заголовков
        DRWEBD_INFECTED_CURE    0x0040 - пытаться лечить зараженный файл,
                                         если неудачно, то файл трактуется
                                         как неизлечимый
        DRWEBD_INFECTED_MOVE    0x0080 - перемещать зараженные файлы
        DRWEBD_INFECTED_RENAME  0x0100 - переименовывать зараженные файлы
        DRWEBD_INFECTED_DELETE  0x0200 - удалять зараженные файлы
        DRWEBD_INCURABLE_MOVE   0x0400 - перемещать неизлечимые файлы
        DRWEBD_INCURABLE_RENAME 0x0800 - переименовывать неизлечимые файлы
        DRWEBD_INCURABLE_DELETE 0x1000 - удалять неизлечимые файлы
        DRWEBD_SUSPECTED_MOVE   0x2000 - перемещать подозрительные файлы
        DRWEBD_SUSPECTED_RENAME 0x4000 - переименовывать подозрительные файлы
        DRWEBD_SUSPECTED_DELETE 0x8000 - удалять подозрительные файлы
    - PathLen(INT) - длина имени (м.б. равна 0, тогда буфер считается
      безымянным и следующий параметр Path опускается);
    - Path(STRING(PathLen)) - имя буфера или путь к файлу (зависит от
      значения поля DataLen);
    - DataLen(INT) - длина блока данных, если 0 (для команды сканирования
      фрагмента обязательно должна быть 0), это означает, что Path является
      путем к файлу, который демон должен просканировать;
    - Data(STRING(DataLen)) - блок данных для сканирования.

- после этого клиент ждет ответа от DrWeb Daemon, в зависимости от команды,
  читает следующие данные из сокета:
    - для команды получения версии:
      Version(INT) - упакованная версия DrWeb Daemon;
      Major = PackedVersion / 100,  Minor = PackedVersion % 100;
    - для команды получения информации о DrWeb Daemon:
      IdLen(INT) - длина информационной строки и
      Id(STRING(IdLen)) - собственно строка;
    - для команды получения информации о загруженных базах:
      BaseNum(INT) - кол-во загруженных баз, и потом для каждой базы читается:
        NameLen(INT) - длина имени файла с базой;
        Name(STRING(NameLen)) - имя файла базы;
        VirCount(INT) - кол-во антивирусных записей в базе;
    - для команд сканирования:
      DaemonCode(INT) - код возврата демона, содержит битовые поля с
      событиями, имевшими место в ходе сканирования:
        DERR_NOERROR            0x00000000 - ошибок не было
        DERR_READ_ERR           0x00000001 - ошибка(и) чтения, может означать
                                             как физическую недоступность
                                             файла (например, неправильные
                                             права доступа), так и логическое
                                             повреждение документа
        DERR_WRITE_ERR          0x00000002 - ошибка(и) записи (возможна
                                             только при лечении)
        DERR_NOMEMORY           0x00000004 - нет памяти
        DERR_CRC_ERROR          0x00000008 - нарушена целостность
                                             проверяемого(ых) архива(ов)
        DERR_READSOCKET         0x00000010 - ошибка в протоколе
        DERR_KNOWN_VIRUS        0x00000020 - найден(ы) вирус(ы)
        DERR_UNKNOWN_VIRUS      0x00000040 - подозрение на вирус(ы)
                                             (возможно только при включенном
                                             эвристическом анализаторе)
        DERR_VIRUS_MODIFICATION 0x00000080 - найден(ы) модификация(и)
                                             вируса(ов)
        DERR_FILE_IS_CURED      0x00000100 - файл(ы) вылечен(ы)
        DERR_TIMEOUT            0x00000200 - истекло время, отведенное для
                                             проверки
        DERR_SYMLINK            0x00000400 - файл(ы) пропущен(ы), т.к.
                                             symlink
        DERR_NO_REGFILE         0x00000800 - файл(ы) пропущен(ы), т.к.
                                             не регулярный файл
        DERR_SKIPPED            0x00001000 - файл(ы) пропущен(ы), например,
                                             при режиме ByType
        DERR_TOO_BIG            0x00002000 - файл(ы) пропущен(ы), т.к.
                                             превышен MaxFileSizeToExtract
        DERR_TOO_COMPRESSED     0x00004000 - файл(ы) пропущен(ы), т.к.
                                             превышен MaxCompressionRatio
        DERR_BAD_CALL           0x00008000 - неправильная команда
        DERR_EVAL_KEY           0x00010000 - DrWeb Daemon работает с
                                             демо-ключом
        DERR_SPAM               0x00020000 - файл(ы) отвергнут(ы) фильтром
                                             заголовков (возможно только при
                                             включенном фильтре заголовков)
    Затем, если были указаны дополнительные флаги:
        - вернуть имена вирусов:
          VirNum(INT) - кол-во обнаруженных вирусов, модификаций или
          подозрительных объектов, для каждого вируса:
            VirNameLen(INT) - длина записи;
            VirName(STRING(VirNameLen)) - запись вида:
               infected with EICAR Test File (NOT a Virus!)
               или
               possibly infected with COM.TSR Virus
        - вернуть строку отчета:
          LineNum(INT) - кол-во строк в отчете, для каждой:
            LineLen(INT) - длина строки;
            Line(STRING(LineLen)) - строка отчета, вида:
               test.zip - archive PKZIP
               или
               >test.zip/test.doc - Ok
               или
               >test.zip/eicar.com - infected with EICAR Test File (NOT a Virus!)
        - вернуть расширенные коды возврата:
            EventNum(INT) - кол-во пар (событие - кол-во возникновений), для
            каждой:
              EventCode(INT) - код события;
              EventOccurency(INT) - кол-во возникновений.
            Пример:
            2                       // количество пар
            DERR_KNOWN_VIRUS,    1  // один файл заражен известным вирусом
            DERR_TOO_COMPRESSED, 2  // два файла превысили коэффициент сжатия

        7.2. Использование библиотеки libdwclient.a
             (или ее thread-safe вариант libdwclient_r.a)

С исходными текстами фильтра поставляется библиотека, с помощью которой
достаточно легко писать собственные модули интеграции. Библиотека
собирается в двух вариантах non-thread-safe (-D__SIGNAL_BASED_DW) для
написания однопоточных модулей и thread-safe (-D__THREAD_BASED_DW) для
написания многопоточных модулей. Общий алгоритм работы с библиотекой
примерно такой:

- установить режим вывода посредством outputLib();
- инициализировать библиотеку startupLib();
- выполнять любые функции getVersion(), scanFile() и т.д.;
- очистить результаты сканирования clearResult();
- закрыть библиотеку cleanupLib().

Далее приведены коды возврата функций библиотеки:

DWL_NOERROR      - нет ошибок
DWL_COMMONERROR  - общая ошибка, как правило при вызовах ОС
DWL_IPCSYSTEM    - ошибка коммуникационного канала с демоном
                   (часто неправильный адрес)
DWL_BADFILE      - неправильный файл передан
DWL_BADPARAMS    - переданы неверные параметры
DWL_NOTSUPPORTED - данная возможность не поддерживается
DWL_ALREADYEXEC  - попытка вызвать startupLib второй раз,
DWL_RECVERROR    - ошибка передачи данных
DWL_SENDERROR    - ошибка приема данных
DWL_NOMEMORY     - нет памяти
DWL_NOTINIT      - библиотека не была инициализирована
DWL_TIMEDOUT     - истек таймаут

Далее приведены прототипы функций, IN - входной параметр, OUT - выходной
параметр, IN/OUT - параметр является как входным, так и выходным:

extern void outputLib( char* Location, int Level, int Facility, int Priority );
 - Установка режима вывода
 * IN: Location - вывод средствами syslog (NULL), на консоль ("console") или
                  в файл
 * IN: Level - уровень логирования
               DW_LL_ERROR - только ошибки
               DW_LL_ALERT - DW_LL_ERROR + исключительные ситуации (вирус)
               DW_LL_INFO  - DW_LL_ALERT + информация о чистых файлах
               DW_LL_VERBOSE - DW_LL_INFO + подробная информация
               DW_LL_DEBUG - DW_LL_VERBOSE + отладочные сообщения
 * IN: Facility - установка syslog facility (например LOG_MAIL, LOG_DAEMON)
 * IN: Priority - установка syslog priority (например LOG_INFO, LOG_ALERT)

extern void printLib( const int level, char const* fmt, ... );
 - Вывод информации библиотекой
 * IN: level - приоритет информации (см. файл dwc_log.h)
 * IN: fmt - форматная строка (полностью аналогично printf)

extern const char* getLibError( int code );
 - Получить строку-описание кода возврата библиотеки
 * IN: code - один из кодов возврата описанный ранее

extern const char* getDaemonCode( int code );
 - Получить строку-описание кода возврата демона
 * IN: code - один из кодов возврата демона

extern int  startupLib( const char *Address, int Timeout, int Cache );
 - Инициализация библиотеки
 * IN: Version - версия интерфейса с библиотекой
 *               (используйте константу CURRENT_LIB_VERSION)
 * IN: Address - строка с адресом демона, в виде {FAMILY}:{ADDRESS}
 *     допустимы следующие FAMILY:
 *      inet - для TCP сокета, тогда адрес - это inet:{PORT}@{HOST},
 *             PORT - номер порта, HOST - имя или IP-адрес хоста
 *             (например, inet:3000@localhost)
 *      local - для UNIX сокета, тогда адрес - это unix:{SOCKETFILE}
 *             SOCKETFILE - абсолютный путь к unix-сокету
 *             (например, local:/opt/drweb/run/drwebd.skt)
 *      pid - взять адрес демона из созданного им PidFile, file:{PIDFILE}
 *             PIDFILE - абсолютный путь к файлу
 *             (например, pid:/opt/drweb/run/drwebd.pid)
 * IN: Timeout - время в секундах - для выполнения одной функции scanFile,
 *     showID и т.д.;
 * IN: Cache - использовать кеширование IP-адреса демона (не 0 - разрешить,
       0 - запретить)

extern int  cleanupLib( void );
 - Закрытие библиотеки

extern int  getBases( char** list, int* total_records );
 - Получить список загруженных баз
 * OUT: list - строка со списком загруженных баз (освобождается вызывающим)
 * OUT: total_records - кол-во поисковых записей во всех базах

extern int  getDaemonID( char** id_string );
 - Получить информационную строку демона

 * OUT: id_string - идентификационная строка демона (освобождается вызывающим)

extern int  getVersion( int* major, int* minor );
 - Получить версию демона
 * OUT: major - основная версия
 * OUT: minor - младшая версия

extern int  scanBuffer( void* Buffer, size_t BufferLen, int ScanOptions, int* result_ptr, char* log, size_t* loglen );
 - Сканировать фрагмент данных в памяти
 * IN: Buffer - указатель на память
 * IN: BufferLen - размер фрагмента
 * IN: ScanOptions - опции сканирования
 * IN/OUT: pResult - рез-тат сканирования (создается библиотекой)
 * IN: ReportMaxSize - макс. размер отчета демона (ноль, если нет ограничения)

extern int  scanFile( char* Path, size_t PathLen, int Local, int ScanOptions, int* result_ptr, char* log, size_t* loglen );
 - Сканировать файл
 * IN: Path - Указатель на имя файла (абсолютный путь, если параметр Local не 0)
 * IN: PathLen - длина имени файла
 * IN: Local - если 0, считать файл и послать его демону
 *             если не 0, передать имя файла демону для "локального сканирования"
 * IN: ScanOptions - опции сканирования
 * IN/OUT: pResult - рез-тат сканирования (создается библиотекой)
 * IN: ReportMaxSize - макс. размер отчета демона (ноль, если нет ограничения)

extern int  scanFilePart( char* Path, size_t PathLen, size_t Offset, size_t Length, int ScanOptions, int* result_ptr, char* log, size_t* loglen );
 - Сканировать фрагмент файла
 * IN: Path - Указатель на абсолютный путь к файлу
 * IN: PathLen - длина имени файла
 * IN: Offset - смещение от начала файла
 * IN: Length - длина фрагмента
 * IN: ScanOptions - опции сканирования
 * IN/OUT: pResult - рез-тат сканирования (создается библиотекой)
 * IN: ReportMaxSize - макс. размер отчета демона (ноль, если нет ограничения)

extern int  getResultStatus( dwc_scan_result_t Res );
 - Извлечение статус-кода из рез-татов сканирования
 * IN: Res - рез-тат сканирования (создается функциями scan*)
 * Return: комбинация битов возврата DERR_ см. файл dwc_scan.h

extern char*  getResultReport( dwc_scan_result_t Res );
 - Извлечение отчета демона из рез-татов сканирования
 * IN: Res - рез-тат сканирования (создается функциями scan*)
 * Return: отчет или строку "report was not requested", если отчет не создавался

extern int  clearResult( dwc_scan_result_t Res );
 - "Очистка" рез-татов сканирования
 * IN: Res - рез-тат сканирования (создается функциями scan*)


                8. Контакты

Как уже говорилось, программа Doctor Web находится в постоянном развитии.
Информацию о ее обновлениях можно получить на сайтах:

http://www.DialogNauka.ru
http://www.drweb.ru
http://www.drweb.ru/unix/forum
http://www.drweb.ru/unix

Свои отзывы, предложения и замечания Вы можете присылать в антивирусный
отдел ЗАО "ДиалогНаука":

Адрес: 117786 Москва, ул.Вавилова 40, ВЦ РАН, офис 103.

Проезд: ст. метро "Ленинский проспект" (выход к ул. Орджоникидзе),
        далее любым трамваем до остановки "Улица Губкина"
        (4-я остановка в сторону ст. метро "Университет").

Тел.(095)135-6253, 137-0150
Тел/факс 938-2970, 938-2855

FidoNet: 2:5020/69

WWW: http://www.DialogNauka.ru
FTP: ftp.DialogNauka.ru, ftp2.DialogNauka.ru, ftp3.DialogNauka.ru

E-mail: Antivir@DialogNauka.ru
         
Консультации для зарегистрированных пользователей осуществляются по
e-mail: Support@DialogNauka.ru, asv@drweb.ru

В письме желательно дать следующую дополнительную информацию, которая
поможет лучше разобраться в ситуации:

- название и версию дистрибутива Unix-системы;
- версию ядра и стандартной библиотеки libc;
- версии приложений и фильтров, с которыми интегрируется Doctor Web Daemon;
- версию программы Doctor Web Daemon.
