redragonx/open-rnet
GitHub: redragonx/open-rnet
逆向工程电动轮椅R-Net CAN总线协议的完整研究项目,揭示安全漏洞并为残障用户提供替代控制方案。
Stars: 13 | Forks: 6
# Open R-Net
[](https://www.defcon.org/)
[](LICENSE)
[](https://discord.gg/mYqJSS5)

**逆向工程 R-Net CAN 总线协议以提升电动轮椅的可访问性**
*最初由 Stephen Chavez 和 Specter 于 2016 年 8 月在 DEFCON24 上发布*
## 这是什么?
本项目记录了用于 Permobil、Quickie 等公司制造的电动轮椅中的 R-Net CAN 总线协议,这些轮椅使用了 PG Drives Technology(现为 Curtiss-Wright)的电子设备。
**目标:** 为无法使用标准操纵杆的轮椅用户启用替代控制方法——包括 USB 操纵杆、Xbox 控制器、吸气/吹气(Sip-and-Puff)设备以及基于网络的控制。
## 快速开始
```
# Clone repository
git clone https://github.com/redragonx/open-rnet.git
cd open-rnet
# 设置 CAN interface(Raspberry Pi + PiCAN2)
sudo ip link set can0 up type can bitrate 125000
# Monitor bus
candump can0 -L
# 运行 joystick control(FollowJSM 方法)
python3 contrib/can2RNET/JoyLocal.py
```
有关完整的硬件设置说明,请参阅 **[入门指南](docs/GETTING_STARTED.md)**。
## 文档
### 协议
| 文档 | 描述 |
|----------|-------------|
| **[协议规范](docs/RNET_PROTOCOL_SPECIFICATION.md)** | 完整的逆向工程 R-Net 规范 |
| **[协议指南](docs/RNET_PROTOCOL_GUIDE.md)** | 协议概述与快速参考 |
| **[帧字典](reference/RNET_FRAME_DICTIONARY.md)** | 完整的帧参考(590+ 条目) |
| **[快速参考](docs/QUICK_REFERENCE.md)** | 常见 CAN 操作速查表 |
### 设备协议
| 文档 | 描述 |
|----------|-------------|
| **[R-Net Programmer 协议](docs/RNET_PROGRAMMER_PROTOCOL.md)** | 读写设备配置内存 |
| **[cJSM 显示协议](docs/CJSM_DISPLAY_PROTOCOL.md)** | 彩色 JSM 显示屏文本与模式配置 |
| **[串行认证](docs/SERIAL_NUMBERS.md)** | 基于 XOR 的序列号挑战/响应 |
| **[设备序列号](docs/DEVICE_SERIALS.md)** | 已知设备序列号及网络映射 |
### 安全与诊断
| 文档 | 描述 |
|----------|-------------|
| **[错误代码](docs/RNET_ERROR_CODES.md)** | 错误代码定义与处理 |
| **[ESP 协议](docs/ESP_PROTOCOL.md)** | 电子稳定程序(ESP)协议 |
| **[安全限制](docs/SAFETY_RESTRICTIONS.md)** | 安全限制与锁定行为 |
| **[ICS 座椅系统](docs/ICS_SEATING_SYSTEM.md)** | ICS 座椅系统文档 |
### 固件与配置
| 文档 | 描述 |
|----------|-------------|
| **[固件分析](docs/FIRMWARE_DUMP_ANALYSIS.md)** | BTMouse 和 LEDJSM 固件转储分析 |
| **[固件逆向工程](docs/FIRMWARE_REVERSE_ENGINEERING.md)** | HCS08 微控制器代码分析 |
| **[OBP 启用指南](docs/OBP_ENABLE_GUIDE.md)** | 如何启用 On-Board Programming 模式 |
| **[配置文件格式](docs/RNET_CONFIG_FILE_FORMAT.md)** | R-Net Programmer 的 .R-net 二进制文件格式 |
| **[LEDJSM 配置分析](docs/LEDJSM_CONFIG_ANALYSIS.txt)** | 详细的配置结构分析 |
### 入门
| 文档 | 描述 |
|----------|-------------|
| **[入门指南](docs/GETTING_STARTED.md)** | 硬件设置与初始步骤 |
| **[技术参考](CLAUDE.md)** | 综合技术笔记、算法和协议细节 |
## 主要特性
- **完整的协议规范** - 完整的逆向工程 R-Net CAN 总线协议
- **Python 库** - 用于 SocketCAN 通信的 `can2RNET.py`
- **控制脚本** - 支持 USB 操纵杆和 Xbox 控制器
- **协议工具** - 帧解码器、认证生成器、抓包分析器
- **R-Net Programmer 工具** - 读写设备配置内存
- **配置解析器** - 解析和比较 .R-net 配置文件
- **固件分析** - HCS08 固件转储与逆向工程
- **27+ 数据包捕获** - 用于协议分析的 PCAP 文件
- **25 个配置文件** - 来自多款轮椅型号的真实 .R-net 配置
- **三种控制方法** - FollowJSM、JSMerror、EmulateJSM
## 硬件要求
**方案一:Raspberry Pi + PiCAN2**(约 115 美元)
- Raspberry Pi 3/4
- PiCAN2 HAT with SMPS
- R-Net 4 针连接器
**方案二:Arduino + CAN Shield**(约 75 美元)
- Arduino UNO
- SparkFun CAN-BUS Shield
- R-Net 4 针连接器
## R-Net 连接器引脚定义
```
+---------+
| 1 | 2 | 1: CAN Lo
|----+----| 2: CAN Hi
| 3 | 4 | 3: +24VDC
+---------+ 4: GND
```
## 协议概述
R-Net 使用 **CAN 2.0B 协议,波特率为 125Kbps**,其特性包括:
- 用于控制和模式选择的标准帧(11 位)
- 用于数据和配置的扩展帧(29 位)
- 基于 XOR 的串行认证(安全性较弱)
- 10ms 的操纵杆帧定时
```
+---------------------------------------------+
| R-Net Protocol Stack |
+---------------------------------------------+
| Layer 4: Joystick, Speed, Parameters, Tones |
| Layer 3: Serial Auth, Device Slot Assignment |
| Layer 2: Standard (11-bit) / Extended (29-bit) Frames |
| Layer 1: CAN 2.0B @ 125Kbps |
+---------------------------------------------+
```
## 控制方法
| 方法 | 描述 | 优点 | 缺点 |
|--------|-------------|------|------|
| **FollowJSM** | 紧随 JSM 之后发送帧 | JSM 仍可正常工作 | 对时序要求极高 |
| **JSMerror** | 触发 JSM 错误,接管控制 | 可靠性高 | 会禁用 JSM |
| **EmulateJSM** | 伪造完整的 JSM 启动过程 | 无需 JSM | 需要已知序列号 |
## 实用脚本
```
# Self-program 你的 chair(交互式)
python3 tools/rnet_self_program.py
# 启用 OBP 模式(引导式,安全 — 先备份)
python3 tools/rnet_obp_mode.py --enable
# 读取 OBP parameters
python3 tools/rnet_obp_mode.py --read 0x06 0x01 # Forward Speed
# Decode R-Net frames
python3 tools/rnet_utils.py decode-frame 02000100#0064
# 底层 memory read/write(POP dongle 协议)
python3 tools/rnet_programmer.py read 0x0000 0x100 -o dump.bin
# Parse .R-net 配置文件
python3 tools/rnet_config_parser.py config.R-net --json
```
## 项目结构
```
open-rnet/
+-- tools/ # User-facing Python tools
| +-- rnet_self_program.py # Self-programming tool (start here)
| +-- rnet_programmer.py # Low-level POP protocol read/write
| +-- rnet_obp_mode.py # OBP (On-Board Programming) mode tool
| +-- rnet_pop_shell.py # Interactive POP protocol shell
| +-- rnet_utils.py # Protocol analysis utility
| +-- rnet_config_parser.py # .R-net config file parser
+-- lib/ # Core CAN library
| +-- can2RNET.py # SocketCAN interface functions
+-- docs/ # Protocol documentation (18 files)
| +-- PROGRAMMER_TOOLS_GUIDE.md # How to use the tools
| +-- RNET_PROTOCOL_SPECIFICATION.md
| +-- POP_PROTOCOL.md # POP protocol from DLL RE
| +-- RNET_DEVICE_CATALOG.md # All device types and params
| +-- ...
+-- hardware/ # Firmware and setup scripts
| +-- arduino_slcan/ # SLCAN firmware for Arduino
| +-- scripts/ # CAN interface shell scripts
+-- captures/ # 27+ R-Net packet captures
+-- configs/ # Chair configuration data
| +-- raw/ # .R-net files (7 chair models, 25 files)
| +-- parsed/ # Extracted settings (JSON, CSV)
+-- analysis/ # Reverse engineering tools
| +-- firmware/ # Firmware analysis scripts
| +-- protocol/ # Protocol analysis scripts
+-- reference/ # Frame dictionary and references
| +-- RNET_FRAME_DICTIONARY.md # 590+ frame entries
+-- contrib/ # Upstream code
| +-- can2RNET/ # Upstream redragonx/can2rNET
+-- CLAUDE.md # Technical reference
+-- LICENSE # GPLv3
```
## 安全警告
**电动轮椅是至关重要的医疗设备。**
- 务必配备物理紧急停止开关
- 测试期间请将轮椅悬空(车轮离地)
- 需有专人在旁监护
- 实施软件安全限制
- 在实际应用前进行彻底测试
## 研究发现
### 安全漏洞
- 所有 CAN 通信均无加密
- 基于 XOR 的认证(RTR 帧中的挑战值被忽略)
- 可进行基于时序的帧欺骗
- 错误注入可实现完全控制接管
- XOR 表可从抓包或固件中提取
- 无固件签名验证(固件可被篡改)
### 已发现的协议
- 序列号挑战/响应认证算法
- 参数交换协议(0x78X/0x79X)
- R-Net Programmer 读写协议(0x78F/0x793)
- 配置传输协议(0x1E3X-0x1E8X)
- cJSM 显示文本协议(寄存器 0x8C)
- Bluetooth 模块状态帧
- 模式配置帧(0x1ECXXXXX)
### 固件
- Freescale/NXP HCS08 8 位微控制器(MC9S08DZ 系列)
- Motorola S-Record 格式固件转储
- 基于 XOR 的配置加密(密钥存储在固件 0x0160 处)
- 哨兵值 0x18A7 标记未初始化的配置槽
## 贡献
发现了新内容?欢迎贡献:
- 记录新的帧类型
- 分享匿名化的数据包捕获
- 改进 Python 库
- 增加对新输入设备的支持
## 参考文献
- [DEFCON24 技术演讲](docs/presentations/canPPT.pdf)
- [DEFCON24 个人故事演讲](docs/presentations/DEFCON24_chairhacking.pdf)
- [can-utils](https://github.com/linux-can/can-utils)
- [SocketCAN 文档](https://www.kernel.org/doc/html/latest/networking/can.html)
## 作者
- **Stephen Chavez** - [@redragonx](https://github.com/redragonx)
- **Specter**
## 许可证
本项目采用 GPLv3 授权 - 详见 [LICENSE](LICENSE) 文件。
本研究仅出于教育和提升可访问性的目的提供。请负责任地使用,并始终将安全放在首位。
*"为了可访问性而黑轮椅,而非为了恶作剧。"* - DEFCON24
标签:CAN嗅探, CAN总线, DEFCON, PG Drives Technology, PiCAN2, Raspberry Pi, R-Net协议, USB游戏手柄控制, 云资产清单, 内存执行, 医疗设备安全, 协议分析, 实时处理, 嵌入式安全, 无障碍技术, 权限提升, 物联网安全, 电动轮椅, 硬件黑客, 网络控制, 车联网安全, 辅助技术, 逆向工具, 逆向工程, 防御绕过