EventWhisper 借助MCP(模型上下文协议)服务器,为Windows .evtx 日志提供了快速且可脚本化的访问方式。它采用纯Python编写(使用 evtx 库),而非PowerShell包装器,并且不会在主机上执行命令,这使其在事件响应、数字取证和威胁狩猎等场景中更加安全。该工具专为事件响应(IR)、数字取证调查(DFIR)和威胁狩猎而设计,让你无需整天查找事件ID。它在Windows系统上进行设计、开发和测试,可通过任何MCP客户端使用。
EventWhisper可以使用Poetry进行安装,无论你是在 Claude内部 还是 独立运行 它。在Windows系统上,请确保Poetry已添加到系统的 PATH 中。
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
C:\Users\\AppData\Roaming\Python\Scripts
poetry --version
git clone https://github.com/hexastrike/eventwhisper
cd eventwhisper
poetry install
poetry run python -m eventwhisper.mcp.server
# 或者,如果依赖项已全局安装,可使用普通Python命令:
python -m eventwhisper.mcp.server
将以下内容添加到Claude Desktop的MCP配置文件中(例如,%AppData%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"EventWhisper": {
"type": "stdio",
"command": "poetry",
"args": [
"-C",
"C:\\Path\\To\\eventwhisper",
"run",
"python",
"-m",
"eventwhisper.mcp.server"
],
"env": { "PYTHONIOENCODING": "utf-8" }
}
}
}
打开 设置 → 开发者 选项,确认EventWhisper已注册并“正在运行”。
当系统提示时,请允许该工具:
你可以尝试以下第一个提示:
使用EventWhisper列出
C:\Windows\System32\winevt\Logs目录下的.evtx文件。
# example.py
from __future__ import annotations
from datetime import datetime, timezone
from eventwhisper.evtxio.evtxio import get_events_from_evtx
# 1) 从安全日志中获取第一个匹配的事件
print(get_events_from_evtx(r"C:\Windows\System32\winevt\Logs\Security.evtx", results_limit=1))
# 2) 按关键字过滤并投影字段
events = get_events_from_evtx(
r"C:\Windows\System32\winevt\Logs\Security.evtx",
contains=["powershell", "Invoke-"],
fields=["Event.System.EventID", "Event.EventData.Image", "Event.EventData.CommandLine"],
results_limit=5,
)
for e in events:
print(e)
# 3) 时间范围查询(UTC)
start = datetime(2025, 1, 1, tzinfo=timezone.utc)
end = datetime(2025, 1, 31, 23, 59, 59, tzinfo=timezone.utc)
print(len(get_events_from_evtx(r"C:\Windows\System32\winevt\Logs\Security.evtx", start=start, end=end)))
使用 poetry run python example.py 运行上述代码。
EventWhisper的代码简洁且易于维护。我们使用pytest进行测试,使用ruff进行代码检查和格式化。你可以在本地运行以下命令(或通过pre-commit):
poetry install
poetry run ruff format .
poetry run ruff check . --fix
poetry run pytest --cov=eventwhisper --cov-report=term-missing
# 对所有文件执行pre-commit:
poetry run pre-commit run --all-files
# 预推送钩子(完整测试 + 覆盖率检查):
poetry run pre-commit run --hook-stage push --all-files
在提交拉取请求时,请确保所有测试都通过,并且达到了覆盖率阈值。每个新的实用工具或功能都应包含清晰的测试,并遵循PEP 8规范。测试代码存放在 tests/ 目录下。
主要逻辑位于 eventwhisper/evtxio/evtxio.py 文件中,负责EVTX文件的迭代、过滤和投影操作。
核心服务器函数是 get_events_from_evtx()(它是迭代器 iter_events_from_evtx() 的包装器):
def get_events_from_evtx(
provider: str | Path,
start: datetime | str | None = None,
end: datetime | str | None = None,
results_limit: int | str | None = RESULTS_LIMIT,
event_ids: int | str | Sequence[int] | Sequence[str] | None = None,
contains: str | Sequence[str] | None = None,
not_contains: str | Sequence[str] | None = None,
fields: str | Sequence[str] | None = None,
) -> list[str]:
常量定义在 eventwhisper/utils/config.py 文件中,包括:
RESULTS_LIMIT — 返回的最大事件数(大型语言模型有令牌/字符限制)。SCAN_LIMIT — 为确保响应速度,在大型日志中扫描的最大事件数。RESULTS_LIMIT 限制,扫描范围也会受到约束以确保响应速度。如果你的MCP客户端未意识到结果已被限制,可以运行第二个更精确的查询。.evtx 文件,请右键单击 → 属性 → 解除阻止。r"C:\path\file.evtx"。 标签,请使用缩略图 → MP4链接(参见演示部分)。.evtx 文件实现更快的扫描功能。本项目采用 GPLv3 许可证进行分发。详情请参阅 LICENSE 文件。