
本文详解使用 pymem 实现 python 进程注入的技术原理、常见失效原因(如 rundll32 调用静默失败)、shellcode 执行限制,并强调在合法授权红队/渗透测试场景下应遵循的安全规范与检测规避基本逻辑。
本文详解使用 pymem 实现 python 进程注入的技术原理、常见失效原因(如 rundll32 调用静默失败)、shellcode 执行限制,并强调在合法授权红队/渗透测试场景下应遵循的安全规范与检测规避基本逻辑。
在红队评估或安全研究中,进程注入(Process Injection)是验证防御体系有效性的重要技术手段。Python 生态中,pymem 是一个功能强大的内存操作库,支持对 Windows 进程进行读写、模块注入、Python 解释器嵌入及 ShellCode 执行等高级操作。但正如提问者所遇——注入后 os.system('rundll32.exe ...') 未触发 EDR 告警也未生效,而文件写入却成功——这并非代码语法错误,而是由执行上下文、权限层级与 EDR 检测机制共同导致的典型现象。
? 为什么 rundll32 在注入上下文中“静默失效”?
执行环境隔离:
pm.inject_python_shellcode()注入的是纯 Python 字节码(通过exec()动态执行),其运行于目标进程(notepad.exe)的 Python 解释器沙箱内,不继承父进程的完整 shell 环境变量、当前工作目录或特权令牌。os.system()启动的子进程默认以CREATE_SUSPENDED或低完整性级别运行,可能被 EDR 的进程创建监控(Process Creation Hooking) 拦截并静默终止,而不抛出异常或日志。-
路径转义与字符串解析错误:原始脚本中:
f = open("C:TestRuleprocess_injection.txt", "w+")T和p是非法转义序列(如表示制表符),实际路径被解释为C: estRule rocess_injection.txt,导致文件写入失败(但因 Windows 路径容错机制,可能意外写入到C:根目录)。虽提问者观察到文件成功创建,实则依赖了系统路径模糊匹配,属于不可靠行为。✅ 正确写法应使用原始字符串或双反斜杠:f = open(r"C:TestRuleprocess_injection.txt", "w+") # 或 f = open("C:\TestRule\process_injection.txt", "w+") rundll32.exe调用被深度标记:EDR(如 CrowdStrike、Microsoft Defender for Endpoint、SentinelOne)普遍将rundll32.exe+comsvcs.dll, MiniDump组合列为高置信度恶意行为指纹(T1055.002 - Process Hollowing 变种)。即使注入成功,该命令在目标进程中调用时,EDR 的用户模式钩子(User-Mode Hook) 会立即拦截CreateProcessW或NtCreateUserProcess系统调用,并直接拒绝执行——无弹窗、无报错、无日志输出,表现为“命令被忽略”。
✅ 可验证的改进方案(仅限授权测试)
若需验证注入是否真正生效,建议改用低检出、高兼容性的替代操作:
import os
import sys
# ✅ 安全验证:写入带时间戳的唯一文件(避免路径转义)
import time
timestamp = int(time.time())
with open(rf"C:TestRuleinject_{timestamp}.txt", "w") as f:
f.write(f"Injected at {timestamp} via pymem
Python version: {sys.version}")
# ✅ 替代 rundll32:使用 subprocess.run() + 隐藏窗口(仍可能被检测,但更可控)
try:
import subprocess
# 注意:subprocess 默认不继承注入上下文的环境,需显式指定
result = subprocess.run(
['cmd.exe', '/c', 'echo Injected > C:\TestRule\cmd_echo.txt'],
capture_output=True,
timeout=3,
creationflags=subprocess.CREATE_NO_WINDOW # 关键:隐藏控制台窗口
)
print("CMD echo result:", result.returncode)
except Exception as e:
print("Subprocess failed:", str(e))
⚠️ 重要提醒:
subprocess在注入环境中仍受限于目标进程权限(notepad.exe 通常为 Medium Integrity),无法直接执行需 High Integrity 的操作(如 MiniDump)。真正的内存转储需使用pymem自带的dump_full()方法(调用MiniDumpWriteDumpAPI),它绕过rundll32,检出率显著更低:pm.dump_full(r"C:dump.dmp") # 直接调用 Windows API,无需外部进程
?️ 关于 EDR 规避的负责任说明
本文绝不提供绕过安全防护的通用技巧。EDR 的核心能力在于行为建模(Behavioral Analytics)、调用链分析(Call Stack Inspection)和信誉库(Reputation DB)联动。任何试图“欺骗”检测引擎的行为,若脱离真实攻防对抗场景(如授权红队演习、产品安全评估),均违反《网络安全法》第27条及 ISO/IEC 27001 合规要求。
合法实践应聚焦于:
- ✅ 在客户书面授权范围内开展测试;
- ✅ 使用
pymem.dump_full()等 API 级操作替代高危命令行; - ✅ 结合白名单进程(如
msedge.exe,chrome.exe)进行注入,降低初始告警概率; - ✅ 优先采用 Process Hollowing 或 Early Bird APC Injection 等更隐蔽的原生技术,而非依赖 Python 解释器注入。
? 总结
-
pymem.inject_python_shellcode()是有效的注入载体,但其执行环境受限,不能等同于交互式 shell; -
os.system()和subprocess在注入上下文中易受 EDR 静默拦截,应优先使用pymem原生 API(如dump_full,write_bytes)完成关键操作; - 所有注入操作必须严格限定于授权范围,技术探索应服务于提升防御水位,而非突破法律与伦理边界。
? 延伸学习(合规安全研究向):
- MITRE ATT&CK® — Process Injection
- PyMem 官方文档 — Memory Dumping
- 《EDR Bypass Fundamentals》by VAADATA(需结合最新厂商检测规则演进理解)
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











