
A dynamic unpacking tool
Shinigami ist ein experimentelles Tool, das dazu entwickelt wurde, Malware-Implantate zu erkennen und zu entpacken, die per Process Hollowing oder generische Packerroutinen injiziert werden.
Das Tool funktioniert, indem es NT-Funktionen im Zusammenhang mit Process Hollowing hookt und neu ausführbare Speicherseiten mit dem Page-Guard-Bit markiert. Diese Technik ermöglicht es Shinigami, indirekte Kontrollflussänderungen zu erkennen, die typischerweise durch Shellcode oder entpackten Code verursacht werden und oft auf Malware hindeuten. Shinigami erstellt die Zielausführungsdatei in einem angehaltenen Zustand und injiziert eine DLL-Bibliothek namens „Ichigo". Diese Bibliothek hookt automatisch jede notwendige Funktion, um das Implantat zu erkennen und zu extrahieren. Sobald das Artefakt vollständig extrahiert wurde, beendet das Tool den Prozess.
Die Effektivität von Shinigami kann je nach der konkret angezielten Malware variieren. Es ist jedoch eine wertvolle Ergänzung für jedes Toolkit zur Malware-Analyse und kann sich als nützlich erweisen, um Malware zu erkennen und zu analysieren, die Process Hollowing oder generische Packerroutinen verwendet.
Wichtig: Dies ist ein dynamisches Entpackungstool und sollte nicht auf Ihrem persönlichen Rechner oder in einem statischen Analyselabor ausgeführt werden
Die Kernmethode von Shinigami zum Extrahieren von Implantaten, die per Process Hollowing injiziert wurden, besteht darin, zwei NT-Funktionen zu hooken: NtResumeThread und NtWriteVirtualMemory. So funktioniert es:
NtResumeThread Hook
NtWriteVirtualMemory Hook
--stop-at-write übergeben wird.Das generische Unpacker-Modul von Shinigami markiert neu allokierte Speicherbereiche mit dem PAGE_GUARD-Bit. Es setzt dieses Bit auch, wenn bei einem vorhandenen Speicherbereich die Schutzrechte durch etwas Ausführbares ersetzt werden. Mithilfe von Guard-Pages kann es nachverfolgen, welcher Speicherbereich für die Allokation von Shellcode oder PE-Images verwendet werden soll.
Für jeden erkannten Shellcode speichert Shinigami den rohen Shellcode selbst auf der Festplatte. Es scannt den Speicherbereich außerdem nach PE-Dateien und speichert diese ebenfalls. Shinigami behandelt jede unterschiedliche Shellcode-Ausführung als neue Stufe, sodass Sie am Ende in Ihrem Arbeitsverzeichnis Dateien mit dem Namen filename_shellcode_STAGENUM.bin or .exe haben.
Das Tool bietet einige Optionen:
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)
Einige wichtige Optionen sind:
-o, --output: Gibt das Verzeichnis an, in das die extrahierten Artefakte gespeichert werden sollen. Standardmäßig werden extrahierte Artefakte in einem Verzeichnis namens output im aktuellen Arbeitsverzeichnis gespeichert. Sie können ein anderes Verzeichnis angeben, indem Sie dessen Pfad als Argument übergeben.
--stop-at-write: Dieses Argument wird beim Entpacken eines ausgehöhlten Prozesses verwendet. Wenn Shinigami erkennt, dass die PE-Datei in den ausgehöhlten Prozess geschrieben wird, stoppt es die Ausführung und speichert die extrahierte PE-Datei. Diese Option kann nützlich sein, wenn Sie vermeiden möchten, den gesamten ausgehöhlten Prozess auszuführen, und nur den entpackten Code extrahieren möchten.
--verbose: Zeigt eine ausführliche Ausgabe an. Dies kann beim Debuggen oder zum Verständnis der internen Arbeitsweise von Shinigami nützlich sein.
![]() |
|---|
| Test gegen Dridex |
Nach Abschluss der Extraktion wird der Prozess beendet und Sie haben (hoffentlich) die extrahierte PE-Datei:
![]() |
|---|
| Abgelegtes Implantat |
Das erkannte Implantat wird gemäß dem Format abgelegt, das im Abschnitt Erkennungsmethoden beschrieben ist.
![]() |
|---|
| Entpacken eines zufälligen Loaders, beschrieben hier |
Im obigen Beispiel hat Shinigami automatisch das Verhalten eines generischen Loaders erkannt und alle darin ausgeführten Shellcodes und Images extrahiert, ohne dass spezielle Schalter erforderlich waren, um die Entpackungsroutine zu aktivieren oder zu deaktivieren. Dies war möglich, weil Shinigami einige Funktionen mit dem Unhollow-Modul gemeinsam nutzt und dabei gemeinsame Hooks verwendet, die von der Bibliothek Gancho bereitgestellt werden.
![]() |
|---|
| Entpacken der Emotet-DLL |
Shinigami unterstützt außerdem DLLs und kann injizierte Binärdateien mithilfe abgetrennter DOS-Header rekonstruieren. Bemerkenswerterweise nutzen Malware-Beispiele wie Emotet diese Technik, um In-Memory-PE-Scanner zu umgehen. Shinigami erkennt solche fehlenden Teile (DOS-Header) und verwendet Heuristiken, um sie zu rekonstruieren.
Holen Sie sich Ihre bevorzugte Variante auf der Release-Seite.
Es wäre großartig, wenn Sie diesem Projekt helfen. Wenn Sie möchten, finden Sie hier die Abhängigkeiten und Schritte.
Bitte eröffnen Sie ein Issue oder einen Pull-Request für alle Änderungen, die Sie vornehmen möchten.
Dieses coole Maskottchen-Bild wurde von Bleach inspiriert und von Dall-E erzeugt.