Class: VirusTotal::VirusTotal
- Inherits:
-
Object
- Object
- VirusTotal::VirusTotal
- Defined in:
- lib/virustotal/virustotal.rb
Instance Method Summary collapse
-
#initialize(api_key, timeout = 7, debug = false) ⇒ VirusTotal
constructor
Creates a new instance of the [VirusTotal] class.
-
#query_hash(hash) ⇒ VirusTotalResult
Queries a single hash on virustotal.com.
-
#query_site(url) ⇒ VirusTotalResult
Queries a single url on virustotal.com.
-
#query_upload(file) ⇒ Object
Fetch results from virustotal using a specific hash.
Constructor Details
#initialize(api_key, timeout = 7, debug = false) ⇒ VirusTotal
Creates a new instance of the [VirusTotal] class
9 10 11 12 13 |
# File 'lib/virustotal/virustotal.rb', line 9 def initialize(api_key, timeout = 7, debug = false) @api_key = api_key @timeout = timeout.to_i @debug = debug end |
Instance Method Details
#query_hash(hash) ⇒ VirusTotalResult
Queries a single hash on virustotal.com
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/virustotal/virustotal.rb', line 18 def query_hash hash begin puts "[*] Querying hash #{hash}" if @debug hash.chomp! if hash.include?('-') hash = hash.split('-')[0] end response = RestClient.post 'https://www.virustotal.com/api/get_file_report.json', { :resource => hash, :key => @api_key } results = VirusTotalResult.new hash, :hash, JSON.parse(response) return results rescue Exception => e puts e. puts e.backtrace.join("\n") STDERR.puts "[!] An error has occured. Retrying #{hash} in #{@timeout} seconds.\n" sleep @timeout #So we do not DOS virustotal.com we wait at least 5 seconds between each query retry end end |
#query_site(url) ⇒ VirusTotalResult
Queries a single url on virustotal.com
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/virustotal/virustotal.rb', line 42 def query_site url begin puts "[*] Querying url #{url}" if @debug response = RestClient.post 'https://www.virustotal.com/api/get_url_report.json', { :resource => url, :key => @api_key } results = VirusTotalResult.new url, :site, JSON.parse(response) return results rescue Exception => e puts e. puts e.backtrace.join("\n") STDERR.puts "[!] An error has occured. Retrying #{url} in #{@timeout} seconds\n" sleep @timeout #So we do not DOS virustotal.com we wait at least 5 seconds between each query retry end end |
#query_upload(file) ⇒ Object
Fetch results from virustotal using a specific hash
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/virustotal/virustotal.rb', line 61 def query_upload file results = Array.new file = file.chomp begin puts "[*] Attempting to upload file #{file}" if @debug response = RestClient.post 'https://www.virustotal.com/api/scan_file.json', { :key => @api_key, :file => File.new(file, 'rb') } result = JSON.parse(response) puts "[*] File #{file} uploaded, waiting for results this could take several minutes..." if @debug if result['result'] == 1 results = query_hash result['scan_id'] while results.results[0]['result'] == "Hash Not Found" puts "[*] File has not been analyized yet, waiting 60 seconds to try again" if @debug sleep 60 results = query_hash result['scan_id'] end elsif result['result'] == -2 puts "[!] Virustotal limits exceeded, ***do not edit the time out values.***" else fres = Hash.new fres['hash'] = file fres['scanner'] = '-' fres['version'] = '-' fres['date'] = '-' fres['result'] = "File failed to upload" results.push fres end rescue Exception => e puts e. puts e.backtrace.join("\n") STDERR.puts "[!] An error has occured. Retrying #{file} in #{@timeout} seconds\n" sleep @timeout #So we do not DOS virustotal.com we wait at least 5 seconds between each query retry end return results end |