Shinigami es una herramienta experimental diseñada para detectar y descomprimir implantes de malware que se inyectan mediante rutinas de empaquetado genéricas o de proceso hueco.
La herramienta funciona conectando funciones NT relacionadas con Process Hollowing y marcando páginas de memoria recién ejecutables con el bit de protección de página. Esta técnica permite a Shinigami detectar cambios de flujo indirectos, generalmente causados por código shell o código descomprimido, que a menudo son indicativos de malware. Shinigami crea el ejecutable de destino en estado suspendido e inyecta una biblioteca DLL llamada "Ichigo". Esta biblioteca conecta automáticamente todas las funciones necesarias para detectar y extraer el implante. Una vez que el artefacto se haya extraído por completo, la herramienta finalizará el proceso.
La eficacia del Shinigami puede variar según el malware específico al que se dirige. Sin embargo, es una valiosa adición a cualquier conjunto de herramientas de análisis de malware y puede resultar útil para detectar y analizar malware que utiliza rutinas de empaquetado genéricas o de vaciado de procesos.
Importante: Esta es una herramienta de descompresión dinámica y no debe ejecutarse en su máquina personal ni en un laboratorio de análisis estático.
El método principal de Shinigami para extraer implantes inyectados mediante proceso de vaciado implica conectar dos funciones NT: NtResumeThread y NtWriteVirtualMemory. Así es como funciona:
Gancho NtResumeThread
Gancho NtWriteVirtualMemory
--stop-at-write
. El módulo desempaquetador genérico de Shinigami marca áreas de memoria recién asignadas con el bit PAGE_GUARD; también aplica este bit si cualquier área de memoria existente tiene sus protecciones reemplazadas por algo ejecutable. Al utilizar páginas de protección, puede rastrear qué área de memoria se utilizará para asignar algún código shell o imágenes PE.
Para cada shellcode detectado, Shinigami guarda el shellcode sin formato en el disco. También escanea esa región de memoria para encontrar archivos PE y también los guarda. Shinigami trata cada ejecución diferente de Shellcode como una nueva etapa, por lo que al final, tendrás tu directorio de trabajo con 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 para volcar los artefactos extraídos. De forma predeterminada, los artefactos extraídos se guardarán en un directorio llamado salida en el directorio de trabajo actual. Puede 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, detendrá la ejecución y guardará el archivo PE extraído. Esta opción puede ser útil si desea evitar ejecutar todo el proceso vaciado y solo necesita extraer el código desempaquetado.
--verbose : muestra una salida detallada. Esto puede resultar útil para depurar o comprender el funcionamiento interno de Shinigami.
Pruebas contra Dridex |
Una vez realizada la extracción, el proceso finaliza y tendrá (eso espero) el PE extraído:
Implante abandonado |
El implante detectado será volcado siguiendo el formato descrito en el apartado de métodos de detección.
Descomprimir un cargador aleatorio descrito aquí |
En el ejemplo anterior, Shinigami detectó automáticamente el comportamiento de un cargador genérico y extrajo todos los códigos de shell 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, usando ganchos compartidos proporcionados por la biblioteca Gancho.
Descomprimiendo la DLL de Emotet |
Shinigami también tiene soporte para DLL y la capacidad de reconstruir archivos binarios inyectados utilizando encabezados de DOS independientes. En particular, muestras de malware como Emotet utilizan esta técnica para evadir los escáneres de PE en memoria. Shinigami detecta dichas partes faltantes (encabezado de DOS) y emplea heurística para reconstruirlas.
Elige tu sabor en la página de lanzamiento.
Sería fantástico si ayudaras en este proyecto, así que si quieres, aquí tienes las dependencias y los pasos.
Abra una incidencia o una solicitud de extracción para cualquier cambio que desee realizar.
Esta genial imagen de mascota se inspiró en Bleach y fue generada por Dall-E.