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 参数提供。没有 任何 目录沙箱。--input-file 路径加载特定的 Procmon XML 文件(.xml 或压缩的 .xml.gz/.bz2/.xz)。lxml 进行更快的 XML 解析,否则回退到标准库 xml.etree.ElementTree。stdio 和 sse MCP 传输协议。--no-stack-traces)或额外未知事件字段(--no-extra-data),以节省内存。--debug)。psutil,则提供内存使用情况报告。前提条件:
pip(Python 包管理器)。克隆仓库(可选):
git clone [https://github.com/JameZUK/ProcmonMCP](https://github.com/JameZUK/ProcmonMCP)
cd ProcmonMCP
(或者直接下载 Python 脚本)
安装依赖项:
# 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 客户端都应该能与 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 客户端,以下工具就可用:
get_loaded_file_summary(): 返回加载文件的基本摘要(文件名、类型、压缩、计数、内联器统计、选择性加载标志)。query_events(...): 使用各种过滤器查询事件(参见文档字符串/代码中的所有过滤器,如 filter_process、filter_path_contains、filter_start_time、filter_path_regex、filter_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 命令以获取详细的参数描述。)
(假设已加载相关的 Procmon XML 文件)
初步分类:
调查可疑进程(例如,PID 4568 的 suspicious.exe):
suspicious.exe 的操作。"(查看其主要操作 - 文件访问、注册表、网络?)suspicious.exe 且过滤操作是 RegSetValue 的事件,限制 10 条。"(检查注册表写入)suspicious.exe 且过滤操作是 WriteFile 的事件,限制 20 条。"(检查文件写入)suspicious.exe 的网络连接。"suspicious 且过滤详细正则表达式是 some_pattern_in_details 的事件,限制 5 条。"(在 Detail 列中使用正则表达式)temp\suspicious_data 的文件访问,限制 50 条。"寻找持久性:
RegSetValue 且过滤路径包含 CurrentVersion\Run 的事件,限制 20 条。"RegCreateKey 且过滤路径包含 Services 的事件,限制 20 条。"CreateFile 且过滤路径包含 StartUp 的事件,限制 10 条。"(检查常见的持久化位置)故障排除错误/规避:
ACCESS DENIED 的事件,限制 10 条。"NAME NOT FOUND 的事件,限制 10 条。"PATH NOT FOUND 的事件,限制 10 条。"0xc0000022 的事件,限制 5 条。"(如有需要,使用十六进制代码表示结果)导出数据:
suspicious.exe 且过滤操作包含 RegSet 的查询结果导出到 suspicious_reg_writes.csv。"TCP 或过滤操作包含 UDP 的查询结果导出到 network_activity.json,格式为 JSON。"--input-file 在启动时指定的一个文件。分析不同的文件需要重新启动服务器。--no-stack-traces 和 --no-extra-data。_contains)、正则表达式(_regex)或堆栈检查(filter_stack_module_path)的过滤器较慢,因为它们需要对每个事件进行更多处理。堆栈过滤器尤其密集。索引有助于显著提高进程名称和操作过滤器的速度。--no-stack-traces 时才会加载堆栈。欢迎贡献!请随时提交拉取请求或开启问题。