web-dev-qa-db-ja.com

.NETウイルススキャンAPI

ユーザーがアップロードしたファイルのウイルスをスキャンする必要があるWebアプリケーションを構築しています。

このようなものを構築した経験のある人は、これを稼働させる方法に関する情報を提供できますか?ウイルス対策ソフトウェアパッケージには、その機能にプログラムでアクセスするためのAPIがあると思いますが、詳細を理解するのは簡単ではないようです。

参考までに、アプリケーションはC#で記述されています。

40
Farinha

おそらく、システムコールを実行して、独立したプロセスを実行してスキャンを実行します。さまざまなベンダーのコマンドラインAVエンジンが多数あります。

8
Joe

使用前の重要な注意:TOS契約に注意してください。すべてのコンテンツへの完全なアクセス権を付与します。「コンテンツをアップロードまたは送信すると、VirusTotal(および私たちが協力しているもの)に、使用、編集、ホスト、保存、複製、変更を行うための、全世界のロイヤルティフリーの取り消し不可の譲渡可能なライセンスを付与します。二次的著作物を作成し、通信し、公開し、公に実行し、公に表示し、そのようなコンテンツを配布します。」

ローカルのアンチウイルスプログラムを使用する(つまり、プログラムを特定のアンチウイルス製品にバインドし、顧客にそのアンチウイルス製品をインストールするように要求する)代わりに、 VirusTotal.com のサービスを使用できます。

このサイトは無料のサービスを提供し、ファイルは多数のウイルス対策製品への入力として提供され、スキャンプロセスの結果である証拠を含む詳細なレポートを受け取ります。このようにして、ソリューションが特定のウイルス対策製品にバインドされなくなります(インターネットの可用性にバインドされていますが)。

このサイトは、スキャンエンジンへのプログラムによるアプローチを可能にするアプリケーションプログラミングインターフェイスも提供します。

ここでは、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年前の回答の良い更新であると思われるからです。

16
Steve

IAttachmentExecute APIを使用できます。

Windows OSには、インストールされているウイルス対策ソフトウェアを呼び出すための共通APIが用意されています(もちろん、必要なウイルス対策ソフトウェアはAPIをサポートしています)。ただし、ウイルス対策ソフトウェアを呼び出すためのAPIはCOMインターフェイススタイルのみを提供し、IDispatchはサポートしていません。そのため、このAPIの呼び出しは、.NET言語やスクリプト言語からは非常に困難です。

このライブラリをここからダウンロード 。NETのアンチウイルススキャナー または "NuGet"からVSプロジェクトへの参照を追加 AntiVirusScanner

たとえば、次のコードはファイルをスキャンします。

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

Microsoft Antivirus API をご覧ください。 COMを使用します。COMは、.NETとのインターフェースとして十分に簡単です。特にInternet ExplorerとMicrosoft Officeを指しますが、ファイルをオンデマンドスキャンするためにこれを使用できない理由はわかりません。

Windowsで実行される最新のスキャナーはすべて、このAPIを理解する必要があります。

7
Thorarin

さまざまなウイルススキャナにはAPIがあります。私が統合したのはソフォスです。 NortonにもAPIがあるのは確かですが、McAfeeにはありません(以前はそうでした)。どのウイルスソフトウェアを使用しますか? Metascan をチェックアウトすることをお勧めします。これにより、多くの異なるスキャナーとの統合が可能になりますが、年間のライセンス費用がかかります。 :-P

4
Craig

恥知らずなプラグインですが、チェックアウトしたいかもしれません https://scanii.com 、それは(REST)サービスとしてのマルウェア/ウイルス検出です。また、virustotalのAPI用語( https://www.virustotal.com/en/documentation/public-api/ )を読んで理解してください。商用利用を許可しないことは非常に明確です。

1
Rafael Ferreira

私にもこの要件がありました。ファイルをtcpリスニングポートに送信してオンデマンドスキャンを提供するclamAvアンチウイルスを使用しました。 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;
        }

簡単で詳細な例を示します here 。注:-同期スキャン方式は、最新のnugetでは使用できません。上記のようにコーディングする必要があります

ウイルスをテストするには、txtファイルで以下の文字列を使用できます

X5O!P%@ AP [4\PZX54(P ^)7CC)7} $ EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$ H + H *

1
Nithin Chandran
//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(); 
0
Priya Premkumar