Как определить, заражен ли файл вирусом, с помощью библиотеки VirusTotal.NET в C #? - PullRequest
0 голосов
/ 14 января 2019

В настоящее время я использую пакет nuget VirusTotal.NET в своем проекте C # MVC для сканирования загруженных файлов. Я использую тот же пример, приведенный здесь https://github.com/Genbox/VirusTotal.NET

VirusTotal virusTotal = new VirusTotal("YOUR API KEY HERE");

//Use HTTPS instead of HTTP
virusTotal.UseTLS = true;

//Create the EICAR test virus. See http://www.eicar.org/86-0-Intended-use.html
byte[] eicar = 
Encoding.ASCII.GetBytes(@"X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*");

//Check if the file has been scanned before.
FileReport report = await virusTotal.GetFileReportAsync(eicar);

Console.WriteLine("Seen before: " + (report.ResponseCode == FileReportResponseCode.Present ? "Yes" : "No"));

Я загружаю байтовый массив загруженного файла в переменную eicar в приведенном выше коде. В соответствии с приведенным примером, он будет обеспечивать сканирование файла ранее или нет. Но что мне действительно нужно, так это файл заражен или нет. Кто-нибудь может предложить мне решение?

1 Ответ

0 голосов
/ 14 января 2019

Проверяя класс UrlReport , отчет, который вы получаете, содержит гораздо больше информации, чем просто код ответа в их примере кода. Есть 3 поля, которые выглядят интересными:

/// <summary>
/// How many engines flagged this resource.
/// </summary>
public int Positives { get; set; }

/// <summary>
/// The scan results from each engine.
/// </summary>
public Dictionary<string, UrlScanEngine> Scans { get; set; }

/// <summary>
/// How many engines scanned this resource.
/// </summary>
public int Total { get; set; }

Это может дать вам результаты, которые вы ищете. VirusTotal фактически возвращает результаты для нескольких модулей сканирования, некоторые из которых могут обнаружить вирус, а некоторые нет.

Console.WriteLine($"{report.Positives} out of {report.Total} scan engines detected a virus.");

С этими данными вы можете делать все, что угодно, например, рассчитывать процент:

var result = 100m * report.Positives / report.Total;
Console.WriteLine($"{result}% of scan engines detected a virus.");

Или просто относитесь к большинству положительных результатов сканирования как к общему положительному результату:

var result = Math.Round(report.Positives / Convert.ToDecimal(report.Total));
Console.WriteLine($"Virus {(result == 0 ? "not detected": "detected")});
...