ameersmu2004-rgb/Speedometer-ECU-Simulator
GitHub: ameersmu2004-rgb/Speedometer-ECU-Simulator
基于虚拟 CAN 总线的汽车速度表 ECU 模拟器,提供完整 UDS 诊断协议栈与漏洞引擎,供汽车网络安全研究、CAN 模糊测试和学习诊断协议使用。
Stars: 0 | Forks: 0
# 速度表 ECU 模拟器
这是一个基于 **Tkinter** 的未来感 **GUI**,用于模拟真实的汽车速度表 ECU。它通过虚拟 CAN 总线 (`vcan0`) 通信,使用 **UDS 诊断协议**,是汽车安全测试、CAN 模糊测试工具(如 **FucyFuzz**)或学习 ECU 诊断工作原理的绝佳练习目标。
## 此工具的功能
- 渲染一个带有动态指针、RPM 弧线、挡位指示器、燃油液位、冷却液温度和电池电压的实时**全息风格速度表表盘**
- 在 `vcan0` 上运行完整的 **UDS/ISO-TP 协议栈** — 响应真实的诊断请求(ReadDID、WriteData、SecurityAccess、ECUReset 等)
- 内置**漏洞引擎** — 加载 JSON 配置文件以植入预设的 ECU 漏洞,用于模糊测试
- 在独立的面板中记录每一个 UDS 帧、原始 CAN 帧和漏洞触发事件,并可导出为 `.log` / `.jsonl` 文件
## 环境要求
| 要求 | 原因 |
|---|---|
| Ubuntu / Debian Linux | `vcan0` 虚拟 CAN 依赖 Linux 内核的 `vcan` 模块 |
| Python 3.8+ | 核心运行时 |
| `python3-tk` | GUI 图形界面 (Tkinter) |
| `python-can` | CAN 总线接口库 |
| `can-isotp` *(可选)* | 仅当您希望从自定义脚本发送测试帧时需要 |
## 安装与运行
### 第 1 步 — 克隆或复制项目
```
git clone https://github.com/ameersmu2004-rgb/Speedometer-ECU-Simulator.git
cd Speedometer-ECU-Simulator/speedo-ecu
```
### 第 2 步 — 一键启动 *(推荐)*
```
chmod +x run.sh
./run.sh
```
`run.sh` 脚本会自动执行以下操作:
- 检查 Python 3
- 如果缺失,自动安装 `python3-tk` 和 `python-can`
- 配置 `vcan0` 虚拟 CAN 接口
- 启动 GUI
### 手动设置(如果您偏好逐步操作)
**安装依赖项:**
```
sudo apt update
sudo apt install -y python3-tk
pip3 install python-can --break-system-packages
```
**设置虚拟 CAN 接口:**
```
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
```
**启动 GUI:**
```
python3 main_speedo.py
```
## 使用 GUI
一旦运行,GUI 会分为三个主要区域打开:
### 左侧面板 — 速度表表盘
动态表盘会自动运行物理模拟:ECU 从停车状态开始,加速、巡航,然后刹车,循环往复。所有实时数值(速度、RPM、燃油、温度)都会实时更新。
### 右侧面板 — 控制与日志
| 标签页 | 显示内容 |
|---|---|
| **UDS 日志** | 所有 UDS 请求与响应(SID、DID、NRC) |
| **原始帧日志** | `vcan0` 处于活动状态时的原始 CAN 帧 |
| **Oracle / 漏洞日志** | 漏洞命中和 Oracle 事件 |
### 加载漏洞配置文件
1. 在控件中点击 **Load Vuln JSON**
2. 选择 `speedometer_vulns.json`(包含在项目文件夹中)
3. Oracle 现已激活 — 特定格式的畸形 UDS 帧将触发记录在案的漏洞事件
## 从您自己的工具发送 UDS 帧
GUI 运行后,`vcan0` 即处于活跃状态。您可以从任何工具(FucyFuzz、cantools、原始 Python)与其进行通信:
```
pip3 install can-isotp
```
```
# 读取 Vehicle Speed (DID 0xF40D)
import can, isotp, time
bus = can.Bus('vcan0', bustype='socketcan')
addr = isotp.Address(isotp.AddressingMode.Normal_11bits, txid=0x7E0, rxid=0x7E8)
stack = isotp.CanStack(bus, address=addr)
stack.send(bytes([0x22, 0xF4, 0x0D]))
time.sleep(0.2)
stack.process()
if stack.available():
print('Response:', stack.recv().hex().upper())
bus.shutdown()
```
**ECU 地址配置:**
| | 数值 |
|---|---|
| Tester → ECU (RX) | `0x7E0` |
| ECU → Tester (TX) | `0x7E8` |
| 接口 | `vcan0` |
## 支持的 UDS 服务
| SID | 服务 |
|---|---|
| `0x10` | DiagnosticSessionControl (Default / Extended / Programming) |
| `0x11` | ECUReset |
| `0x27` | SecurityAccess (seed/key challenge) |
| `0x22` | ReadDataByIdentifier |
| `0x2E` | WriteDataByIdentifier |
| `0x3E` | TesterPresent |
| `0x19` | ReadDTCInformation |
| `0x14` | ClearDTC |
| `0x28` | CommunicationControl |
## 项目结构
```
speedo-ecu/
├── main_speedo.py ← Entry point — run this
├── speedo_gui.py ← Tkinter GUI (dial, gauges, log panels)
├── speedo_ecu.py ← UDS service handler
├── speedo_state.py ← ECU state + physics simulation loop
├── speedometer_vulns.json ← Vulnerability profiles for the Oracle engine
├── run.sh ← Auto-setup + launch script
├── config.py ← CAN interface / address config
├── uds_core.py ← UDS protocol core
├── uds_constants.py ← SID / NRC hex constants
├── uds_helpers.py ← Hex formatting helpers
├── isotp_server.py ← ISO-TP framing layer
├── vulnerability_engine.py ← Evaluates frames against vuln profiles
├── vulnerability_config.py ← Loads JSON vuln config
├── logger.py ← Structured logger (text + JSONL)
├── ecu_memory.py ← Virtual NVM / memory map
├── ecu_state.py ← Base ECU state class
└── logs/ ← Auto-created; session logs saved here
```
## 故障排除
**`ModuleNotFoundError: No module named 'can'`**
```
pip3 install python-can --break-system-packages
```
**`ModuleNotFoundError: No module named 'tkinter'`**
```
sudo apt install python3-tk
```
**未找到 `vcan0` / CAN 帧未出现**
```
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
```
**GUI 打开但表盘空白 / 卡死**
确保您在带有图形显示界面的环境下运行(而非无头 SSH 会话)。如果使用 SSH,请使用 `ssh -X` 转发显示,或使用桌面会话。
## 许可证
本项目作为 FucyTech 汽车网络安全实习项目的一部分开发。仅供研究与教育用途。
标签:CAN总线, ECU模拟器, UDS协议, 汽车安全, 漏洞靶场, 逆向工具, 防御检测