
تنفيذ شيلكود لحقن DLL الانعكاسي. تحويل DLLs إلى شيلكود مستقل عن الموقع.
يتيح sRDI تحويل ملفات DLL إلى شيلكود مستقل عن الموقع. يحاول أن يكون محمل PE كامل الوظائف يدعم أذونات الأقسام الصحيحة، واستدعاءات TLS، وعمليات التحقق من السلامة. يمكن اعتباره محمل PE شيلكود مربوطًا بـ DLL مضغوط.
تتحقق الوظيفة عبر مكونين:
يتكون هذا المشروع من العناصر التالية:
لا يحتاج DLL إلى أن يتم تجميعه مع RDI، ومع ذلك فإن التقنية متوافقة بشكل متبادل.
قبل الاستخدام، أوصي بأن تتعرف على حقن DLL الانعكاسي والغرض منه.
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]: يتم مسح رأس DOS وDOS Stub لـ DLL الهدف بالكامل بأصفار البايت عند التحميل (باستثناء e_lfanew). قد يتسبب هذا في مشاكل مع واجهات برمجة تطبيقات Windows العادية عند توفير العنوان الأساسي كـ HMODULE زائف.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 3.
توجد سكريبتات بايثون وباورشيل في:
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 في الذاكرة، فاطلع على بعض هذه:
أساس هذا المشروع مشتق من "حقن DLL الانعكاسي المحسن" من Dan Staples وهو نفسه مشتق من المشروع الأصلي لـ Stephen Fewer.
إطار المشروع لتجميع كود C كشيلكود مأخوذ من بحث Mathew Graeber "PIC_BindShell"