Analisi Malware con Ghidra: Tecnica e Filosofia
La catena è forte quanto il suo anello più debole. — Variante di John C. Maxwell.
L’analisi del malware richiede una combinazione di precisione tecnica e intuizione. Ghidra, il decompiler open source sviluppato da NSA, offre strumenti potenti per decifrare codice malevolo, ma la sua efficacia dipende da come si utilizza. Il lavoro non è solo un’operazione logica: è una pratica che richiede attenzione, pazienza e una visione sistemica. Come il taoismo insegna, l’obiettivo non è vincere la battaglia, ma comprendere il flusso del sistema.

Lavorare con Ghidra: Dal Flusso alla Comprensione
Importazione e Analisi Iniziale
Il primo passo è importare un binario nel progetto di Ghidra. La funzione New Project permette di gestire batch di campioni, ma la chiave è l’analisi automatica: abilitare il default analysis e configurare i parametri del decompiler (es. Decompiler Parameter ID). Questo crea un “mappa mentale” del codice, simile a una rete di relazioni che permette di navigare tra funzioni, stringhe e riferimenti.
La sezione Defined Strings è un’arma cruciale: ogni stringa identificata è un potenziale indizio su comportamenti malevoli (es. CreateProcess, InternetOpen). Seguire i cross-references (xrefs) permette di tracciare il flusso del malware, come un monaco che osserva la mente senza giudicare.
Pseudo-C: La Lingua dei Sistemi
Il decompiler genera codice pseudo-C, ma non è una traduzione perfetta. I tipi e i nomi sono indotti: può confondere union vs struct o sbagliare puntatori. Per verificare, confrontare il listing disassembly con il graph di flusso. Questo processo richiede un’attenzione simile a quella del buddismo: osservare senza reagire, capire senza giudicare.
Un buon decompiler non è un manuale di 100 pagine, ma una guida chiara. Se un evento è un incendio, il pseudo-C deve essere l’estintore, non un’inchiesta infinita.
Identificare le Funzioni Critiche: WinMain e DllMain
Per i file PE (Portable Executable), cercare le funzioni di entry point come WinMain o main. Ghidra spesso etichetta l’entry point con il nome entry, ma è necessario seguire le chiamate iniziali fino al codice “utente”, non al boilerplate.
Le DLL, invece, esportano DllMain, che viene eseguito al caricamento. L’evento DLL_PROCESS_ATTACH è un punto di ingresso per il side-load o il hijack: un sistema sicuro deve riconoscerlo come un segnale, non come una minaccia da combattere.
Ghidra Headless: Automatizzare il Processo
Per analisi a larga scala (es. centinaia di campioni al giorno), utilizzare il headless mode. Questo permette di esportare stringhe definite o generare file .c per confronti. Esempio di comando:
analyzeHeadless /tmp/ghproject Proj1 -import /samples/a.exe -postScript ExportDecompile.java -deleteProject
Lo script Java ExportDecompile.java estrae il pseudo-C delle funzioni, ma è fondamentale gestire timeout eccessivamente bassi: un codice complesso può troncare la decompilazione. In batch, loggare i fallimenti per evitare di perdere dati critici.
Confronto con IDA: Differenze e Similitudini
IDA è ancora diffuso per plugin commerciali o target embedded, ma Ghidra offre un vantaggio: costo zero e scripting integrato. Per team misti, esportare risultati in formato comune (es. JSON di funzioni) permette una collaborazione fluida.
La differenza principale è nella gestione delle analisi automatizzate: Ghidra si adatta a processi CI/CD, mentre IDA richiede intervento manuale. Per un SOC, questa flessibilità è fondamentale.
Anti-Decompilation: La Battaglia Silenziosa
Packer e obfuscation VM-based complicano la decompilazione. La strategia è cercare stub di unpack o utilizzare breakpoint dinamici (Parte IV). Per analisi avanzate, lavorare su dump post-unpack da memoria (Capitolo 8) permette di superare le tecniche anti-analysis.
Questo processo richiede una mente attenta: come il taoismo insegna, non si combatte la resistenza, ma si scorre intorno a essa.
Checklist per un Analisi Efficace
- [ ] Analisi completata senza errori critici nel log.
- [ ] Stringhe con xref riviste (top 20 sospette).
- [ ] Funzioni con chiamate API di rete/crypto nominate.
- [ ] Note di sessione salvate nel progetto (per handoff tra analisti).
Domande Frequenti
Come gestire un campione packed?
Utilizzare il headless mode per automatisare l’analisi post-unpack. Identificare i stub di unpack e verificare la decompilazione su dump da memoria.
Qual è il vantaggio principale di Ghidra rispetto a IDA?
Ghidra offre scripting integrato e un costo zero, ideale per processi CI/CD. IDA è più adatto a analisi manuale o target embedded.
Come riconoscere un codice obfuscated con VM-based?
Cercare segnali come chiamate a emulazione di CPU o funzioni di inizializzazione di ambiente virtuale. L’analisi dinamica è fondamentale per superare queste tecniche.