VirusTotal: перевіряємо файли на віруси в один клік



Може бути безліч причин, чому на тому або іншому комп'ютері ви не поставите антивірусне програмне забезпечення: слабке залізо або просте небажання ділити його з постійно які жеруть ресурси антивірусом, впевненість у своїх діях на комп'ютері або дорожнеча, особливо для серверних версій операційних систем. З останнім, до речі, постійно стикаються користувачі віртуальних серверів (так званих VPS / VDS), конфігурацій більшості яких ледь вистачає для нормальної роботи сучасного браузера, а провайдер надає виключно серверну версію Windows.

Будучи одним з таких користувачів, де далеко не скрізь встановлений повноцінний антивірус, постійно доводиться залазити на онлайн ресурси для перевірки тих або інших файлів. Оптимізувати цей процес я сьогодні і вирішив.

Найбільш простим і популярним серед таких ресурсів (і приємний особисто мені) є virustotal.com, у якого є відкритий API і використання його від вас нічого не вимагає, крім реєстрації на сайті.
Ідеальним варіантом для мене стала реалізація з додатковою кнопкою, у контекстному меню Windows, яке з'являється при натисканні правою кнопкою миші по будь-якому файлу.




Саме так ми і зробимо, в чому, власне, нам допоможе редактор реєстру Windows.
Відкриваємо шлях
HKEY_CLASSES_ROOT\*\shell

І створюємо новий розділ з бажаним назвою кнопки, наприклад, «Перевірити на VirusTotal»



У цьому розділі можна вказати іконку для нашої кнопки. Її я взяв безпосередньо з сайту virustotal і зберіг по шляху, який ви бачите на картинці вище.
Далі створюємо розділ «command», де в полі за замовчуванням вказуємо шлях до нашого додатком, яке й буде обробляти клік по кнопці в контекстному меню.



У мене вийшов шлях
D:\Check_On_VirusTotal\check.exe 1990854a5b8b30998b8cb1ae1840d0a90c8adda12a53cdffca55d1e3c5d16a88 %1

Тут через пробіл вказані 3 значення:
  1. Адреса виконуваного файлу
  2. Мій ключ API для virustotal, який я вирішив не вшивати жорстко в код програми
  3. %1 – при передачі на наш додаток повним шляхом до перевіряється файлу


Після того, як контекстне меню налаштоване можна переходити до другого кроку – створення програми обробника.
Я зробив її на звичайному Windows Forms, де весь код засунув в метод Form_Load. Спочатку була думка зробити консольним додатком, однак при виклику воно б миготіло до завершення роботи, а мені цього не хотілося. У властивостях фоми WinForm можна легко задати такі параметри як ShowInTaskbar:false, ShowIcon:false і Opacity:0%
Код вийшов такий:

private void Form1_Load(object sender, EventArgs e){
string[] args = Environment.GetCommandLineArgs();//беремо масив переданих параметрів
if (args != null && args.Length >= 3){

string apiKey = args[1].Trim(), //отримуємо з аргументів ключ API для virustotal.com
fileName = string.Join(" ", args, 2, args.Length - 2);//отримуємо шлях до перевіряється файлу

if (string.IsNullOrEmpty(apiKey)) MessageBox.Show("Порожній ключ API");
else if (!File.Exists(fileName)) MessageBox.Show("Файл не знайдений");
else if (new FileInfo(fileName).Length > 128 * 1024 * 1024) MessageBox.Show("Розмір файлу перевищує 128 МБ");
else{

//проста функція для отримання значення параметра з рядка в форматі JSON
Func<string, string, string> getJsonValue = delegate(string source, string key){
int from = source.IndexOf(key + "\":"), to = from > 0 ? source.IndexOf(",", from) : -1;
if (from > 0 && to > 0)
return source.Substring(from + (key + "\":").Length, to - from - (key + "\":").Length).Replace("\"", "").Trim();
return null;
};

var nvc = new NameValueCollection();
nvc.Add("apikey", apiKey);
using (var webClient = new WebClient() { QueryString = nvc }){
webClient.Headers.Add("Content-type", "binary/octet-stream");
//завантажуємо вибраний файл на сервер virustotal
string uploadResult =
Encoding.Default.GetString(webClient.UploadFile("https://www.virustotal.com/vtapi/v2/file/scan", "post", fileName));
//отримуємо в результаті унікальний для даного файлу ID (він же SHA256)
string resourceId = getJsonValue(uploadResult, "resource");
if (!string.IsNullOrEmpty(resourceId)){
nvc = new NameValueCollection();
nvc.Add("resource", resourceId);
//перевіряємо чи вже відразу результатів для даного файлу на випадок якщо він перевірявся кимось раніше
string checkResult =
Encoding.Default.GetString(webClient.UploadValues("https://www.virustotal.com/vtapi/v2/file/report", nvc));
string response_code = getJsonValue(checkResult, "response_code");
//запускаємо процес браузера за замовчуванням
System.Diagnostics.Process.Start(response_code == "1" ?
//якщо хто-то цей файл вже перевіряв, то просто відкриваємо сторінку з результатами
"https://www.virustotal.com/file/" + resourceId + "/analysis/" :
//якщо файл до цього не перевірявся, то відкриваємо сторінку і чекаємо вже на ній перевірки файлу
getJsonValue(uploadResult, "permalink")
);
}
}

}
}
this.Close();//закриваємо додаток
}

Якщо будете пробувати, використовуйте свій ключ API, вони не безлімітні і мають обмеження за замовчуванням в 4 запиту в хвилину.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.