Tabla de Contenidos

Hay una librería en Python que nos permite utilizar la API de virustotal, pero primero tendremos que instalarla con el siguiente comando:

pip install virustotal-python
pip install virustotal-api

ANALIZAR ARCHIVO NO EXISTENTE EN LA BASE DE DATOS DE VIRUSTOTAL

En caso de que el archivo no se encuentre subido a la base de datos de virustotal, primero debemos utilizar otra librería de python para realizar primero esa subida y luego poder analizarlo. Por tanto con este código podemos subir un archivo desde Python a virustotal:

import virustotal_python
import os.path
 
archivo = "prueba.py"
# Crea un diccionario que contenga el archivo para enviarlo para la codificación de varias partes
files = {"file": (os.path.basename(archivo), open(os.path.abspath(archivo), "rb"))}
 
with virustotal_python.Virustotal("API") as vtotal:
    resp = vtotal.request("files", files=files, method="POST")
    print(resp.json())

Aunque también podemos hacer este mismo código mucho más simple de esta forma:

import virustotal_python
 
archivo = "prueba.py"
files = {"file": ((archivo), open((archivo), "rb"))}
 
with virustotal_python.Virustotal("API") as vtotal:
    resp = vtotal.request("files", files=files, method="POST")
    print(resp.json())

Y ya está subido:

También podríamos analizar varios archivos que no se encuentren en la base de datos de virustotal a la vez:

from hashlib import md5
from virus_total_apis import PublicApi
import os
 
# AQUÍ SUBIMOS LOS ARCHIVOS
 
archivos = os.listdir()
 
# A PARTIR DE AQUÍ ES DONDE OBTENEMOS EL REPORTE
 
API_KEY = "974ab16a5f23d3c9997954dd01f253e2752f4a7b092a82cc3d68ecf06ff336f6"  # Reemplaza "TUI_API_KEY_AQUI" con tu clave API de VirusTotal.
api = PublicApi(API_KEY)
 
for archivo in archivos:
    with open(archivo, "rb") as f:
        file_content = f.read()
        file_hash = md5(file_content).hexdigest()
        response = api.get_file_report(file_hash)
 
        if response["response_code"] == 200:  # Entramos en este if si el escaneo fue exitoso.
            if "positives" in response["results"] and response["results"]["positives"] > 0:
                print(f"El archivo {archivo} es malicioso.")
            else:
                print(f"El archivo {archivo} es seguro.")
        elif response["response_code"] == 0:  # Entramos en este caso si el archivo no se encuentra en VirusTotal.
            print(f"El archivo {archivo} no se encuentra en la base de datos de VirusTotal.")
        else:
            print(f"No se pudo obtener el análisis del archivo {archivo}.")

Y este es el resultado:

ANALIZAR ARCHIVO EXISTENTE EN LA BASE DE DATOS DE VIRUSTOTAL

Si el archivo que queremos analizar ya se encuentra dentro de la base de datos de virustotal, podemos utilizar la librería virus_total_apis para hacer el análisis. Por tanto con este código podríamos conectarnos a virustotal y obtener el reporte de un archivo:

from hashlib import md5
from virus_total_apis import PublicApi
 
API_KEY = "API" # Importamos la API de virustotal.
api = PublicApi(API_KEY)
 
with open("pruebas.py", "rb") as f:
    file_hash = md5(f.read()).hexdigest() # Convertimos en hash todo el contenido del archivo.
response = api.get_file_report(file_hash) # Obtenemos la respuesta de virustotal
 
print(response)

También podemos utilizar sentencias condicionales que evalúen los resultados en forma de diccionario que nos ofrece virustotal:

from hashlib import md5
from virus_total_apis import PublicApi
 
# AQUÍ SUBIMOS LOS ARCHIVOS
 
archivos = ["pass.txt", "users.txt"]
 
# A PARTIR DE AQUÍ ES DONDE OBTENEMOS EL REPORTE
 
API_KEY = "API"  # Importamos la API de virustotal.
api = PublicApi(API_KEY)
 
for i in archivos:
    with open(i, "rb") as f:
        file_content = f.read()
        file_hash = md5(file_content).hexdigest()  # Convertimos en hash todo el contenido del archivo.
        response = api.get_file_report(file_hash)  # Obtenemos la respuesta de virustotal
        print(response)
 
        if response["response_code"] == 200: # Entramos en este if si el escaneo fue exito.
            if response["results"]["positives"] > 0: # Detecta que no haya ningún positivo, por lo que es malicioso.
                print("Archivo malicioso.")
            else:
                print("Archivo seguro.") # Si encuentra que es positivo se imprime esto.
        else:
            print("No ha podido obtenerse el análisis del archivo.")

DETECTAR LOS REPORTES QUE TIENE UN ARCHIVO

También podemos hacer que el script nos diga si un archivo tiene más de 10 o 15 reportes por ejemplo, simplemente accediendo al diccionario:

import hashlib
from virus_total_apis import PublicApi
 
API_KEY = "API"
api = PublicApi(API_KEY)
 
with open("pruebas.py", "rb") as f:
    file_hash = hashlib.md5(f.read()).hexdigest()
response = api.get_file_report(file_hash) 
 
# Aquí evalúa los resultados del análisis.
 
if response["response_code"] == 200: 
    if response["results"]["positives"] >= 15: # Detecta que no haya ningún positivo, por lo que es malicioso.
        print("El archivo tiene 15 o más reportes.")
    else:
        print("El archivo tiene menos de 15 reportes.") 
else:
    print("No ha podido obtenerse el análisis del archivo.")

Ahora otro ejemplo con otro archivo que sí tiene más de 15 reportes:

import hashlib
from virus_total_apis import PublicApi
 
API_KEY = "API" # Importamos la API de virustotal.
api = PublicApi(API_KEY)
 
with open("virus.exe", "rb") as f:
    file_hash = hashlib.md5(f.read()).hexdigest()
response = api.get_file_report(file_hash) 
 
# Aquí evalúa los resultados del análisis.
 
if response["response_code"] == 200: 
    if response["results"]["positives"] >= 15: # Detecta que no haya ningún positivo, por lo que es malicioso.
        print("El archivo tiene 15 o más reportes.")
    else:
        print("El archivo tiene menos de 15 reportes.") 
else:
    print("No ha podido obtenerse el análisis del archivo.")

ANALIZAR UN HASH VIRUSTOTAL PYTHON

Si quisiéramos analizar un hash, simplemente tendríamos que proporcionarlo de esta forma:

from virus_total_apis import PublicApi
 
API_KEY = "API" # Importamos la API de virustotal.
api = PublicApi(API_KEY)
 
hash_to_check = "81dc9bdb52d04dc20036dbd8313ed055" # Este es el hash que queremos analizar
response = api.get_file_report(hash_to_check) # Obtenemos la respuesta de virustotal
 
print(response)

Y esta es la respuesta: