Shinigami est un outil expérimental conçu pour détecter et décompresser les implants de logiciels malveillants injectés via des processus de creusement ou des routines de compression génériques.
L'outil fonctionne en accrochant les fonctions NT liées au Process Hollowing et en marquant les pages de mémoire nouvellement exécutables avec le bit de garde de page. Cette technique permet à Shinigami de détecter les changements de flux indirects, généralement provoqués par un shellcode ou du code décompressé, 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 accroche automatiquement toutes les fonctions nécessaires pour détecter et extraire l'implant. Une fois l’artefact entièrement extrait, l’outil arrêtera le processus.
L'efficacité du Shinigami peut varier en fonction du malware spécifique qu'il cible. Cependant, il s’agit d’un ajout précieux à toute boîte à outils d’analyse de logiciels malveillants et peut s’avérer utile pour détecter et analyser les logiciels malveillants qui utilisent des routines de compression de processus ou de packer génériques.
Important : Il s'agit d'un outil de décompression dynamique et ne doit pas être exécuté sur votre ordinateur personnel ou dans un laboratoire d'analyse statique.
La méthode principale de Shinigami pour extraire les implants injectés à l'aide du processus de creusement implique l'accrochage de deux fonctions NT : NtResumeThread et NtWriteVirtualMemory. Voici comment cela fonctionne :
Crochet NtResumeThread
Crochet NtWriteVirtualMemory
--stop-at-write
est passé. Le module de décompression générique de Shinigami marque les zones de mémoire nouvellement allouées avec le bit PAGE_GUARD, il applique également ce bit si une zone de 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 lui-même le shellcode brut sur le disque. Il analyse également cette région de mémoire pour trouver tous les fichiers PE et les enregistre également. Shinigami traite chaque exécution de shellcode comme une nouvelle étape, donc à la fin, vous aurez votre répertoire de travail avec des fichiers appelés filename_shellcode_STAGENUM.bin or .exe
.
L'outil propose 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)
Certaines options importantes sont :
-o, --output : Spécifie le répertoire dans lequel vider les artefacts extraits. Par défaut, les artefacts extraits seront enregistrés dans un répertoire appelé sortie dans le répertoire de travail actuel. Vous pouvez spécifier un répertoire différent en passant son chemin comme argument.
--stop-at-write : Cet argument est utilisé lors du déballage d'un processus creux. Lorsque Shinigami détecte que le fichier PE est en cours d'écriture dans le processus creux, il arrêtera l'exécution et enregistrera le fichier PE extrait. Cette option peut être utile si vous souhaitez éviter d'exécuter l'intégralité du processus évidé et devez uniquement extraire le code décompressé.
--verbose : affiche une sortie détaillée. Cela peut être utile pour déboguer ou comprendre le fonctionnement interne de Shinigami.
Test contre Dridex |
Une fois l'extraction terminée, le processus est tué et vous aurez (je l'espère) le PE extrait :
Implant sous-évalué |
L'implant détecté sera vidé selon le format décrit dans la section Méthodes de détection.
Déballage d'un chargeur aléatoire décrit ici |
Dans l'exemple ci-dessus, Shinigami a automatiquement détecté le comportement d'un chargeur générique et a extrait tous les shellcodes et images exécutés qu'il contient, sans nécessiter de commutateurs spécifiques pour activer ou désactiver la routine de décompression. 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éballage de la DLL Emotet |
Shinigami prend également en charge les DLL et a la possibilité de reconstruire les binaires injectés à l'aide d'en-têtes DOS détachés. Notamment, des échantillons de logiciels malveillants comme Emotet utilisent cette technique pour échapper aux scanners PE en mémoire. Shinigami détecte ces pièces manquantes (en-tête DOS) et utilise des heuristiques pour les reconstruire.
Prenez votre saveur 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 un problème ou une pull request pour toute modification que vous souhaitez apporter.
Cette image de mascotte sympa a été inspirée par Bleach et générée par Dall-E.