
Reflective DLL Injection のシェルコード実装。DLL を位置独立シェルコードに変換します。
sRDI は、DLL ファイルを位置独立シェルコードに変換することを可能にします。適切なセクション権限、TLS コールバック、健全性チェックをサポートする、完全機能の PE ローダーとなることを目指しています。これは、パックされた DLL に取り付けられたシェルコード PE ローダーと考えることができます。
機能は、次の 2 つのコンポーネントによって実現されます。
このプロジェクトは、以下の要素で構成されています。
DLL は RDI でコンパイルする必要はありませんが、この手法は相互互換性があります。
使用前に、Reflective DLL Injection とその目的について理解しておくことをお勧めします。
from ShellcodeRDI import *
dll = open("TestDLL_x86.dll", 'rb').read()
shellcode = ConvertToShellcode(dll)
DotNetLoader.exe TestDLL_x64.dll
python ConvertToShellcode.py TestDLL_x64.dll
NativeLoader.exe TestDLL_x64.bin
Import-Module .\Invoke-Shellcode.ps1
Import-Module .\ConvertTo-Shellcode.ps1
Invoke-Shellcode -Shellcode (ConvertTo-Shellcode -File TestDLL_x64.dll)
PE ローダーコードは flags 引数を使用して、ロードロジックのさまざまなオプションを制御します。
SRDI_CLEARHEADER [0x1]: ターゲット DLL の DOS ヘッダーと DOS スタブは、ロード時に (e_lfanew を除いて) 完全にヌルバイトで消去されます。これにより、ベースアドレスを疑似 HMODULE として指定する場合、標準の Windows API で問題が発生する可能性があります。SRDI_CLEARMEMORY [0x2]: ロードされたモジュール (DllMain およびエクスポート) の関数を呼び出した後、DLL データはメモリからクリアされます。これは、モジュール (スレッド / GetProcAddressR) からのコードの実行を継続する予定がある場合、危険です。SRDI_OBFUSCATEIMPORTS [0x4]: IAT パッチの開始前に、モジュール内のインポートの順序がランダム化されます。さらに、フラグの上位 16 ビットを使用して、次のインポートを処理する前に一時停止する秒数を格納できます。たとえば、flags | (3 << 16) は、インポートごとに 3 秒間一時停止します。SRDI_PASS_SHELLCODE_BASE [0x8]: エクスポートされた関数に指定されたユーザーデータを渡す代わりに、sRDI は現在実行中のシェルコードブロックのベースアドレスを渡します。これは、より高度なモジュール内での自己クリーンアップに役立ちます。このプロジェクトは、Visual Studio 2019 (v142) および Windows SDK 10 を使用してビルドされています。Python スクリプトは Python 3 で記述されています。
Python および Powershell スクリプトは、次の場所にあります。
Python\ConvertToShellcode.pyPowerShell\ConvertTo-Shellcode.ps1プロジェクトのビルド後、他のバイナリは次の場所に配置されます。
bin\NativeLoader.exebin\DotNetLoader.exebin\TestDLL_<arch>.dllbin\ShellcodeRDI_<arch>.binいずれかのツール内の静的ブロブを更新する場合は、次のようにします。
> python .\lib\Python\EncodeBlobs.py -h
usage: EncodeBlobs.py [-h] solution_dir
sRDI Blob Encoder
positional arguments:
solution_dir Solution Directory
optional arguments:
-h, --help show this help message and exit
> python lib\Python\EncodeBlobs.py C:\code\srdi
[+] Updated C:\code\srdi\Native/Loader.cpp
[+] Updated C:\code\srdi\DotNet/Program.cs
[+] Updated C:\code\srdi\Python/ShellcodeRDI.py
[+] Updated C:\code\srdi\PowerShell/ConvertTo-Shellcode.ps1
私のコードがひどいと感じた場合、または別のメモリ PE ローダープロジェクトを探している場合は、以下をチェックしてみてください。
このプロジェクトの基礎は、Stephen Fewer による元のプロジェクトに由来する Dan Staples による "Improved Reflective DLL Injection" から派生しています。
C コードをシェルコードとしてコンパイルするためのプロジェクトフレームワークは、Mathew Graeber の研究 "PIC_BindShell" から取得されています。