API сканирования вирусов .NET

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

кто-нибудь с опытом в создании чего-то подобного может предоставить информацию о том, как это сделать? Я предполагаю, что пакеты антивирусных программ имеют API для доступа к их функциональности программно, но, похоже, нелегко получить руку на деталях.

FYI, приложение написано на C#.

10 ответов


Я бы, вероятно, просто сделал системный вызов для запуска независимого процесса для сканирования. Существует ряд AV-движков командной строки от различных поставщиков.


важное примечание перед использованием: Помните о соглашении TOS. Вы предоставляете им полный доступ ко всему: "когда вы загружаете или иным образом отправляете контент, вы даете VirusTotal (и тем, с кем мы работаем) всемирную, бесплатную, безотзывную и передаваемую лицензию на использование, редактирование, размещение, хранение, воспроизведение, изменение, создание производных работ, общение, публикацию, публичное выполнение, публичное отображение и распространение такого контента."

вместо использования локальной антивирусной программы (и, таким образом, привязка вашей программы к этому конкретному антивирусному продукту и запрос ваших клиентов, чтобы установить этот антивирусный продукт) вы можете использовать услугиVirusTotal.com

этот сайт предоставляет бесплатный сервис, в котором ваш файл предоставляется в качестве входных данных для многочисленных антивирусных продуктов, и вы получаете подробный отчет с доказательствами, полученными в результате процесса сканирования. Таким образом, ваше решение больше не привязано к определенному антивирусному продукту (хотя вы привязаны к доступности Интернета)

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

здесь a VirusTotal.NET библиотека для этого API
здесь сжатая документация об их API
вот документация с примерами на Python их интерфейс

и поскольку ни один ответ не является полным без кода, это взято непосредственно из образца клиента, поставляемого с VirusTotal.NET библиотека

static void Main(string[] args)
{
    VirusTotal virusTotal = new VirusTotal(ConfigurationManager.AppSettings["ApiKey"]);

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

    //Create the EICAR test virus. See http://www.eicar.org/86-0-Intended-use.html
    FileInfo fileInfo = new FileInfo("EICAR.txt");
    File.WriteAllText(fileInfo.FullName, @"X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*");

    //Check if the file has been scanned before.
    FileReport fileReport = virusTotal.GetFileReport(fileInfo);

    bool hasFileBeenScannedBefore = fileReport.ResponseCode == ReportResponseCode.Present;

    Console.WriteLine("File has been scanned before: " + (hasFileBeenScannedBefore ? "Yes" : "No"));

    //If the file has been scanned before, the results are embedded inside the report.
    if (hasFileBeenScannedBefore)
    {
        PrintScan(fileReport);
    }
    else
    {
        ScanResult fileResult = virusTotal.ScanFile(fileInfo);
        PrintScan(fileResult);
    }
    ... continue with testing a web site ....

}

отказ от ответственности
Я не имею к ним никакого отношения. Я пишу этот ответ только потому, что он кажется хорошим обновлением для этих 4-летних ответов.


вы можете использовать IATTACHMENTEXECUTE API.

ОС Windows предоставляют общий API для вызова антивирусного программного обеспечения, которое установлено (конечно, антивирусное программное обеспечение требуется поддержка API). Но API для вызова антивирусного программного обеспечения предоставляет только стиль com-интерфейса, не поддерживаемый IDispatch. Таким образом, вызов этого API слишком сложен с любого языка .NET и языка скриптов.

загрузите эту библиотеку отсюда Вирус Анти Сканер для .NET или добавьте ссылку на ваш проект VS из "NuGet"AntiVirusScanner

например, ниже код сканирования файла:

var scanner = new AntiVirus.Scanner();
var result = scanner.ScanAndClean(@"c:\some\file\path.txt");
Console.WriteLine(result); // console output is "VirusNotFound".

посмотри Microsoft Antivirus API. Он использует COM, с которым должно быть достаточно легко взаимодействовать .Сеть. Это относится конкретно к Internet Explorer и Microsoft Office, но я не понимаю, почему вы не сможете использовать для сканирования по требованию любого файла.

все современные сканеры, работающие в Windows, должны понимать этот API.


различные антивирусные сканеры имеют API. Один из них, с которым я интегрировался, - это Sophos. Я уверен, что у Norton также есть API, в то время как McAfee этого не делает (раньше). Какую вирусную программу вы хотите использовать? Вы можете проверить Metascan поскольку это позволит интегрировать со многими различными сканерами, но есть годовая стоимость лицензии. :- P


//Scan  
string start = Console.ReadLine();  
System.Diagnostics.Process scanprocess = new System.Diagnostics.Process();  
sp.StartInfo.WorkingDirectory = @"<location of your antivirus>";  
sp.StartInfo.UseShellExecute = false;  
sp.StartInfo.FileName = "cmd.exe";  
sp.StartInfo.Arguments = @"/c antivirusscanx.exe /scan="+filePath;  
sp.StartInfo.CreateNoWindow = true;  
sp.StartInfo.RedirectStandardInput = true;    
sp.StartInfo.RedirectStandardError = true; sp.Start();  
string output = sp.StandardOutput.ReadToEnd();  
//Scan results  
System.Diagnostics.Process pr = new System.Diagnostics.Process();      
pr.StartInfo.FileName = "cmd.exe";  
pr.StartInfo.Arguments = @"/c echo %ERRORLEVEL%";   
pr.StartInfo.RedirectStandardInput = true;    
pr.StartInfo.RedirectStandardError = true; pr.Start();  
output = processresult.StandardOutput.ReadToEnd();  
pr.Close(); 

бесстыдная вилка, но вы можете проверитьhttps://scanii.com, это в основном обнаружение вредоносных программ / вирусов в качестве службы (REST). Кроме того, убедитесь, что Вы читаете и понимаете термины API virustotal (https://www.virustotal.com/en/documentation/public-api/) - они очень ясны о не позволять коммерческое использование.


по моему опыту вы можете использовать COM для взаимодействия с некоторым антивирусным программным обеспечением. Но то, что я бы предложил, немного проще, просто проанализируйте результаты сканирования после сканирования. Все, что вам нужно сделать, это запустить процесс сканирования и указать его в файл/папку, которую вы хотите сканировать, сохранить результаты сканирования в файл или перенаправить stdout в приложение и проанализировать результаты.


вы можете попробовать использовать DevDragon.Ио.

Это веб-служба с API и .NET-клиентом DevDragon.Антивирус.Клиент вы можете получить от NuGet. Сканирование-это sub 200ms для файла 1MB.

дополнительная документация здесь: https://github.com/Dev-Dragon/Antivirus-Client

раскрытие: я работаю на них.


у меня также было это требование. Я использовал антивирус clamAv, который обеспечивает сканирование по требованию, отправляя файл в порт прослушивания tcp. Вы можете использовать nClam пакет nuget для отправки файлов в clamav.

        var clam = new ClamClient("localhost", 3310);
        var scanResult = clam.ScanFileOnServerAsync("C:\test.txt"); //any file you would like!
        switch (scanResult.Result.Result)
        {
            case ClamScanResults.Clean:
                Console.WriteLine("The file is clean!");
                break;
            case ClamScanResults.VirusDetected:
                Console.WriteLine("Virus Found!");
                Console.WriteLine("Virus name: {0}", scanResult.Result.InfectedFiles[0].FileName);
                break;
            case ClamScanResults.Error:
                Console.WriteLine("Woah an error occured! Error: {0}", scanResult.Result.RawResult);
                break;
        }

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

для тестирования вируса вы можете использовать следующую строку в

X5O!P%@AP[4\PZX54 (P^)7CC)7}$EICAR-СТАНДАРТНЫЙ-АНТИВИРУС-ТЕСТ-ФАЙЛ!$H+H*