Pull to refresh

Создание своего Virustotal

Здравствуйте, Хабрахабровцы!
Хотелось бы поделиться моим опытом создания мульти-антивирусного сканера.
В последнее время, появилось очень много платных сервисов проверки файлов антивирусами. Зачем платить, если можно сделать такой же самому?
Всё интересное под катом.

Начинка


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 ( Собственно так мы и будем делать ).
Принцип работы

image
  1. Юзер загружает файл
  2. Сервер выдаёт юзеру прогресс проверки
  3. Антивирус проверяет файл
  4. Результат проверки передаётся серверу
  5. Сервер парсит ответ от антивируса
  6. Сервер выдаёт ответ антивируса юзеру

Для чего нужен парсинг выдачи антивирусов?
Пример выдачи 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)


Я думаю, что намного лучше видеть не этот текст, а например это:

image

Установка антивирусов


Все антивирусы ( по крайней мере в этом архиве ) устанавливаются без проблем.
Но установку 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 )
image
Реализовано — как получилось.
Файл с функцией проверки был разбит на разные скрипты.
Т.е. проверка файла антивирусом ClamAV была вынесена в файл clamav.php и т.д.
Далее с помощью JQuery была сделана функция которая, при загрузке файла, поочерёдно отправляла его местоположение на скрипты проверки.
При получении ответа от скрипта, результат замещал прогрессбар.

Дизайн


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

Заключение


У меня, не знавшего ни PHP, ни JS, на всё это ушло 3 дня.
Тот герой который запустит виндовый антивирус под вайном и заставит его работать — отпишись.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.