逆向我的电动滑板车并用 Rust 重写固件:从藏在 USB-C 引脚里的 CAN 总线到无鉴权刷机
来源: bensimms.moe — 2026-08-09
概述
作者给自己那辆 Egret GT 电动滑板车做了一次彻底的硬件与固件逆向,并全程用 Rust 写了显示器固件。起因是一个小疙瘩:按住下键上电会进固件更新模式,退出后能绕过 PIN 直接骑行。他从手机 App 的蓝牙处理器入手,发现厂方会把总骑行时长、里程与充电历史回传并关联到车辆 ID,这些行为在 App 里并没讲清楚。接着他把目光投向标称「仅供充电」的 USB-C 口,用示波器一探才发现其中两个引脚竟被当成 CAN 总线在用;于是拿 ESP32-C6 + MCP2515 搭了个 CAN 嗅探器,逐个标出油门、档位、电机转速等报文。随后他买回控制器与显示器拆解:控制器的 APM32E103 主控四根焊盘正是 SWD,OpenOCD 直读 flash/RAM 后用 Ghidra 逆出三套程序——引导、更新器与主应用,还在固件长度字段那里见到用 ASCII 十进制的奇葩存法。显示器里有 AT32F415、蓝牙 CH573、NFC 读卡器等多颗芯片,整个刷机流程毫无加密,引导器校验一段 CRC 后直接把 64 字节块写进 flash——意味着理论上可以无鉴权改任何一台滑板车。
核心要点
- 作者发现厂方会回传总时长/里程/充电历史并关联车辆 ID,App 并未清楚告知
- 所谓「仅供充电」的 USB-C 口,示波器一测竟有两引脚被用作 CAN 总线
- 控制器主控 APM32E103 的焊盘是 SWD,OpenOCD 直读 flash/RAM 再用 Ghidra 逆向
- 控制器固件分引导/更新器/主应用三段,固件长度竟以 ASCII 十进制字符串存储
- 刷机协议毫无加密:64 字节分块、CRC-16-CCITT 校验后直接写 flash,可无鉴权改装
- 他选择避开安全攸关的 FOC 电机控制,改从显示器侧写自己的 Rust 固件
金句
Yes, this also means that it's possible to modify the firmware of any scooter without authentication :))))
👍 0
👎 0
返回 Lobsters 首页