返回市场
进程监控MCP

进程监控MCP

作者:JameZUK3 星标更新:2025-10-29

项目介绍

ProcmonMCP

ProcmonMCP 是一个模型上下文协议服务器,旨在允许大型语言模型(LLMs)自主分析 Procmon XML 日志文件。它向 MCP 客户端暴露了多种功能。

概述

该项目提供了一个模型上下文协议(MCP)服务器,用于解析和分析 进程监视器(Procmon)XML 日志文件(.xml.xml.gz.xml.bz2.xml.xz。它允许通过 MCP 客户端(如 Cline)连接的大型语言模型(LLMs)调查这些日志中捕获的系统活动。

通过在启动时通过 --input-file 参数指定特定的 Procmon XML 文件进行预加载,该服务器利用 字符串内联 和其他技术优化内存中的数据分析。然后,它暴露各种工具,使 LLM 能够查询事件、检查进程细节、查看元数据、导出结果,并对加载的日志数据执行基本分析。

该项目受到了 GhidraMCP 项目 方法的启发。

⚠ 非常重要的安全警告 ⚠

  • 进程监视器日志可能包含极其敏感的系统信息(按键记录、命令行中的密码、文件内容、网络流量详情等)。
  • 该脚本加载用户运行脚本具有读权限的 任意文件路径,通过 --input-file 参数提供。没有 任何 目录沙箱。
  • 通过 API(如 MCP 服务器)公开 Procmon 数据存在 重大安全风险。恶意行为者可能会请求从加载的日志文件中获取敏感信息。
  • 仅在高度信任的环境中运行此服务器。
  • 绝不在包含敏感生产或个人数据的系统上运行此服务器,除非您完全理解并接受相关风险。
  • 在使用此工具之前,请仔细审查您打算加载的日志中的敏感信息。

功能

  • 在启动时通过 --input-file 路径加载特定的 Procmon XML 文件(.xml 或压缩的 .xml.gz/.bz2/.xz)。
  • 使用内存中的字符串内联优化加载的数据,以减少内存占用并加快重复数据的查询速度。
  • 在潜在的长时间加载阶段提供进度报告。
  • 提供 MCP 工具供 LLM 使用:
    • 查询事件摘要,具备过滤能力(进程名称/包含、操作、结果、路径包含/正则表达式、详细正则表达式、时间戳、堆栈模块路径)。
    • 根据索引检索特定事件的详细信息。
    • 获取特定事件的堆栈跟踪(模块路径、位置、地址)(如果已加载)。
    • 列出日志进程列表部分找到的独特进程。
    • 根据 PID 从进程列表中获取特定进程的详细信息。
    • 获取加载文件的基本元数据。
    • 执行基本分析(按进程计数事件、按进程汇总操作、计算时间统计、查找网络连接、查找文件访问)。
    • 将筛选后的事件结果导出到 CSV 或 JSON 文件。
  • 如果可用,则使用 lxml 进行更快的 XML 解析,否则回退到标准库 xml.etree.ElementTree
  • 支持 stdiosse MCP 传输协议。
  • 可选标志跳过加载堆栈跟踪(--no-stack-traces)或额外未知事件字段(--no-extra-data),以节省内存。
  • 调试日志选项(--debug)。
  • 如果安装了 psutil,则提供内存使用情况报告。

安装

  1. 前提条件:

    • Python 3.x(建议使用 3.10+ 版本)。
    • pip(Python 包管理器)。
  2. 克隆仓库(可选):

    git clone [https://github.com/JameZUK/ProcmonMCP](https://github.com/JameZUK/ProcmonMCP)
    cd ProcmonMCP
    

    (或者直接下载 Python 脚本)

  3. 安装依赖项:

    # modelcontextprotocol 是必需的
    # lxml 强烈推荐用于性能提升
    # psutil 是可选的,用于内存报告
    pip install "mcp[cli]" lxml psutil
    

    (如果您选择不安装 lxml,脚本将使用较慢的内置 XML 解析器。如果您不安装 psutil,加载后不会报告内存使用情况。)

使用方法

服务器需要指定要预加载进行分析的 Procmon XML 文件的路径。

命令行参数:

  • --input-file <path>: (必填) 要加载和分析的 Procmon XML 文件(.xml, .gz, .bz2, .xz)的完整路径。脚本必须对此文件具有读权限。
  • --transport <stdio|sse>: (可选)MCP 的传输协议。默认值:stdio
  • --mcp-host <ip>: (可选)MCP 服务器的主机地址(仅用于 sse 传输)。默认值:127.0.0.1
  • --mcp-port <port>: (可选)MCP 服务器的端口(仅用于 sse 传输)。默认值:8081
  • --debug: (可选)启用详细的调试日志。
  • --log-file <path>: (可选)写入日志文件的路径,而不是控制台。
  • --no-stack-traces: (可选)不解析或存储堆栈跟踪(节省内存)。
  • --no-extra-data: (可选)不存储在 <event> 标签内发现的未知字段(节省内存)。

示例:

  • 使用 STDIO 加载压缩的 XML 文件:

    python procmon-mcp.py --input-file /path/to/logs/my_capture.xml.gz
    
  • 使用 SSE 在端口 8082 上运行,加载未压缩的 XML 文件,启用调试日志,并跳过堆栈:

    python procmon-mcp.py --input-file C:\procmon_files\trace_log.xml --transport sse --mcp-port 8082 --debug --no-stack-traces
    

MCP 客户端

理论上,任何 MCP 客户端都应该能与 ProcmonMCP 一起工作。下面给出三个示例。

示例 1: Cline

要使用 GhidraMCP 与 Cline,这需要手动运行 MCP 服务器。首先运行以下命令:

python procmon-mcp.py --input-file C:\procmon_files\trace_log.xml --transport sse --mcp-port 8082

指定 procmon XML 的路径。如果未指定其他参数,它们将默认为上述设置。一旦 MCP 服务器运行,打开 Cline 并在顶部选择 MCP 服务器。

Cline 选择

然后选择远程服务器并添加以下内容,确保 URL 与 MCP 主机和端口匹配:

服务器名称: ProcmonMCP
服务器 URL: http://127.0.0.1:8081/sse

可用的 MCP 工具

一旦服务器运行并加载了文件且连接到 MCP 客户端,以下工具就可用:

  • get_loaded_file_summary(): 返回加载文件的基本摘要(文件名、类型、压缩、计数、内联器统计、选择性加载标志)。
  • query_events(...): 使用各种过滤器查询事件(参见文档字符串/代码中的所有过滤器,如 filter_processfilter_path_containsfilter_start_timefilter_path_regexfilter_stack_module_path 等),返回事件摘要列表及其索引。使用 limit 参数(默认 50)。
  • get_event_details(event_index): 根据其索引(由 query_events 返回)获取特定事件的详细属性。
  • get_event_stack_trace(event_index): 根据索引获取特定事件的堆栈跟踪(帧列表,包括地址、路径、位置)(仅当未使用 --no-stack-traces 时有效)。
  • list_processes(): 列出文件进程列表部分找到的独特进程摘要(PID、名称、ImagePath、ParentPID)。
  • get_process_details(pid): 根据 PID 从文件的进程列表部分获取特定进程的详细属性。
  • get_metadata(): 获取加载文件的基本元数据(文件名、类型、计数)。
  • count_events_by_process(): 计算每个进程名称的所有加载事件的数量。
  • summarize_operations_by_process(process_name_filter): 计算特定进程名称的操作数量(区分大小写匹配)。
  • get_timing_statistics(group_by): 计算事件持续时间统计,按 'process'(默认)或 'operation' 分组。
  • get_process_lifetime(pid): 查找给定 PID 的 'Process Create' 和 'Process Exit' 事件的时间戳(Unix 浮点数)。
  • find_file_access(path_contains, limit=100): 查找文件系统事件,其中路径包含给定的子串(不区分大小写)。
  • find_network_connections(process_name): 查找特定进程名称访问的独特远程网络端点(IP:port)(区分大小写匹配)。
  • export_query_results(...): 使用与 query_events 相同的过滤器查询事件,并将所有匹配事件的完整详细信息导出到指定文件(CSV 或 JSON)。适用于离线分析。

(参考脚本中的工具文档字符串或使用客户端的 tools/list 命令以获取详细的参数描述。)

示例 LLM 提示词用于恶意软件分析

(假设已加载相关的 Procmon XML 文件)

  1. 初步分类:

    • "获取加载文件的摘要。"
    • "列出日志中找到的独特进程。"
    • "按进程计数事件。"(识别高活跃度进程)
    • "按进程分组计算时间统计。"(识别具有长持续时间事件的进程)
  2. 调查可疑进程(例如,PID 4568 的 suspicious.exe):

    • "获取进程 PID 4568 的详细信息。"(检查命令行、父 PID、ImagePath)
    • "总结进程 suspicious.exe 的操作。"(查看其主要操作 - 文件访问、注册表、网络?)
    • "查询过滤进程是 suspicious.exe 且过滤操作是 RegSetValue 的事件,限制 10 条。"(检查注册表写入)
    • "查询过滤进程是 suspicious.exe 且过滤操作是 WriteFile 的事件,限制 20 条。"(检查文件写入)
    • "查找进程 suspicious.exe 的网络连接。"
    • "查询过滤进程包含 suspicious 且过滤详细正则表达式是 some_pattern_in_details 的事件,限制 5 条。"(在 Detail 列中使用正则表达式)
    • "查找包含 temp\suspicious_data 的文件访问,限制 50 条。"
  3. 寻找持久性:

    • "查询过滤操作是 RegSetValue 且过滤路径包含 CurrentVersion\Run 的事件,限制 20 条。"
    • "查询过滤操作是 RegCreateKey 且过滤路径包含 Services 的事件,限制 20 条。"
    • "查询过滤操作是 CreateFile 且过滤路径包含 StartUp 的事件,限制 10 条。"(检查常见的持久化位置)
  4. 故障排除错误/规避:

    • "查询过滤结果是 ACCESS DENIED 的事件,限制 10 条。"
    • "查询过滤结果是 NAME NOT FOUND 的事件,限制 10 条。"
    • "查询过滤结果是 PATH NOT FOUND 的事件,限制 10 条。"
    • "查询过滤结果是 0xc0000022 的事件,限制 5 条。"(如有需要,使用十六进制代码表示结果)
    • (在找到有趣的错误事件索引 987 后):"获取事件 987 的详细信息。"
    • (如果详细信息表明存在代码问题且已加载堆栈):"获取事件 987 的堆栈跟踪。"
  5. 导出数据:

    • "将过滤进程是 suspicious.exe 且过滤操作包含 RegSet 的查询结果导出到 suspicious_reg_writes.csv。"
    • "将过滤操作包含 TCP 或过滤操作包含 UDP 的查询结果导出到 network_activity.json,格式为 JSON。"

限制

  • 单个文件: 该工具仅加载和分析通过 --input-file 在启动时指定的一个文件。分析不同的文件需要重新启动服务器。
  • 内存使用: 尽管进行了内联优化,但加载极大数据量的 XML 文件(数百万事件,特别是具有大量独特字符串数据或加载堆栈跟踪的情况下)仍会消耗大量 RAM。对于非常大的文件,可以使用 --no-stack-traces--no-extra-data
  • 加载时间: 解析和优化大型 XML 文件,尤其是压缩文件,在启动时可能需要相当长的时间(尽管比以前快)。进度会报告到控制台。
  • 过滤性能: 对于使用内联 ID(进程、操作、结果)的过滤器,查询通常很快。需要字符串比较(_contains)、正则表达式(_regex)或堆栈检查(filter_stack_module_path)的过滤器较慢,因为它们需要对每个事件进行更多处理。堆栈过滤器尤其密集。索引有助于显著提高进程名称和操作过滤器的速度。
  • XML 结构: 依赖于标准的 Procmon XML 导出结构。畸形或非标准的 XML 文件可能会导致解析错误。
  • 堆栈跟踪: 堆栈跟踪信息(模块路径、位置)完全取决于 Procmon 解析并包含在 XML 导出中的内容,并且需要正确配置符号来运行 Procmon。只有在未使用 --no-stack-traces 时才会加载堆栈。

贡献

欢迎贡献!请随时提交拉取请求或开启问题。