
Uno strumento di unpacking dinamico
Shinigami è uno strumento sperimentale progettato per rilevare ed estrarre gli impianti malware che vengono iniettati tramite process hollowing o routine generiche di packer.
Lo strumento opera agganciando (hook) le funzioni NT correlate al Process Hollowing e marcando le pagine di memoria appena rese eseguibili con il bit di guardia (page guard). Questa tecnica consente a Shinigami di rilevare cambi di flusso indiretti, tipicamente causati da shellcode o codice decompresso, che sono spesso indicativi di malware. Shinigami crea l'eseguibile target in uno stato sospeso e inietta una libreria DLL chiamata "Ichigo". Questa libreria aggancia automaticamente tutte le funzioni necessarie per rilevare ed estrarre l'impianto. Una volta che l'artefatto è stato completamente estratto, lo strumento termina il processo.
L'efficacia di Shinigami può variare a seconda del malware specifico che sta prendendo di mira. Tuttavia, è una preziosa aggiunta a qualsiasi toolkit di analisi malware e può rivelarsi utile per rilevare e analizzare malware che utilizzano process hollowing o routine generiche di packing.
Importante: Questo è uno strumento di unpacking dinamico e non dovrebbe essere eseguito sulla tua macchina personale o in un laboratorio di analisi statica
Il metodo principale di Shinigami per estrarre gli impianti iniettati tramite process hollowing prevede l'hooking di due funzioni NT: NtResumeThread e NtWriteVirtualMemory. Ecco come funziona:
Hook di NtResumeThread
Hook di NtWriteVirtualMemory
--stop-at-write.Il modulo unpacker generico di Shinigami marca le aree di memoria appena allocate con il bit PAGE_GUARD; applica inoltre questo bit se un'area di memoria esistente ha le proprie protezioni sostituite con qualcosa di eseguibile. Utilizzando le guard page, può tenere traccia di quale area di memoria verrà utilizzata per allocare shellcode o immagini PE.
Per ogni shellcode rilevato, Shinigami salva su disco lo shellcode grezzo stesso. Scansiona inoltre quella regione di memoria per trovare eventuali file PE e li salva. Shinigami tratta ogni esecuzione di shellcode diversa come un nuovo stadio, quindi alla fine avrai nella tua directory di lavoro file chiamati filename_shellcode_STAGENUM.bin or .exe.
Lo strumento ha alcune opzioni:
Usage: Shinigami [--help] [--version] [--output VAR] [--stop-at-write] [--verbose] [--only-executables] [--exported VAR] program_name
Positional arguments:
program_name Name of the program to execute
Optional arguments:
-h, --help shows help message and exits
-v, --version prints version information and exits
-o, --output Directory to dump artefacts
--stop-at-write Unhollow: Stop the execution when the PE file is being to be written
--verbose Display a verbose output
-p, --only-executables Only extract PE artefacts
-e, --exported Exported Function: Choose a exported function to execute if the target is a DLL (rundll will be used)
Alcune opzioni importanti sono:
-o, --output: Specifica la directory in cui salvare gli artefatti estratti. Di default, gli artefatti estratti verranno salvati in una directory chiamata output nella directory di lavoro corrente. Puoi specificare una directory diversa passando il suo percorso come argomento.
--stop-at-write: Questo argomento viene utilizzato durante l'unpacking di un processo svuotato (hollowed). Quando Shinigami rileva che il file PE sta per essere scritto nel processo svuotato, interrompe l'esecuzione e salva il file PE estratto. Questa opzione può essere utile se vuoi evitare di eseguire l'intero processo svuotato e devi solo estrarre il codice decompresso.
--verbose: Mostra un output dettagliato. Può essere utile per il debug o per comprendere il funzionamento interno di Shinigami.
![]() |
|---|
| Test contro Dridex |
Dopo l'estrazione, il processo viene terminato e avrai (spero) il PE estratto:
![]() |
|---|
| Impianto dumpato |
L'impianto rilevato verrà dumpato seguendo il formato descritto nella sezione metodi di rilevamento
![]() |
|---|
| Unpacking di un loader generico descritto qui |
Nell'esempio sopra, Shinigami ha rilevato automaticamente il comportamento di un loader generico ed ha estratto tutti gli shellcode e le immagini eseguiti al suo interno, senza richiedere opzioni specifiche per abilitare o disabilitare la routine di unpacking. Questo è stato possibile perché Shinigami condivide alcune funzioni con il modulo unhollow, utilizzando hook condivisi forniti dalla libreria Gancho.
![]() |
|---|
| Unpacking della DLL di Emotet |
Shinigami supporta anche le DLL e ha la capacità di ricostruire binari iniettati utilizzando header DOS staccati. In particolare, campioni di malware come Emotet usano questa tecnica per eludere gli scanner PE in memoria. Shinigami rileva queste parti mancanti (header DOS) e impiega euristiche per ricostruirle.
Scarica la tua versione preferita dalla pagina Release.
Sarebbe fantastico se aiutassi questo progetto, quindi se vuoi, ecco le dipendenze e i passaggi:
Apri una issue o una pull request per qualsiasi modifica desideri apportare.
Questa fantastica immagine mascotte è ispirata a Bleach ed è stata generata da Dall-E.