Здравствуйте, Хабрахабровцы!
Хотелось бы поделиться моим опытом создания мульти-антивирусного сканера.
В последнее время, появилось очень много платных сервисов проверки файлов антивирусами. Зачем платить, если можно сделать такой же самому?
Всё интересное под катом.
Linux сервер ( использовался CentOS )
Минимальная конфигурация:
Linux-версии антивирусов ( скачать можно здесь )
В архиве .rpm пакеты следующих антивирусов:
В процессе написания статьи, я увидел это.
Этот способ реализации, во-первых, дороговат ( Нам же может подойти VPS/VDS ),
во-вторых, совсем не понятно зачем использовать C++/Qt, если всё можно реализовать на PHP+AJAX ( Собственно так мы и будем делать ).

Для чего нужен парсинг выдачи антивирусов?
Пример выдачи ClamAV:
Я думаю, что намного лучше видеть не этот текст, а например это:

Все антивирусы ( по крайней мере в этом архиве ) устанавливаются без проблем.
Но установку Dr.Web, ESET NOD32 и BitDefender можно произвести только через графический установщик ( для сего был поднят VNC и всё поставилось без проблем ).
В антивирусах Dr.Web и ESET NOD32 использовалась trial лицензия.
Все антивирусы имеют консольный сканер.
Следующим шагом является написание PHP скрипта, который будет обрабатывать запросы.
Это была самая первая версия скрипта. Отображался полный вывод сканеров.
Далее скрипт был доработан. Появилась фильтрация выдачи антивирусов.
Для визуального ускорения процесса проверки, возникла идея прикрутить отображение статуса ( почти как на virustotal )

Реализовано — как получилось.
Файл с функцией проверки был разбит на разные скрипты.
Т.е. проверка файла антивирусом ClamAV была вынесена в файл clamav.php и т.д.
Далее с помощью JQuery была сделана функция которая, при загрузке файла, поочерёдно отправляла его местоположение на скрипты проверки.
При получении ответа от скрипта, результат замещал прогрессбар.
В конечном виде, дизайн имеет такой вид

Форма окошка была найдена на каком-то сайте о верстке.
Кнопочка была найдена там же.
Всё это является кроссбраузерным решением.
В рабочем состоянии:

У меня, не знавшего ни PHP, ни JS, на всё это ушло 3 дня.
Тот герой который запустит виндовый антивирус под вайном и заставит его работать — отпишись.
Хотелось бы поделиться моим опытом создания мульти-антивирусного сканера.
В последнее время, появилось очень много платных сервисов проверки файлов антивирусами. Зачем платить, если можно сделать такой же самому?
Всё интересное под катом.
Начинка
Linux сервер ( использовался CentOS )
Минимальная конфигурация:
- Оперативная память — от 1GB и более
- Процессор — от 2 MGh и мощнее (желательно, для некоторых антивирусов, двухядерный)
- Дисковое пространство — 5-10 GB должно вполне хватить ( если планируется более глобальный сервис, то конечно же нужно больше места )
- Канал — мне попался стандартный 100 MB/s
Linux-версии антивирусов ( скачать можно здесь )
В архиве .rpm пакеты следующих антивирусов:
- Avast! Free
- AVG Free
- BitDefender Free
- Dr.Web for linux
- ESET NOD32 for linux
- F-PROT Free
Начало
В процессе написания статьи, я увидел это.
Этот способ реализации, во-первых, дороговат ( Нам же может подойти VPS/VDS ),
во-вторых, совсем не понятно зачем использовать C++/Qt, если всё можно реализовать на PHP+AJAX ( Собственно так мы и будем делать ).
Принцип работы

- Юзер загружает файл
- Сервер выдаёт юзеру прогресс проверки
- Антивирус проверяет файл
- Результат проверки передаётся серверу
- Сервер парсит ответ от антивируса
- Сервер выдаёт ответ антивируса юзеру
Для чего нужен парсинг выдачи антивирусов?
Пример выдачи ClamAV:
/var/tmp/eicar.com.txt: Eicar-Test-Signature FOUND
----------- SCAN SUMMARY -----------
Known viruses: 976133
Engine version: 0.97
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 15.837 sec (0 m 15 s)
Я думаю, что намного лучше видеть не этот текст, а например это:

Установка антивирусов
Все антивирусы ( по крайней мере в этом архиве ) устанавливаются без проблем.
Но установку Dr.Web, ESET NOD32 и BitDefender можно произвести только через графический установщик ( для сего был поднят VNC и всё поставилось без проблем ).
В антивирусах Dr.Web и ESET NOD32 использовалась trial лицензия.
Все антивирусы имеют консольный сканер.
Следующий шаг
Следующим шагом является написание PHP скрипта, который будет обрабатывать запросы.
<?php
print "
<form enctype=\"multipart/form-data\" action=\"index.php\" method=\"post\">
<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"300000000000000\" />
<input name=\"userfile\" <input type=\"submit\" value=\"Send File\" />
</form>
<br>
";
$uploaddir = '/var/tmp/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
$outputclam = `clamscan $uploadfile`;
print "<h1>ClamAV</h1> <br>";
print $outputclam."<br>";
print "<br>MD5: ".md5_file($uploadfile);
print "<br>SHA-1: ".sha1_file($uploadfile);
} else {
print "Выберите файл для загрузки.";
print "</pre>";
?>
Это была самая первая версия скрипта. Отображался полный вывод сканеров.
Далее скрипт был доработан. Появилась фильтрация выдачи антивирусов.
Дальше — лучше.
Для визуального ускорения процесса проверки, возникла идея прикрутить отображение статуса ( почти как на virustotal )

Реализовано — как получилось.
Файл с функцией проверки был разбит на разные скрипты.
Т.е. проверка файла антивирусом ClamAV была вынесена в файл clamav.php и т.д.
Далее с помощью JQuery была сделана функция которая, при загрузке файла, поочерёдно отправляла его местоположение на скрипты проверки.
При получении ответа от скрипта, результат замещал прогрессбар.
Дизайн
В конечном виде, дизайн имеет такой вид

Форма окошка была найдена на каком-то сайте о верстке.
Кнопочка была найдена там же.
Всё это является кроссбраузерным решением.
В рабочем состоянии:

Заключение
У меня, не знавшего ни PHP, ни JS, на всё это ушло 3 дня.
Тот герой который запустит виндовый антивирус под вайном и заставит его работать — отпишись.