Shinigami は、プロセス ハローイングまたは汎用パッカー ルーチンを介して注入されたマルウェア インプラントを検出して解凍するように設計された実験的なツールです。
このツールは、プロセス ホローイングに関連する NT 機能をフックし、新しく実行可能なメモリ ページをページ ガード ビットでマークすることによって動作します。この技術により、死神は、通常はマルウェアを示すシェルコードまたはアンパックされたコードによって引き起こされる間接的なフローの変更を検出できます。 Shinigami は、サスペンド状態でターゲットの実行可能ファイルを作成し、「Ichigo」と呼ばれる DLL ライブラリを挿入します。このライブラリは、インプラントを検出して抽出するために必要なすべての関数を自動的にフックします。アーティファクトが完全に抽出されると、ツールはプロセスを強制終了します。
死神の有効性は、対象となる特定のマルウェアによって異なる場合があります。ただし、これはマルウェア分析ツールキットへの貴重な追加機能であり、プロセス ハローイングまたは汎用パッカー ルーチンを使用するマルウェアの検出と分析に役立つ可能性があります。
重要: これは動的解凍ツールであるため、個人のマシンや静的分析ラボでは実行しないでください。
プロセス ハローイングを使用して注入されたインプラントを抽出する Shinigami の中核的な方法には、NtResumeThread と NtWriteVirtualMemory という 2 つの NT 関数のフックが含まれます。仕組みは次のとおりです。
NtResumeThread
フック
NtWriteVirtualMemory
フック
--stop-at-write
フラグが渡された場合にのみ使用されます。 Shinigami の汎用アンパッカー モジュールは、新しく割り当てられたメモリ領域に PAGE_GUARD ビットをマークします。また、既存のメモリ領域の保護が実行可能ファイルに置き換えられている場合にも、このビットを適用します。ガード ページを使用すると、シェルコードまたは PE イメージを割り当てるためにどのメモリ領域が使用されるかを追跡できます。
検出されたシェルコードごとに、死神は生のシェルコード自体をディスクに保存します。また、そのメモリ領域をスキャンして 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 : 抽出されたアーティファクトをダンプするディレクトリを指定します。デフォルトでは、抽出されたアーティファクトは、現在の作業ディレクトリの出力と呼ばれるディレクトリに保存されます。パスを引数として渡すことで、別のディレクトリを指定できます。
--stop-at-write : この引数は、中空プロセスの解凍中に使用されます。 Shinigami は、PE ファイルが中空プロセスに書き込まれていることを検出すると、実行を停止し、抽出された PE ファイルを保存します。このオプションは、中空プロセス全体の実行を避け、解凍されたコードのみを抽出する必要がある場合に便利です。
--verbose : 詳細な出力を表示します。これは、死神のデバッグや内部の仕組みを理解するのに役立ちます。
![]() |
---|
Dridex に対するテスト |
抽出が完了すると、プロセスが強制終了され、抽出された PE が得られます (そうであることを願っています)。
![]() |
---|
投棄されたインプラント |
検出されたインプラントは、「検出方法」セクションで説明されている形式に従ってダンプされます。
![]() |
---|
ここで説明されているランダムローダーの解凍 |
上の例では、Shinigami は、解凍ルーチンを有効または無効にする特定のスイッチを必要とせずに、汎用ローダーの動作を自動的に検出し、その中で実行されたすべてのシェルコードとイメージを抽出しました。これは、死神が Gancho ライブラリによって提供される共有フックを使用して、unhollow モジュールと一部の機能を共有するために可能でした。
![]() |
---|
Emotet DLLの解凍 |
Shinigami には DLL サポートもあり、切り離された DOS ヘッダーを使用して挿入されたバイナリを再構築する機能もあります。特に、Emotet のようなマルウェア サンプルは、この手法を使用してメモリ内 PE スキャナを回避しています。 Shinigami はそのような欠落部分 (DOS ヘッダー) を検出し、ヒューリスティックを使用してそれらを再構築します。
リリースページで好みの味を手に入れてください。
このプロジェクトを手伝っていただければ幸いです。必要に応じて、依存関係と手順をここに示します。
変更を加えたい場合は、Issue またはプルリクエストを開いてください。
このクールなマスコットのイメージは、Bleach にインスピレーションを得て、Dall-E によって生成されました。