2017-08-30 71 views
-3

我試圖構建一些額外的安全性來檢查文件的md5哈希,並使用virustotal.com的搜索來檢查文件是否已被掃描(哈希匹配)和檢測。問題是他們的頁面有不可讀的HTML代碼。我聽說Html Agility Pack可以完成這項工作。當通過它的HTML無法獲取信息時

HtmlWeb web = new HtmlWeb(); 
HtmlDocument document = web.Load("https://virustotal.com/#/file/" + md5hash "/detection"); 

但是,我看到的每個Html Agility Pack示例都是關於HTML代碼的。任何想法我可以做到這一點?

+1

*尋求調試幫助(「爲什麼不是這個代碼的工作?」)問題必須包括所期望的行爲,一個具體問題庫中的GitHub的頁面一個例子或錯誤以及在問題本身中重現問題所需的最短代碼* –

回答

1

您不需要解析VirusTotal的HTML,它們具有旨在供計算機使用的API端點。可以在https://developers.virustotal.com/v2.0/reference

中找到文檔您甚至可以使用現有的庫,通過NuGet包VirusTotal.NET爲您包裝所有內容,以便您可以調用一個類並且它可以工作。

這裏是如何使用它

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Threading.Tasks; 
using VirusTotalNET.Objects; 
using VirusTotalNET.ResponseCodes; 
using VirusTotalNET.Results; 

namespace VirusTotalNET.Client 
{ 
    class Program 
    { 
     private const string ScanUrl = "http://www.google.com/"; 

     static void Main(string[] args) 
     { 
      RunExample().Wait(); 

      Console.WriteLine("Press a key to continue"); 
      Console.ReadLine(); 
     } 

     private static async Task RunExample() 
     { 
      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 
      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 = await 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 = await virusTotal.ScanFile(fileInfo); 
       PrintScan(fileResult); 
      } 

      Console.WriteLine(); 

      UrlReport urlReport = await virusTotal.GetUrlReport(ScanUrl); 

      bool hasUrlBeenScannedBefore = urlReport.ResponseCode == ReportResponseCode.Present; 
      Console.WriteLine("URL has been scanned before: " + (hasUrlBeenScannedBefore ? "Yes" : "No")); 

      //If the url has been scanned before, the results are embedded inside the report. 
      if (hasUrlBeenScannedBefore) 
      { 
       PrintScan(urlReport); 
      } 
      else 
      { 
       UrlScanResult urlResult = await virusTotal.ScanUrl(ScanUrl); 
       PrintScan(urlResult); 
      } 
     } 

     private static void PrintScan(UrlScanResult scanResult) 
     { 
      Console.WriteLine("Scan ID: " + scanResult.ScanId); 
      Console.WriteLine("Message: " + scanResult.VerboseMsg); 
      Console.WriteLine(); 
     } 

     private static void PrintScan(ScanResult scanResult) 
     { 
      Console.WriteLine("Scan ID: " + scanResult.ScanId); 
      Console.WriteLine("Message: " + scanResult.VerboseMsg); 
      Console.WriteLine(); 
     } 

     private static void PrintScan(FileReport fileReport) 
     { 
      Console.WriteLine("Scan ID: " + fileReport.ScanId); 
      Console.WriteLine("Message: " + fileReport.VerboseMsg); 

      if (fileReport.ResponseCode == ReportResponseCode.Present) 
      { 
       foreach (KeyValuePair<string, ScanEngine> scan in fileReport.Scans) 
       { 
        Console.WriteLine("{0,-25} Detected: {1}", scan.Key, scan.Value.Detected); 
       } 
      } 

      Console.WriteLine(); 
     } 

     private static void PrintScan(UrlReport urlReport) 
     { 
      Console.WriteLine("Scan ID: " + urlReport.ScanId); 
      Console.WriteLine("Message: " + urlReport.VerboseMsg); 

      if (urlReport.ResponseCode == ReportResponseCode.Present) 
      { 
       foreach (KeyValuePair<string, ScanEngine> scan in urlReport.Scans) 
       { 
        Console.WriteLine("{0,-25} Detected: {1}", scan.Key, scan.Value.Detected); 
       } 
      } 

      Console.WriteLine(); 
     } 
    } 
} 
+0

由於每分鐘檢查限制,因此無法快速檢查哈希數組。應該有另一種方式 – Nox

+0

如果你需要更快的反應,你可以得到高級API。 –