
Implémentation en shellcode de l'injection de DLL réflective. Convertit les DLL en shellcode indépendant de la position.
sRDI permet la conversion de fichiers DLL en shellcode indépendant de la position. Il tente d'être un chargeur PE entièrement fonctionnel prenant en charge les permissions de section appropriées, les callbacks TLS et les vérifications de cohérence. On peut le considérer comme un chargeur PE en shellcode attaché à une DLL compressée.
La fonctionnalité est accomplie via deux composants :
Ce projet est composé des éléments suivants :
La DLL n'a pas besoin d'être compilée avec RDI, cependant la technique est compatible croisée.
Avant utilisation, je recommande de vous familiariser avec l'injection de DLL réflexive et son objectif.
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)
Le code du chargeur PE utilise l'argument flags pour contrôler les différentes options de la logique de chargement :
SRDI_CLEARHEADER [0x1] : L'en-tête DOS et le stub DOS de la DLL cible sont complètement effacés avec des octets nuls au chargement (sauf pour e_lfanew). Cela peut causer des problèmes avec les API Windows standard lors de la fourniture de l'adresse de base en tant que pseudo HMODULE.SRDI_CLEARMEMORY [0x2] : Après avoir appelé les fonctions du module chargé (DllMain et toutes les exportations), les données de la DLL seront effacées de la mémoire. C'est dangereux si vous prévoyez de continuer à exécuter du code depuis le module (Threads / GetProcAddressR).SRDI_OBFUSCATEIMPORTS [0x4] : L'ordre des importations dans le module sera randomisé avant de commencer le patchage de l'IAT. De plus, les 16 bits de poids fort du drapeau peuvent être utilisés pour stocker le nombre de secondes à patienter avant de traiter l'importation suivante. Par exemple, flags | (3 << 16) marquera une pause de 3 secondes entre chaque importation.SRDI_PASS_SHELLCODE_BASE [0x8] : Contrairement à la transmission des données utilisateur fournies à la fonction exportée, sRDI passera plutôt l'adresse de base du bloc de shellcode en cours d'exécution. Cela peut être utile pour un auto-nettoyage dans des modules plus avancés.Ce projet est compilé avec Visual Studio 2019 (v142) et le SDK Windows 10. Le script python est écrit en Python 3.
Les scripts Python et PowerShell se trouvent à :
Python\ConvertToShellcode.pyPowerShell\ConvertTo-Shellcode.ps1Après la compilation du projet, les autres binaires se trouveront à :
bin\NativeLoader.exebin\DotNetLoader.exebin\TestDLL_<arch>.dllbin\ShellcodeRDI_<arch>.binSi vous souhaitez mettre à jour les blobs statiques dans l'un des outils :
> 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
Si vous trouvez mon code dégoûtant, ou si vous cherchez simplement un projet alternatif de chargeur mémoire-PE, jetez un œil à ceux-ci :
La base de ce projet est dérivée de "Improved Reflective DLL Injection" par Dan Staples qui est lui-même dérivé du projet original de Stephen Fewer.
Le cadre du projet pour compiler du code C en shellcode est tiré de la recherche de Mathew Graeber "PIC_BindShell"