
Shinigami は、プロセス・ホローイングまたは汎用パッカー・ルーチンを介して注入されたマルウェア・インプラントを検出およびアンパックするために設計された実験的なツールです。
このツールは、プロセス・ホローイングに関連するNT関数をフックし、新たに実行可能となったメモリページにページガードビットを設定することで動作します。この手法により、Shinigami は、通常シェルコードやアンパックされたコードによって引き起こされる間接的なフロー変更を検出できます。これらはマルウェアを示すことがよくあります。 Shinigami はターゲットの実行可能ファイルを中断状態で作成し、"Ichigo" というDLLライブラリを注入します。このライブラリは、インプラントを検出して抽出するために必要なすべての関数を自動的にフックします。アーティファクトが完全に抽出されると、ツールはプロセスを強制終了します。
Shinigami の効果は、対象とする特定のマルウェアによって異なる場合があります。しかし、あらゆるマルウェア解析ツールキットへの貴重な追加要素であり、プロセス・ホローイングや汎用パッカー・ルーチンを使用するマルウェアの検出と分析に役立つ可能性があります。
重要:これは動的アンパックツールであり、個人用マシンや静的解析ラボで実行すべきではありません
Shinigami がプロセス・ホローイングを使用して注入されたインプラントを抽出する中心的な方法は、NtResumeThread と NtWriteVirtualMemory という2つのNT関数をフックすることです。仕組みは次のとおりです:
NtResumeThread フック
NtWriteVirtualMemory フック
--stop-at-write フラグが渡された場合にのみ使用されます。Shinigami の汎用アンパッカーモジュールは、新しく割り当てられたメモリ領域に PAGE_GUARD ビットを設定します。また、既存のメモリ領域の保護が実行可能なものに置き換えられた場合にも、このビットを適用します。ガードページを使用することで、どのメモリ領域がシェルコードやPEイメージの割り当てに使用されるかを追跡できます。
検出された各シェルコードについて、Shinigami は生のシェルコード自体をディスクに保存します。また、そのメモリ領域をスキャンしてPEファイルを探し、それらも保存します。Shinigami はシェルコードの実行ごとに異なるステージとして扱うため、最終的に作業ディレクトリには 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 は汎用ローダーの動作を自動的に検出し、その中で実行されたすべてのシェルコードとイメージを抽出しました。アンパックルーチンを有効または無効にするための特定のスイッチは必要ありませんでした。これは、Shinigami が unhollow モジュールと一部の関数を共有し、Gancho ライブラリによって提供される共有フックを使用しているためです。
![]() |
|---|
| Emotet DLL のアンパック |
Shinigami はDLLサポートも備えており、切り離されたDOSヘッダーを使用して注入されたバイナリを再構築する機能もあります。特に、Emotet のようなマルウェアサンプルは、この手法を使用してインメモリPEスキャナーを回避します。Shinigami はこのような欠落部分(DOSヘッダー)を検出し、ヒューリスティックを使用してそれらを再構築します。
お好みのビルドをリリースページから入手してください。
このプロジェクトに協力していただけると素晴らしいです。必要であれば、依存関係と手順は次のとおりです。
変更を加えたい場合は、issue または pull request を開いてください。
このクールなマスコット画像は「BLEACH」に触発され、Dall-E によって生成されました。