DLL ハイジャックを簡単に兵器化します。通常のプロセス動作を妨げることなく、任意の DLL の任意の関数にバックドアを仕込むことができます。
動作原理
DllShimmer は元の DLL を解析し、エクスポートされている関数に関する情報(名前、序数、フォワーダ情報)を抽出します。この情報に基づいて、DllShimmer は C++ のひな型ファイル(.cpp)を生成します。生成されたファイルを用いることで、元の DLL からエクスポートされている各関数に独自のコードを追加しても、プログラムの通常動作を妨げることはありません。DllShimmer は関数シグネチャに依存しないため(「制限事項」を参照)、リバースエンジニアリングやインストルメンテーションは不要です。
2 つ目に生成されるファイルは .def ファイルであり、コンパイル後にプロキシ DLL からエクスポートされるすべての DLL が、元の DLL と同じ名前および序数を持つことを保証します。
コンパイル後、プロキシ DLL の EAT は元の DLL の EAT の完全なコピーになります。エクスポートされた関数のすべての名前と序数は一致し、フォワードされている関数も同様にフォワードされます。DllShimmer は(多くのツールのように)すべての関数を明示的にフォワードして、完全に新規で疑わしい EAT 構造を作るようなことはしません。
制限事項
- x86-64 / AMD64 アーキテクチャのみサポートされています。
- 浮動小数点パラメータを持つ関数については、DllShimmer が利用する整数用レジスタとは異なるレジスタを使用するため、汎用プロキシコードはおそらく動作しません。関数シグネチャが分かっている場合は、生成されたファイル内で手動調整してください。
- 引数が 12 個を超える関数は動作しません。この数は DllShimmer のテンプレート内にハードコードされています。
- 巨大で難読化された DLL の中には、奇妙な名前マングリングや呼び出し規約、トリック(例:Qt フレームワーク DLL のコンパイル物)を用いているものがあります。これらをプロキシ DLL として使用することは推奨しません。この場合、DllShimmer はおそらくゴミのようなコードを生成してしまいます。
使用方法
パラメータ:
-i / --input <path> [必須]
バックドアを仕込みたい元の DLL。
-o / --output <path> [必須]
DllShimmer が生成したすべてのファイルを保存するディレクトリへのパス。
-x / --original <path> [必須]
動的リンク(デフォルト)の場合、ターゲットシステム上でプロキシ DLL が元の DLL を見つけるパスを指定します。
静的リンク(--static)の場合は、元の DLL の名前のみを指定します。これは Windows のデフォルトの読み込み順序に従って検索されます。
-m / --mutex [任意]
このオプションを有効にすると、ソースファイルにミューテックスが追加され、1 回のプログラム実行中にバックドアが複数回実行されることを防ぎます。元のすべての関数は引き続き通常どおり動作します。
--static [任意]
プロキシ DLL(IAT)と元の DLL(EAT)の間で静的リンクを有効にします。これにより、出力ディレクトリに追加の .lib ファイルが生成され、静的コンパイル時に元の DLL として機能します。
この手法には、動的リンクと比較していくつか重大な制限があります:
- 元の DLL への絶対パスまたは相対パスを指定できません。システムローダーはプロキシ IAT に記載された DLL 名のみを使用し、デフォルトパスから検索します。
- デバッグ情報が制限されます。元の DLL の読み込みに失敗した場合、通常は追加情報なしにプログラムがクラッシュします。
しかし、シナリオによっては、静的リンクの方がよりステルスで自然に見える場合があります。
デフォルト: DllShimmer は常に LoadLibraryA() および GetProcAddress() 関数を用いた動的リンクを使用します。
--debug-file <path> [任意]
デバッグログをファイルに保存します。ログはプログラム実行中に随時ファイルへ書き込まれます。このオプションを選択した場合、ログは STDOUT には出力されません。
デフォルト: DllShimmer は常にデバッグログを STDOUT に書き込みます。
ダウンロード
翻訳元: https://meterpreter.org/dllshimmer-the-stealth-tool-for-weaponizing-dll-hijacking-without-detection/