
Implementação em shellcode de injeção reflexiva de DLL. Converta DLLs em shellcode independente de posição.
O sRDI permite a conversão de arquivos DLL em shellcode independente de posição. Ele tenta ser um carregador de PE totalmente funcional, suportando permissões de seção adequadas, callbacks TLS e verificações de integridade. Pode ser visto como um carregador de PE em shellcode acoplado a uma DLL compactada.
A funcionalidade é obtida por meio de dois componentes:
Este projeto é composto pelos seguintes elementos:
A DLL não precisa ser compilada com RDI, no entanto a técnica é compatível entre si.
Antes de usar, recomendo que você se familiarize com Injeção de DLL Refletiva e seu propósito.
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)
O código do carregador PE usa o argumento flags para controlar as várias opções da lógica de carregamento:
SRDI_CLEARHEADER [0x1]: O Cabeçalho DOS e o Stub DOS da DLL alvo são completamente zerados com bytes nulos ao carregar (exceto para e_lfanew). Isso pode causar problemas com APIs padrão do Windows ao fornecer o endereço base como um pseudo HMODULE.SRDI_CLEARMEMORY [0x2]: Após chamar funções no módulo carregado (DllMain e quaisquer exportações), os dados da DLL serão limpos da memória. Isso é perigoso se você espera continuar executando código fora do módulo (Threads / GetProcAddressR).SRDI_OBFUSCATEIMPORTS [0x4]: A ordem das importações no módulo será randomizada antes de iniciar o patching da IAT. Além disso, os 16 bits superiores da flag podem ser usados para armazenar o número de segundos para pausar antes de processar a próxima importação. Por exemplo, flags | (3 << 16) pausará 3 segundos entre cada importação.SRDI_PASS_SHELLCODE_BASE [0x8]: Em vez de passar os dados fornecidos pelo usuário para a função exportada, o sRDI passará o endereço base do bloco de shellcode atualmente em execução. Isso pode ser útil para auto-limpeza dentro de módulos mais avançados.Este projeto é compilado usando Visual Studio 2019 (v142) e Windows SDK 10. O script python é escrito em Python 3.
Os scripts Python e Powershell estão localizados em:
Python\ConvertToShellcode.pyPowerShell\ConvertTo-Shellcode.ps1Após compilar o projeto, os outros binários estarão localizados em:
bin\NativeLoader.exebin\DotNetLoader.exebin\TestDLL_<arch>.dllbin\ShellcodeRDI_<arch>.binSe você quiser atualizar os blobs estáticos dentro de qualquer uma das ferramentas:
> 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
Se você achar meu código nojento, ou apenas estiver procurando um projeto alternativo de carregador PE em memória, confira alguns destes:
A base deste projeto é derivada de "Improved Reflective DLL Injection" de Dan Staples, que por sua vez é derivado do projeto original de Stephen Fewer.
A estrutura do projeto para compilar código C como shellcode é tirada da pesquisa de Mathew Graeber "PIC_BindShell"