Un file fattura.pdf.exe arriva come allegato a un dipendente. Prima ancora di pensare a un ambiente isolato per eseguirlo, ci sono decine di informazioni utili che si possono estrarre senza mai lanciarlo: chi altro lo ha già visto, cosa contiene in chiaro, come è strutturato. È l’analisi statica, il primo passo quasi sempre obbligato prima di qualsiasi esecuzione controllata.
Questo articolo copre gli strumenti e le tecniche di base dell’analisi statica di un eseguibile sospetto.
Il primo passo: l’hash, prima di tutto il resto
sha256sum campione_sospetto.exe
md5sum campione_sospetto.exe
Calcolare l’hash di un file prima di qualunque altra manipolazione serve a due scopi: identificarlo in modo univoco per confrontarlo con database noti, e garantire che ogni copia usata successivamente nell’analisi sia identica bit a bit all’originale (lo stesso principio di integrità visto nell’articolo sull’acquisizione forense).
Con l’hash in mano, il controllo su VirusTotal (tramite interfaccia web o API) mostra immediatamente se altri motori antivirus hanno già classificato quel file, e spesso anche il nome della famiglia di malware associata, risparmiando ore di analisi su una minaccia già nota e documentata pubblicamente.
Stringhe leggibili: cosa il malware non riesce a nascondere del tutto
strings campione_sospetto.exe | less
strings -n 8 campione_sospetto.exe | grep -i "http\|\.php\|cmd.exe\|powershell"
Il comando strings estrae ogni sequenza di caratteri stampabili contenuta nel file binario. Anche un malware ben scritto contiene spesso frammenti rivelatori: URL di comando e controllo, nomi di file temporanei che intende creare, comandi che intende eseguire, messaggi di errore in una lingua specifica. Non tutto il malware moderno è così generoso (molti campioni cifrano o offuscano le stringhe più sensibili), ma è sempre il primo controllo da fare, perché richiede pochi secondi e a volte risolve l’indagine da solo.
L’header PE: la carta d’identità di un eseguibile Windows
Ogni eseguibile Windows (.exe, .dll) segue il formato PE (Portable Executable), che nel proprio header contiene metadati preziosi anche senza eseguire una sola istruzione del programma:
# pefile via Python, o strumenti dedicati come PEStudio
python3 -c "
import pefile
pe = pefile.PE('campione_sospetto.exe')
print('Timestamp compilazione:', pe.FILE_HEADER.TimeDateStamp)
for entry in pe.DIRECTORY_ENTRY_IMPORT:
print(entry.dll.decode())
"
L’header PE rivela, tra le altre cose:
- Timestamp di compilazione: quando il binario è stato costruito (anche se falsificabile, spesso non lo è e fornisce un indizio temporale utile)
- Import table: quali funzioni delle DLL di sistema il programma dichiara di voler usare. Import come
VirtualAllocEx,WriteProcessMemoryeCreateRemoteThreadinsieme sono una combinazione classica associata a tecniche di process injection - Sezioni anomale: un eseguibile con una sezione dal nome insolito, dimensioni sproporzionate rispetto al resto del file o entropia molto alta (segno tipico di codice compresso o cifrato) merita attenzione immediata
Entropia: un indizio di compressione o cifratura
L’entropia misura quanto “casuali” appaiono i byte di un file, su una scala da 0 a 8. Un testo normale ha entropia bassa (pattern ricorrenti, lettere comuni), mentre dati compressi o cifrati si avvicinano a 8, perché statisticamente indistinguibili da rumore casuale. Un eseguibile con entropia complessiva molto alta è quasi sempre packed (compresso con un packer come UPX) o contiene payload cifrati che si decifrano solo a runtime, ed è uno dei segnali più affidabili per capire se serve poi anche un’analisi dinamica per vedere cosa succede “dopo” la decompressione.
YARA: scrivere regole per riconoscere una famiglia di malware
YARA permette di scrivere regole che descrivono pattern caratteristici di una famiglia di malware (stringhe specifiche, sequenze di byte, condizioni sull’header), utili sia per classificare un campione nuovo sia per cercare automaticamente varianti simili in un intero parco macchine.
rule sospetto_downloader_generico
{
strings:
$url_pattern = "http://" ascii
$ps_cmd = "powershell -enc" ascii wide
$mz_header = { 4D 5A }
condition:
$mz_header at 0 and $url_pattern and $ps_cmd
}
yara regola.yar campione_sospetto.exe
Una regola YARA ben scritta, una volta condivisa con la community o con altri team, permette di intercettare varianti future dello stesso malware anche prima che i tradizionali motori antivirus a firma aggiornino le proprie definizioni.
I limiti dell’analisi statica
L’analisi statica ha un limite intrinseco: un malware fortemente offuscato o packed nasconde il proprio comportamento reale fino all’esecuzione, quando il codice si decomprime o si decifra in memoria. Le stringhe più rivelatorie potrebbero non essere presenti nel file su disco proprio per questo motivo. Quando l’analisi statica arriva a un punto morto, il passo successivo naturale è osservare il campione mentre gira davvero, in un ambiente controllato: è il tema del prossimo articolo.
Checklist essenziale
✅ Hash (SHA-256) calcolato prima di ogni altra manipolazione
✅ Controllo hash su VirusTotal → classificazioni già note
✅ strings sul binario → URL, comandi, indizi in chiaro
✅ Import table dell'header PE → funzioni sospette (injection, process manipulation)
✅ Entropia complessiva del file → indizio di packing o cifratura
✅ Regole YARA → classificazione e ricerca di varianti
Conclusione
L’analisi statica è il modo più sicuro di iniziare a capire un campione sospetto, perché non richiede mai di eseguirlo davvero. Ha però un limite chiaro contro codice offuscato o packed, ed è esattamente il punto in cui l’analisi dinamica, in un ambiente isolato e controllato, diventa necessaria per vedere il comportamento reale del malware mentre agisce.
Nel prossimo articolo si passa proprio a quello: come si osserva un malware in azione, dentro un ambiente sicuro pensato per non lasciarlo scappare.