Outil en ligne de commande qui interroge l'API VirusTotal v3 pour un fichier donné et produit un rapport Markdown lisible : verdict consolidé, moteurs ayant levé une détection, classification de la menace.
Écrit pour le tri de fichiers suspects au quotidien — le genre de vérification qu'on fait vite, souvent, et qu'on veut pouvoir archiver ou joindre à un ticket.
Le fichier est d'abord haché en local, puis recherché sur VirusTotal par son SHA-256. Si l'échantillon est déjà connu — c'est le cas de l'immense majorité des malwares en circulation — le rapport arrive en une seule requête, sans transmettre le moindre octet du fichier.
L'envoi n'a lieu que si le hash est inconnu, et uniquement avec --upload.
C'est délibéré : tout fichier soumis à VirusTotal devient accessible à la
communauté. Un document interne envoyé par réflexe est une fuite de données.
fichier
│
SHA-256 local
│
GET /files/{sha256}
│
┌─────┴─────┐
connu inconnu
│ │
│ --upload ? ── non ──▶ arrêt, rien n'est transmis
│ │ oui
│ POST /files
│ │
│ sondage /analyses/{id}
│ │
└─────┬──────┘
│
rapport Markdown
git clone https://github.com/NoaMatout/Malware_Analyzer.git
cd Malware_Analyzer
pip install -r requirements.txtIl faut une clé API VirusTotal, disponible gratuitement dans les réglages du compte : https://www.virustotal.com/gui/my-apikey
export VT_API_KEY="votre_cle" # Linux / macOS
$env:VT_API_KEY = "votre_cle" # PowerShellLa clé est lue depuis l'environnement, jamais demandée en clair à l'écran ni écrite sur le disque.
# Fichier déjà connu de VirusTotal — aucune transmission
python malware_analyzer.py suspect.exe
# Autoriser l'envoi si le hash est inconnu
python malware_analyzer.py suspect.exe --upload
# Choisir la destination du rapport
python malware_analyzer.py suspect.exe -o rapports/incident-4821.md| Option | Rôle |
|---|---|
-o, --output |
Chemin du rapport (défaut : rapport-virustotal.md) |
-t, --template |
Template Jinja2 personnalisé |
--upload |
Autorise l'envoi du fichier si son hash est inconnu |
| Code | Signification |
|---|---|
0 |
Aucune détection |
1 |
Fichier signalé comme malveillant ou suspect |
2 |
Erreur (clé absente, quota dépassé, fichier introuvable) |
Ces codes rendent l'outil scriptable — par exemple en boucle sur un répertoire de pièces jointes mises en quarantaine :
for f in /quarantaine/*; do
python malware_analyzer.py "$f" -o "rapports/$(basename "$f").md" \
|| echo "À examiner : $f"
doneUn rapport complet généré sur un échantillon WannaCry est disponible dans
docs/exemple-rapport.md — 61 moteurs sur 72 le
classent malveillant.
Le rendu est piloté par templates/report.md.j2.
Les variables exposées au template :
| Variable | Contenu |
|---|---|
name |
Nom le plus courant associé à l'échantillon |
sha256, size, file_type |
Caractéristiques du fichier |
threat_label |
Classification consolidée (ex. ransomware.wannacry) |
stats |
Répartition des verdicts par catégorie |
reputation, votes |
Réputation et votes de la communauté |
detections |
Moteurs ayant levé une détection, hors moteurs muets |
Ce dépôt ne contient volontairement aucun binaire malveillant. Pour vérifier que l'outil fonctionne, le fichier de test EICAR suffit : il est inoffensif, mais reconnu par tous les antivirus.
printf '%s' 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > eicar.com
python malware_analyzer.py eicar.comVotre antivirus va probablement mettre le fichier en quarantaine dès sa création — c'est le comportement attendu.
- L'API publique est plafonnée à 4 requêtes par minute et 500 par jour.
- Au-delà de 32 Mo, l'envoi passe par un point d'entrée dédié (géré automatiquement).
- Un verdict VirusTotal est un faisceau d'indices, pas une preuve. Les faux positifs sur binaires peu diffusés ou compilés maison sont fréquents.
MIT — voir LICENSE.