Shinigami 是一款实验性工具,旨在检测并解包通过进程镂空(process hollowing)或通用加壳例程注入的恶意软件植入体。
该工具通过挂钩与进程镂空相关的 NT 函数,并利用页保护位(page guard bit)标记新近变为可执行的内存页。此技术使 Shinigami 能够检测通常由 shellcode 或解包代码引起的间接流程变更,而这些变更往往表明存在恶意软件。 Shinigami 以挂起状态创建目标可执行文件,并注入一个名为 "Ichigo" 的 DLL 库。该库会自动挂钩所有必要函数,以检测并提取植入体。一旦工件被完整提取,工具将终止该进程。
Shinigami 的实际效果可能因其所针对的特定恶意软件而异。然而,它是任何恶意软件分析工具包中的宝贵补充,在检测和分析使用进程镂空或通用加壳例程的恶意软件方面可能会非常有用。
重要提示:这是一个动态解包工具,不应在个人机器或静态分析实验室中运行
Shinigami 提取通过进程镂空注入的植入体的核心方法涉及挂钩两个 NT 函数:NtResumeThread 和 NtWriteVirtualMemory。其工作原理如下:
NtResumeThread 挂钩
NtWriteVirtualMemory 挂钩
--stop-at-write 标志时使用。Shinigami 的通用解包器模块会为新分配的内存区域设置 PAGE_GUARD 位,如果任何现有内存区域的保护属性被替换为可执行属性,它也会应用该位。通过使用守卫页,它可以跟踪哪个内存区域将被用于分配 shellcode 或 PE 映像。
对于检测到的每个 shellcode,Shinigami 会将原始 shellcode 本身保存到磁盘。它还会扫描该内存区域以查找任何 PE 文件并将其一并保存。Shinigami 将每次不同的 shellcode 执行视为一个新的阶段,因此最终你的工作目录中将包含名为 filename_shellcode_STAGENUM.bin or .exe 的文件。
该工具提供以下几个选项:
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)
一些重要的选项如下:
-o, --output:指定转储提取工件的目录。默认情况下,提取的工件将保存到当前工作目录中名为 output 的目录。你可以通过传递路径参数来指定其他目录。
--stop-at-write:此参数用于解包被镂空进程的过程中。当 Shinigami 检测到 PE 文件正在写入被镂空的进程时,它会停止执行并保存提取的 PE 文件。如果你希望避免执行整个被镂空的进程,而只需提取解包后的代码,此选项会很有用。
--verbose:显示详细的输出信息。这对于调试或理解 Shinigami 的内部工作原理非常有用。
![]() |
|---|
| 针对 Dridex 进行测试 |
提取完成后,进程会被终止,你将得到(希望如此)提取出的 PE 文件:
![]() |
|---|
| 转储的植入体 |
检测到的植入体将按照检测方法一节中描述的格式进行转储
![]() |
|---|
| 解包一个随机加载器,详见此处 |
在上面的示例中,Shinigami 自动检测到了通用加载器的行为,并提取了其中所有已执行的 shellcode 和映像,无需任何特定开关来启用或禁用解包例程。这之所以成为可能,是因为 Shinigami 与反镂空模块共享一些函数,使用由 Gancho 库提供的共享钩子。
![]() |
|---|
| 解包 Emotet DLL |
Shinigami 还支持 DLL,并能够使用分离的 DOS 头重建注入的二进制文件。值得注意的是,像 Emotet 这样的恶意软件样本会利用此技术来逃避内存中的 PE 扫描器。Shinigami 会检测此类缺失部分(DOS 头),并采用启发式方法对其进行重建。
请到发布页获取适合你的版本。
如果你能帮助这个项目,那就太棒了。如果你愿意,以下是依赖项和步骤:
如果你希望进行任何更改,请提交 issue 或拉取请求(pull request)。
这个酷炫的吉祥物形象灵感来自《死神》(Bleach),由 Dall-E 生成。