
Reflective DLL Injection의 셸코드 구현. DLL을 위치 독립적인 셸코드로 변환합니다.
sRDI는 DLL 파일을 위치 독립적 셸코드로 변환할 수 있게 해줍니다. 적절한 섹션 권한, TLS 콜백, 무결성 검사를 지원하는 완전한 기능의 PE 로더가 되도록 설계되었습니다. 압축된 DLL에 셸코드 PE 로더를 붙인 것으로 생각할 수 있습니다.
기능은 두 가지 구성 요소를 통해 구현됩니다:
이 프로젝트는 다음 요소로 구성됩니다:
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 스텁이 로드 시 완전히 null 바이트로 지워집니다(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 로더 프로젝트를 찾고 있다면, 다음 중 하나를 확인해보세요:
이 프로젝트의 기반은 Dan Staples의 "Improved Reflective DLL Injection"에서 파생되었으며, 이는 다시 Stephen Fewer의 원본 프로젝트 ReflectiveDLLInjection에서 파생되었습니다.
C 코드를 셸코드로 컴파일하는 프로젝트 프레임워크는 Mathew Graeber의 연구 "PIC_BindShell"에서 가져왔습니다.