
Shellcode-Implementierung von Reflektierender DLL-Injektion. Wandelt DLLs in positionsunabhängigen Shellcode um.
sRDI ermöglicht die Konvertierung von DLL-Dateien in positionsunabhängigen Shellcode. Es versucht, ein voll funktionsfähiger PE-Lader zu sein, der korrekte Abschnittsberechtigungen, TLS-Callbacks und Plausibilitätsprüfungen unterstützt. Man kann es sich als einen Shellcode-PE-Lader vorstellen, der an eine gepackte DLL geschnallt ist.
Die Funktionalität wird über zwei Komponenten realisiert:
Dieses Projekt besteht aus folgenden Elementen:
Die DLL muss nicht mit RDI kompiliert sein, die Technik ist jedoch kreuzkompatibel.
Vor der Verwendung empfehle ich, sich mit Reflective DLL Injection und dessen Zweck vertraut zu machen.
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)
Der PE-Ladercode verwendet das Argument flags, um die verschiedenen Optionen der Ladelogik zu steuern:
SRDI_CLEARHEADER [0x1]: Der DOS-Header und DOS-Stub der Ziel-DLL werden beim Laden vollständig mit Nullbytes überschrieben (außer e_lfanew). Dies kann bei der Verwendung von Standard-Windows-APIs Probleme verursachen, wenn die Basisadresse als Pseudo-HMODULE übergeben wird.SRDI_CLEARMEMORY [0x2]: Nach dem Aufruf von Funktionen im geladenen Modul (DllMain und alle Exporte) werden die DLL-Daten aus dem Speicher gelöscht. Dies ist gefährlich, wenn Sie erwarten, weiterhin Code aus dem Modul auszuführen (Threads / GetProcAddressR).SRDI_OBFUSCATEIMPORTS [0x4]: Die Reihenfolge der Importe im Modul wird vor dem Start der IAT-Patchung randomisiert. Zusätzlich können die oberen 16 Bits des Flags verwendet werden, um die Anzahl der Sekunden zu speichern, die vor der Verarbeitung des nächsten Imports pausiert werden soll. Beispiel: flags | (3 << 16) pausiert 3 Sekunden zwischen jedem Import.SRDI_PASS_SHELLCODE_BASE [0x8]: Anstatt die übergebenen Benutzerdaten an die exportierte Funktion zu übergeben, übergibt sRDI stattdessen die Basisadresse des aktuell ausgeführten Shellcode-Blocks. Dies kann zur Selbstbereinigung innerhalb komplexerer Module nützlich sein.Dieses Projekt wird mit Visual Studio 2019 (v142) und Windows SDK 10 erstellt. Das Python-Skript ist mit Python 3 geschrieben.
Die Python- und PowerShell-Skripte befinden sich unter:
Python\ConvertToShellcode.pyPowerShell\ConvertTo-Shellcode.ps1Nach dem Bauen des Projekts befinden sich die anderen Binärdateien unter:
bin\NativeLoader.exebin\DotNetLoader.exebin\TestDLL_<arch>.dllbin\ShellcodeRDI_<arch>.binWenn Sie die statischen Blobs in einem der Tools aktualisieren möchten:
> 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
Wenn Sie meinen Code abscheulich finden oder einfach ein alternatives Speicher-PE-Lader-Projekt suchen, schauen Sie sich einige dieser an:
Die Grundlage dieses Projekts stammt von "Improved Reflective DLL Injection" von Dan Staples, das wiederum vom ursprünglichen Projekt von Stephen Fewer abgeleitet ist.
Das Projekt-Framework zum Kompilieren von C-Code als Shellcode stammt aus Mathew Graeber's Forschung "PIC_BindShell"