
Uma ferramenta dinâmica de descompactação
Shinigami é uma ferramenta experimental projetada para detectar e desempacotar implantes de malware que são injetados via process hollowing ou rotinas genéricas de empacotadores.
A ferramenta opera fazendo hook de funções NT relacionadas ao Process Hollowing e marcando páginas de memória recém-executáveis com o bit page guard. Essa técnica permite que o Shinigami detecte mudanças indiretas de fluxo, normalmente causadas por shellcode ou código desempacotado, que muitas vezes são indicativas de malware. O Shinigami cria o executável alvo em estado suspenso e injeta uma biblioteca DLL chamada "Ichigo". Essa biblioteca automaticamente aplica hook em todas as funções necessárias para detectar e extrair o implante. Assim que o artefato é totalmente extraído, a ferramenta encerra o processo.
A eficácia do Shinigami pode variar dependendo do malware específico que ele está mirando. No entanto, é uma adição valiosa a qualquer kit de ferramentas de análise de malware e pode ser útil para detectar e analisar malware que usa process hollowing ou rotinas genéricas de empacotadores.
Importante: Esta é uma ferramenta de desempacotamento dinâmico e não deve ser executada em sua máquina pessoal ou em um laboratório de análise estática
O método principal do Shinigami para extrair implantes injetados usando process hollowing envolve o hook de duas funções NT: NtResumeThread e NtWriteVirtualMemory. Veja como funciona:
NtResumeThread Hook
NtWriteVirtualMemory Hook
--stop-at-write for passada.O módulo desempacotador genérico do Shinigami marca áreas de memória recém-alocadas com o bit PAGE_GUARD; ele também aplica esse bit se qualquer área de memória existente tiver suas proteções substituídas por algo executável. Ao usar guard pages, ele consegue rastrear qual área de memória será usada para alocar shellcode ou imagens PE.
Para cada shellcode detectado, o Shinigami salva o próprio shellcode bruto em disco. Ele também varre essa região de memória para encontrar quaisquer arquivos PE e os salva também. O Shinigami trata cada execução diferente de shellcode como um novo estágio; ao final, você terá em seu diretório de trabalho arquivos chamados filename_shellcode_STAGENUM.bin ou .exe.
A ferramenta tem algumas opções:
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)
Algumas opções importantes são:
-o, --output: Especifica o diretório para despejar os artefatos extraídos. Por padrão, os artefatos extraídos serão salvos em um diretório chamado output no diretório de trabalho atual. Você pode especificar um diretório diferente passando o caminho dele como argumento.
--stop-at-write: Este argumento é usado durante o desempacotamento de um processo hollowed. Quando o Shinigami detecta que o arquivo PE está sendo gravado no processo hollowed, ele interrompe a execução e salva o arquivo PE extraído. Essa opção pode ser útil se você quiser evitar executar todo o processo hollowed e precisar apenas extrair o código desempacotado.
--verbose: Exibe uma saída detalhada (verbose). Isso pode ser útil para depurar ou entender o funcionamento interno do Shinigami.
![]() |
|---|
| Testando contra o Dridex |
Após a extração, o processo é encerrado e você terá (espero) o PE extraído:
![]() |
|---|
| Implante extraído |
O implante detectado será extraído seguindo o formato descrito na seção métodos de detecção
![]() |
|---|
| Desempacotando um loader aleatório descrito aqui |
No exemplo acima, o Shinigami detectou automaticamente o comportamento de um loader genérico e extraiu todos os shellcodes e imagens executados dentro dele, sem exigir nenhuma opção específica para habilitar ou desabilitar a rotina de desempacotamento. Isso foi possível porque o Shinigami compartilha algumas funções com o módulo unhollow, usando hooks compartilhados fornecidos pela biblioteca Gancho.
![]() |
|---|
| Desempacotando a DLL do Emotet |
O Shinigami também tem suporte a DLL e a capacidade de reconstruir binários injetados usando cabeçalhos DOS destacados (detached). Notavelmente, amostras de malware como o Emotet usam essa técnica para evadir scanners de PE em memória. O Shinigami detecta essas partes ausentes (cabeçalho DOS) e emprega heurísticas para reconstruí-las.
Baixe a sua versão preferida na página de Release.
Seria incrível se você ajudasse neste projeto; então, se quiser, aqui estão as dependências e os passos
Por favor, abra uma issue ou pull request para quaisquer alterações que você queira fazer.
Esta imagem de mascote legal foi inspirada em Bleach e gerada por Dall-E.