
Una herramienta de desempaquetado dinámico
Shinigami es una herramienta experimental diseñada para detectar y desempaquetar implantes de malware que se inyectan mediante process hollowing o rutinas genéricas de empaquetado.
La herramienta opera enganchando (hooking) funciones NT relacionadas con Process Hollowing y marcando las páginas de memoria recién ejecutables con el bit page guard. Esta técnica permite a Shinigami detectar cambios indirectos de flujo, típicamente causados por shellcode o código desempaquetado, que a menudo son indicativos de malware. Shinigami crea el ejecutable objetivo en estado suspendido e inyecta una librería DLL llamada "Ichigo". Esta librería engancha automáticamente todas las funciones necesarias para detectar y extraer el implante. Una vez que el artefacto se extrae por completo, la herramienta termina el proceso.
La efectividad de Shinigami puede variar dependiendo del malware específico al que se enfrente. Sin embargo, es una valiosa adición a cualquier kit de herramientas de análisis de malware y puede resultar útil para detectar y analizar malware que utiliza process hollowing o rutinas genéricas de empaquetado.
Importante: Esta es una herramienta de desempaquetado dinámico y no debe ejecutarse en tu máquina personal ni en un laboratorio de análisis estático
El método principal de Shinigami para extraer implantes inyectados mediante process hollowing consiste en enganchar dos funciones NT: NtResumeThread y NtWriteVirtualMemory. Así es como funciona:
NtResumeThread Hook
NtWriteVirtualMemory Hook
--stop-at-write.El módulo de desempaquetado genérico de Shinigami marca las áreas de memoria recién asignadas con el bit PAGE_GUARD; también aplica este bit si algún área de memoria existente tiene sus protecciones reemplazadas por algo ejecutable. Mediante el uso de guard pages, puede rastrear qué área de memoria se va a utilizar para asignar shellcode o imágenes PE.
Por cada shellcode detectado, Shinigami guarda el shellcode sin procesar en disco. También escanea esa región de memoria para encontrar archivos PE y los guarda igualmente. Shinigami trata cada ejecución de shellcode diferente como una nueva etapa, por lo que al final tendrás en tu directorio de trabajo archivos llamados filename_shellcode_STAGENUM.bin or .exe.
La herramienta tiene un par de opciones:
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)
Algunas opciones importantes son:
-o, --output: Especifica el directorio donde se volcarán los artefactos extraídos. Por defecto, los artefactos extraídos se guardarán en un directorio llamado output en el directorio de trabajo actual. Puedes especificar un directorio diferente pasando su ruta como argumento.
--stop-at-write: Este argumento se utiliza durante el desempaquetado de un proceso hueco. Cuando Shinigami detecta que el archivo PE se está escribiendo en el proceso hueco, detiene la ejecución y guarda el archivo PE extraído. Esta opción puede ser útil si quieres evitar ejecutar todo el proceso hueco y solo necesitas extraer el código desempaquetado.
--verbose: Muestra una salida detallada. Esto puede ser útil para depurar o comprender el funcionamiento interno de Shinigami.
![]() |
|---|
| Probando contra Dridex |
Una vez finalizada la extracción, el proceso se termina y tendrás (eso espero) el PE extraído:
![]() |
|---|
| Implante volcado |
El implante detectado se volcará siguiendo el formato descrito en la sección métodos de detección
![]() |
|---|
| Desempaquetando un loader aleatorio descrito aquí |
En el ejemplo anterior, Shinigami detectó automáticamente el comportamiento de un loader genérico y extrajo todos los shellcodes e imágenes ejecutados dentro de él, sin requerir ningún interruptor específico para habilitar o deshabilitar la rutina de desempaquetado. Esto fue posible porque Shinigami comparte algunas funciones con el módulo unhollow, utilizando hooks compartidos proporcionados por la librería Gancho.
![]() |
|---|
| Desempaquetando la DLL de Emotet |
Shinigami también tiene soporte para DLL y la capacidad de reconstruir binarios inyectados utilizando cabeceras DOS separadas. Notablemente, muestras de malware como Emotet usan esta técnica para evadir los escáneres de PE en memoria. Shinigami detecta esas partes faltantes (cabecera DOS) y emplea heurísticas para reconstruirlas.
Descarga tu versión preferida en la página de Release.
Sería increíble que ayudaras a este proyecto, así que si quieres, aquí tienes las dependencias y los pasos
Por favor, abre un issue o pull request para cualquier cambio que quieras hacer.
Esta genial imagen de mascota se inspiró en Bleach y fue generada por Dall-E.