# Malware Analysis with VirusTotal

## Script con colores:

```sh
pip install colorama
```

```python
import requests
import argparse
import sys
from colorama import init, Fore

init(autoreset=True)


API_KEY = 'TU_API_KEY_AQUI'  # Sustituye con tu clave API de VirusTotal
API_URL = 'https://www.virustotal.com/api/v3/files/'

def verificar_hash(archivo_hash):
    headers = {
        "x-apikey": API_KEY
    }
    url = API_URL + archivo_hash

    response = requests.get(url, headers=headers)

    if response.status_code == 200:
        data = response.json()
        stats = data["data"]["attributes"]["last_analysis_stats"]
        detections = data["data"]["attributes"]["last_analysis_results"]

        print(f"\n🔍 Hash: {archivo_hash}")
        print(f"{Fore.GREEN} ✔️ Detecciones - Malicioso: {stats['malicious']}, Sospechoso: {stats['suspicious']}, Limpio: {stats['undetected']}")

        # Mostrar motores que detectaron como malicioso
        print(Fore.CYAN + "\n🧪 Motores que detectaron como MALICIOSO:")
        mal_found = False
        for engine, result in detections.items():
            if result["category"] == "malicious":
                print(f"{Fore.RED} - {engine}: {result['result']}")
                mal_found = True
        if not mal_found:
            print(Fore.GREEN + " - Ninguno.")

        # Mostrar motores que lo marcaron como sospechoso
        print(Fore.CYAN + "\n⚠️ Motores que detectaron como SOSPECHOSO:")
        susp_found = False
        for engine, result in detections.items():
            if result["category"] == "suspicious":
                print(f"{Fore.YELLOW} - {engine}: {result['result']}")
                susp_found = True
        if not susp_found:
            print(Fore.GREEN + " - Ninguno.")
    elif response.status_code == 404:
        print(f"\n{Fore.RED} ❌ Hash no encontrado en VirusTotal: {archivo_hash}")
    else:
        print(f"\n{Fore.YELLOW}⚠️ Error al consultar {archivo_hash} - Código: {response.status_code}")

def main():
    parser = argparse.ArgumentParser(description="Consulta la reputación de hashes en VirusTotal")
    parser.add_argument("hashes", metavar="HASH", nargs="+", help="Hash(es) a consultar (MD5, SHA-1 o SHA-256)")
    args = parser.parse_args()

    for h in args.hashes:
        if len(h) not in [32, 40, 64]:
            print(f"{Fore.RED}❗ Hash inválido (no tiene longitud típica de MD5, SHA-1 o SHA-256): {h}")
            continue
        verificar_hash(h)

if __name__ == "__main__":
    if API_KEY == 'TU_API_KEY_AQUI':
        print(Fore.YELLOW + "⚠️ Debes introducir tu clave API de VirusTotal en el script antes de ejecutarlo.")
        sys.exit(1)
    main()
```

## Script sin colores:

```python
import requests
import argparse
import sys


API_KEY = 'TU_API_KEY_AQUI'  # Sustituye con tu clave API de VirusTotal
API_URL = 'https://www.virustotal.com/api/v3/files/'

def verificar_hash(archivo_hash):
    headers = {
        "x-apikey": API_KEY
    }
    url = API_URL + archivo_hash

    response = requests.get(url, headers=headers)

    if response.status_code == 200:
        data = response.json()
        stats = data["data"]["attributes"]["last_analysis_stats"]
        detections = data["data"]["attributes"]["last_analysis_results"]

        print(f"\n🔍 Hash: {archivo_hash}")
        print(f"✔️ Detecciones - Malicioso: {stats['malicious']}, Sospechoso: {stats['suspicious']}, Limpio: {stats['undetected']}")

        # Mostrar motores que detectaron como malicioso
        print("\n🧪 Motores que detectaron como MALICIOSO:")
        mal_found = False
        for engine, result in detections.items():
            if result["category"] == "malicious":
                print(f"- {engine}: {result['result']}")
                mal_found = True
        if not mal_found:
            print(" - Ninguno.")

        # Mostrar motores que lo marcaron como sospechoso
        print("\n⚠️ Motores que detectaron como SOSPECHOSO:")
        susp_found = False
        for engine, result in detections.items():
            if result["category"] == "suspicious":
                print(f"- {engine}: {result['result']}")
                susp_found = True
        if not susp_found:
            print(" - Ninguno.")
    elif response.status_code == 404:
        print(f"\n❌ Hash no encontrado en VirusTotal: {archivo_hash}")
    else:
        print(f"\n⚠️ Error al consultar {archivo_hash} - Código: {response.status_code}")

def main():
    parser = argparse.ArgumentParser(description="Consulta la reputación de hashes en VirusTotal")
    parser.add_argument("hashes", metavar="HASH", nargs="+", help="Hash(es) a consultar (MD5, SHA-1 o SHA-256)")
    args = parser.parse_args()

    for h in args.hashes:
        if len(h) not in [32, 40, 64]:
            print(f"❗ Hash inválido (no tiene longitud típica de MD5, SHA-1 o SHA-256): {h}")
            continue
        verificar_hash(h)

if __name__ == "__main__":
    if API_KEY == 'TU_API_KEY_AQUI':
        print("⚠️ Debes introducir tu clave API de VirusTotal en el script antes de ejecutarlo.")
        sys.exit(1)
    main()

```

## Uso:

```sh
python3 hash.py <hash>
```

<figure><img src="https://1937981690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FzuuWuDn9s4dQ1J0kb7tE%2Fuploads%2FB3JZ1afeQMGiKVb6ZsVS%2Fimage.png?alt=media&#x26;token=9f94126a-938e-4e5f-a4c4-99e724dc128b" alt=""><figcaption></figcaption></figure>
