hexsecs/canarchy

GitHub: hexsecs/canarchy

CANarchy 是一款以结构化 JSONL 事件流为核心的 CAN/J1939 总线分析与操作工具包,内置 CLI、TUI 和 MCP server 以支持人类交互与 AI agent 驱动。

Stars: 1 | Forks: 0

CANarchy

一款流优先的 CAN bus 工具包,专为分析师、安全研究人员和 AI agent 设计。
每个命令都会输出类型化的、机器可读的事件,你可以对其进行 pipe、script 操作,或直接交给 agent —— 并将 J1939 重型车辆支持作为一等公民。

PyPI Python versions Tests Lint License Docs

CANarchy's full-screen TUI streaming live CAN traffic, J1939 activity, and DM1 faults

## 什么是 CANarchy? CANarchy 是一个 CLI 优先的 runtime,用于捕获、解码和操作 CAN 和 CAN-FD 流量。大多数 CAN 工具都迫使你做出权衡:要么是交互式的但难以自动化,要么是可编写脚本的但过于原始,或者是支持协议的但跨接口不一致。CANarchy 的构建理念则截然相反 —— **每个输出都是类型化事件的流**(`--json`、`--jsonl`、`--text`),你可以对其进行解析、pipe 或通过 MCP 转发给 LLM agent。 它适合以下人群: - **安全研究人员**:逆向分析未知 bus、fuzzing ECU 或对比捕获的数据以查找异常。 - **重型车辆 / J1939 工程师**:需要进行 PGN/SPN 解码、TP 重组和 DM1 故障解析,而不想退回到处理原始 ID。 - **构建自动化或 AI agent**:需要一个稳定的、机器可读的 CAN 接口,而不是去抓取人类格式的文本。 ## 安装 ``` pipx install canarchy # isolated, on PATH everywhere # 或: pip install --user canarchy ``` 需要 Python 3.12+。实时 transport 使用 [`python-can`](https://python-can.readthedocs.io/)(socketcan、虚拟 bus、UDP 多播等)。 ## 60 秒试用 —— 无需硬件 ``` canarchy --version canarchy doctor --text # 8 offline health checks; all green = good install # 从 deterministic scaffold backend 流式传输 typed events —— # 无需硬件,无需 fixtures,无需网络。这是 JSONL 合约: CANARCHY_TRANSPORT_BACKEND=scaffold canarchy capture can0 --jsonl ``` 等你有了真实接口,再将其指向该接口: ``` canarchy capture can0 --candump # human-friendly live view canarchy capture can0 --jsonl | jq . # typed events, one per line ``` 喜欢可视化探索?启动**全屏 TUI**(如上图所示)并实时观察 bus: ``` canarchy tui # /capture to stream; /filter, /sort, /help ``` ## 为什么选择 CANarchy? [event schema](docs/event-schema.md) 是稳定的契约;CLI 只是对其进行了封装。正是这一设计决策让 CANarchy 在大多数开源 CAN 工具中脱颖而出: - **结构化输出是核心契约,而非事后补充。** 每个命令 —— 捕获、解码、fuzz、逆向工程 —— 都会输出相同的标准化 JSON 信封。一次解析,处处复用。 - **Pipe 优先。** `--jsonl` 按行流式传输类型化事件,因此 `| jq`、`| grep` 或下游脚本可以无缝工作。 - **J1939 是一等公民。** PGN 解码、SPN 提取、TP 会话重组和 DM1 故障解析会从内置的 SAE 目录中解析名称,而不仅仅是原始仲裁 ID。 - **Agent 就绪。** 内置的 [MCP](https://modelcontextprotocol.io/) server 将工具包暴露给 Claude 及其他 MCP 客户端,以便 agent 可以直接驱动 CAN 分析。 | | CANarchy | 典型的 CAN CLI 工具 | |---|:---:|:---:| | 作为核心契约的结构化输出 | ✅ | ✗ / 部分 | | 支持 pipe 的类型化事件流 | ✅ | 部分 | | Provider 支持的 DBC 发现与缓存 | ✅ | ✗ | | J1939 优先的操作工作流 | ✅ | 部分 | | MCP / agent 集成 | ✅ | ✗ | 请参阅完整的 [CAN 工具功能矩阵](docs/feature-matrix.md),了解与 can-utils、SavvyCAN、Caring Caribou、TruckDevil 等工具的客观的并排比较。 ## 你可以用它做什么? ``` # 针对 DBC 解码 capture canarchy decode --file trace.candump --dbc vehicle.dbc --jsonl # J1939 heavy-vehicle 分析 canarchy j1939 decode --file trace.candump --text canarchy j1939 spn 110 --file trace.candump --text # Engine Coolant Temp canarchy j1939 dm1 --file trace.candump --text # active fault codes # 逆向工程未知 bus:对可能的 signals、counters、anomalies 进行排序 canarchy re signals --file trace.candump --jsonl canarchy re anomalies --file trace.candump --baseline known_good.candump --jsonl # 按 arbitration ID 对比两次 capture(速率/时序/熵差值) canarchy compare before.candump after.candump --json # 活动工作流(受 active-transmit safety model 约束;--dry-run 可安全地进行计划) canarchy generate can0 --count 10 --gap 50 --id 7DF --jsonl canarchy replay --file trace.candump --rate 2.0 --json # 将 events 直接 pipe 到下游工具 canarchy j1939 spn 110 --file trace.candump --jsonl \ | jq '[.payload.value, .payload.units, .payload.timestamp]' ``` ## 通过 AI agent 驱动 (MCP) CANarchy 内置了 [Model Context Protocol](https://modelcontextprotocol.io/) server,因此 LLM agent 可以通过 CLI 使用的相同结构化契约来捕获、解码和分析 CAN 流量。 ``` canarchy mcp install --client claude-desktop # or: --client claude-code canarchy mcp serve # or run the stdio server directly ``` 主动传输工具需要明确的确认,因此 agent 不会意外地将帧发送到活动的 bus 上。请参阅[主动传输安全设计](docs/design/active-transmit-safety.md)。 ## 全屏 TUI `canarchy tui` 会打开一个交互式的全屏仪表板,实时流式传输 bus 数据: - **实时面板:** 实时流量、解码信号、J1939(摘要边栏 + 最新表)、UDS 事务,以及仅追加的告警日志。 - **后台捕获:** `/capture ` 开始流式传输;`/stop`(或 `x`)停止。 - **交互式:** `/filter `、`/sort `、方向键行导航、`space` 暂停数据流、`[`/`]` 调整 backlog 大小、`ctrl+f` 最大化面板。 - 在提示符下输入任何真实的 CANarchy 命令 —— 它将通过共享解析器运行并整合到面板中。
完整命令目录(点击展开) 已完全实现并经过测试: **Transport** - `capture`, `send`, `filter`, `stats` —— 包含实时 `python-can` 和确定性 scaffold backend 的 transport 工作流;`stats` 报告每个 ID 的频率/时序、DLC 分布以及 bus 负载估算 - `compare` —— 按仲裁 ID 对比两个或多个普通 CAN 捕获:帧数/速率增量、周期时间漂移、相对 baseline 的 payload 熵增量,每个 ID 均带有标记(rate-drop、rate-spike、entropy-collapse、timing-drift、new/dropped) - `capture-info` —— 无需加载每一帧即可快速获取捕获元数据 - `generate` —— cangen 风格的帧生成(固定、随机、递增) - `simulate` —— 确定性的、基于 profile 的经典 CAN、J1939 和 DM1 流量混合(无需硬件) - `gateway` —— 在两个接口之间桥接帧(单向和双向) - `replay`, `sequence replay` —— 基于 candump 文件的确定性回放规划,以及 YAML/JSON 多消息协调传输 **数据库 (DBC / ARXML / KCD / SYM,通过 cantools)** - `decode`, `encode` —— 基于数据库的信号解码/编码;`encode` 解析 SAE PGN/SPN 显示名称以用于往返操作 - `dbc inspect`(包括 `--layout`, `--search`),`dbc signals` —— 数据库和信号检查 - `dbc convert` —— 在 DBC / KCD / SYM 之间转换数据库 - `dbc generate-c` —— 从数据库生成 C 源码/头文件/fuzzer - `dbc provider list`, `dbc search`, `dbc fetch`, `dbc cache list|prune|refresh` —— 基于 provider 的 DBC 发现和缓存工作流 **J1939** - `j1939 monitor`, `decode`, `pgn`, `spn`, `tp`, `dm1`, `faults`, `summary`, `inventory`, `compare`, `map` —— 涵盖实时、文件支持和解码视图的操作工作流;faults 从内置的 SAE 目录中解析 SPN 名称和 FMI 描述 **UDS** - `uds scan`, `trace`, `services`, `subservices`, `ecu-reset`, `tester-present`, `security-seed`, `dump-dids`, `read-memory`, `auto` —— 诊断发现和主动工作流 **逆向工程** - `re signals`, `re counters`, `re entropy` —— 基于文件的候选排名,附有 J1939 PGN/源地址上下文注释,支持感知 transport protocol - `re correlate` —— 将候选字段与带时间戳的参考序列进行关联 - `re anomalies` —— 帧间时序和意外/丢失 ID 的异常检测;针对 baseline,它还会标记每个 ID 的速率下降/激增(抑制/注入)和 payload 熵崩溃(平稳/冻结值攻击) - `re corpus` —— 跨捕获覆盖率、周期时间漂移和信号稳定性分析 - `re match-dbc`, `re shortlist-dbc` —— 基于 provider 的、针对捕获数据的 DBC 候选排名 **数据集** - `datasets provider list`, `search`, `inspect`, `fetch`, `download`, `cache list|refresh` —— 公共 CAN 数据集 provider 工作流 - `datasets convert`, `stream`, `replay` —— 数据集转换和有界流式传输/回放 **其他 transport 上的诊断** - `doip discovery`, `services`, `ecu-reset`, `tester-present`, `security-seed`, `dump-dids` —— DoIP UDP 发现和主动诊断工作流 - `xcp scan`, `info`, `dump` —— XCP slave 发现、能力审查和有界内存转储 **可视化、前端和扩展** - `plot` —— 将信号时间序列图输出为 PNG/SVG/HTML (`pip install canarchy[plot]`) - `web serve` —— 基于 JSONL 信封的只读浏览器仪表板 (HTTP + WebSocket) - `shell` —— 交互式 REPL 和 `--command` 脚本模式 - `tui` —— 带有后台实时捕获的全屏终端仪表板 - `plugins list|info|enable|disable` —— Python entry-point 插件发现和开关 - `skills provider list`, `search`, `fetch`, `cache list|refresh` —— 仓库支持的 CANarchy 技能发现、缓存和出处追踪 **主动传输 fuzzing**(受[主动传输安全设计](docs/design/active-transmit-safety.md)控制;`--dry-run` 是安全的规划路径) - `fuzz payload`, `fuzz replay`, `fuzz arbitration-id`, `fuzz identify` —— payload/重放/ID 遍历 fuzzing,并将 fuzz 日志二分定位至问题帧 - `fuzz signal`, `fuzz spn` —— 感知 DBC 信号和 J1939-SPN 的变异,带有 sentinel 覆盖率 - `fuzz guided` —— 带有持久化 seed 语料库的、基于响应反馈的覆盖率引导 fuzzing **会话、导出和实用工具** - `session save`, `load`, `show` —— 会话管理 - `export` —— 结构化产物导出 - `doctor` —— 本地环境健康检查 (Python, `python-can`, vendor backend, 缓存, MCP, 配置) - `mcp serve`, `mcp install` —— Model Context Protocol server 和客户端配置助手 - `completion {bash,zsh,fish}` —— 输出 shell 补全脚本 - `--log-level`, `--quiet` —— 全局 stderr 日志记录控制(放在子命令之前) 默认的 transport backend 是 `python-can`;设置 `CANARCHY_TRANSPORT_BACKEND=scaffold` 可获得确定性的离线行为。
## 结构化契约 每个成功的命令都会返回一个稳定的信封: ``` { "ok": true, "command": "capture", "data": {}, "warnings": [], "errors": [] } ``` 失败将返回带有可操作提示的结构化错误(以及文档化的[错误代码目录](docs/troubleshooting.md)): ``` { "ok": false, "command": "decode", "data": {}, "warnings": [], "errors": [ { "code": "DBC_LOAD_FAILED", "message": "Failed to parse DBC file.", "hint": "Validate the DBC syntax and line endings." } ] } ``` 使用 `--candump` 获取面向人类的实时视图;在为脚本或 agent 提供数据时使用 `--jsonl` —— 每一行都是来自[标准化 schema](docs/event-schema.md) 的类型化事件。设置 `CANARCHY_PYTHON_CAN_INTERFACE` 以选择接口类型,或设置 `CANARCHY_TRANSPORT_BACKEND=scaffold` 以获得确定性的离线行为。 ## 文档 - [入门指南](docs/getting_started.md) · [实用手册](docs/cookbook/index.md) —— 面向任务的方案 - [Event Schema](docs/event-schema.md) —— 所有结构化输出的标准化信封 - [命令规范](docs/command_spec.md) · [架构](docs/architecture.md) - [CAN 工具功能矩阵](docs/feature-matrix.md) —— 与其他开源 CAN 工具的比较 - [J1939 重型车辆演示](docs/tutorials/j1939_heavy_vehicle.md) · [故障排除](docs/troubleshooting.md) - 完整文档站点:**[hexsecs.github.io/canarchy](https://hexsecs.github.io/canarchy/)** ## 从源码安装(开发) CANarchy 使用 [`uv`](https://docs.astral.sh/uv/) 进行环境、依赖项和打包工作流管理。 ``` git clone https://github.com/hexsecs/canarchy && cd canarchy uv sync # create the venv and install from the checkout uv run canarchy --help uv tool install --editable . # optional: put `canarchy` on your PATH; edits take effect live ``` 端到端运行测试套件: ``` uv run python -m unittest discover -s tests -v ``` bash、zsh 和 fish 的 Shell 补全由 `canarchy completion ` 提供 —— 请参阅[入门指南](docs/getting_started.md#install-shell-completion)。 ## 理念 - CLI 即契约。 - 协议语义优于原始帧。 - 结构化输出优于格式化文本。 - 可复现的工作流优于临时交互。 版本控制遵循 [SemVer](https://semver.org/);请参阅 [changelog](CHANGELOG.md) 和[发布工作流](docs/release.md)。`src/canarchy/__init__.py` 是权威的版本来源。
标签:CAN总线, J1939协议, 云资产清单, 汽车安全, 网络安全, 调试插件, 逆向工具, 逆向工程, 隐私保护