
Un outil de dépaquetage dynamique
Shinigami est un outil expérimental conçu pour détecter et dépaqueter les implants malveillants injectés via le process hollowing ou des routines génériques de packer.
L'outil fonctionne en hookant les fonctions NT liées au process hollowing et en marquant les pages mémoire nouvellement exécutables avec le bit de garde de page. Cette technique permet à Shinigami de détecter les changements indirects de flux, généralement causés par du shellcode ou du code dépaqueté, qui sont souvent révélateurs d'un malware. Shinigami crée l'exécutable cible dans un état suspendu et injecte une bibliothèque DLL appelée « Ichigo ». Cette bibliothèque hooke automatiquement toutes les fonctions nécessaires pour détecter et extraire l'implant. Une fois l'artefact entièrement extrait, l'outil tue le processus.
L'efficacité de Shinigami peut varier selon le malware ciblé. Cependant, c'est un ajout précieux à toute boîte à outils d'analyse de malware et il peut s'avérer utile pour détecter et analyser les malwares qui utilisent le process hollowing ou des routines génériques de packer.
Important : il s'agit d'un outil de dépaquetage dynamique et il ne doit pas être exécuté sur votre machine personnelle ni dans un laboratoire d'analyse statique
La méthode principale de Shinigami pour extraire les implants injectés par process hollowing consiste à hooker deux fonctions NT : NtResumeThread et NtWriteVirtualMemory. Voici comment cela fonctionne :
Hook NtResumeThread
Hook NtWriteVirtualMemory
--stop-at-write est passé.Le module de dépaquetage générique de Shinigami marque les zones mémoire nouvellement allouées avec le bit PAGE_GUARD ; il applique également ce bit si une zone mémoire existante voit ses protections remplacées par quelque chose d'exécutable. En utilisant des pages de garde, il peut suivre quelle zone mémoire va être utilisée pour allouer du shellcode ou des images PE.
Pour chaque shellcode détecté, Shinigami enregistre le shellcode brut lui-même sur le disque. Il scanne également cette région mémoire pour trouver d'éventuels fichiers PE et les enregistre également. Shinigami traite chaque exécution de shellcode différente comme une nouvelle étape, donc à la fin, vous aurez dans votre répertoire de travail des fichiers nommés filename_shellcode_STAGENUM.bin ou .exe.
L'outil dispose de plusieurs options :
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)
Quelques options importantes sont :
-o, --output : spécifie le répertoire dans lequel déposer les artefacts extraits. Par défaut, les artefacts extraits sont enregistrés dans un répertoire nommé output dans le répertoire de travail courant. Vous pouvez spécifier un autre répertoire en passant son chemin en argument.
--stop-at-write : cet argument est utilisé lors du dépaquetage d'un processus hollowed. Lorsque Shinigami détecte que le fichier PE est en cours d'écriture dans le processus hollowed, il arrête l'exécution et enregistre le fichier PE extrait. Cette option peut être utile si vous souhaitez éviter d'exécuter tout le processus hollowed et que vous n'avez besoin que d'extraire le code dépaqueté.
--verbose : affiche une sortie verbeuse. Cela peut être utile pour déboguer ou comprendre le fonctionnement interne de Shinigami.
![]() |
|---|
| Test avec Dridex |
Après l'extraction, le processus est tué et vous aurez (je l'espère) le PE extrait :
![]() |
|---|
| Implant extrait |
L'implant détecté sera extrait selon le format décrit dans la section méthodes de détection
![]() |
|---|
| Dépaquetage d'un loader aléatoire décrit ici |
Dans l'exemple ci-dessus, Shinigami a automatiquement détecté le comportement d'un loader générique et a extrait tous les shellcodes et images exécutés, sans nécessiter d'interrupteurs spécifiques pour activer ou désactiver la routine de dépaquetage. Cela a été possible car Shinigami partage certaines fonctions avec le module unhollow, en utilisant des hooks partagés fournis par la bibliothèque Gancho.
![]() |
|---|
| Dépaquetage de la DLL Emotet |
Shinigami prend également en charge les DLL et la capacité de reconstruire des binaires injectés à l'aide d'en-têtes DOS détachés. En particulier, des échantillons de malwares comme Emotet utilisent cette technique pour échapper aux scanners PE en mémoire. Shinigami détecte ces parties manquantes (en-tête DOS) et utilise des heuristiques pour les reconstruire.
Téléchargez votre version préférée sur la page Release.
Ce serait génial si vous aidiez ce projet, donc si vous le souhaitez, voici les dépendances et les étapes :
Veuillez ouvrir une issue ou une pull request pour toute modification que vous souhaitez apporter.
Cette superbe image de mascotte a été inspirée par Bleach et générée par Dall-E.