汽车安全入门02:OBD-II 接口与诊断协议

导语:方向盘下面那个梯形 16 针接口,99% 的车主从来没用过。但对红队来说,这是物理接触后第一道门 —— 不用拆车,不用逆向 ECU,只要一个 30 块的 ELM327 蓝牙适配器加一台笔记本,就能读故障码、看实时转速、改写 VIN,甚至向 CAN 总线注入任意报文。本讲带你把这道门彻底拆开。


一、OBD-II 是怎么被逼出来的

OBD-I 时代是各车企各搞一套接口:GM 的 ALDL、Ford 的 DCL、Toyota 的诊断口,连针脚定义和波特率都不统一。修理工想读个故障码要备六根线、五本手册。加州空气资源委员会(CARB)1988 年开始头疼,1996 年干脆一刀切:所有在美销售的新车必须符合 OBD-II 标准,欧盟 2001 年跟进(叫 EOBD),日本叫 JOBD。

OBD-II 强制做了三件事:

  • 统一接口:16-pin J1962 梯形头,位置必须在驾驶员 2 英尺范围
  • 统一协议:五种总线任选其一(CAN / ISO 9141-2 / KWP2000 / J1850 PWM / J1850 VPW)
  • 统一语言:标准故障码(DTC)+ 标准参数 ID(PID)+ 标准诊断服务

接口的初衷是环保 —— 让排放检测站能直接读尾气相关数据。但这套东西放在 ECU 出口,任何接了 CAN 总线的控制器都被动暴露了。

OBD-II J1962 接口示意

二、J1962 接口的 16 个针脚

J1962 是梯形母头,关键针脚记住 4 个就够上手:

针脚定义用途
4底盘地必接,所有协议共用地
5信号地必接,部分协议用
6CAN-HISO 15765-4 高速 CAN 高位线
14CAN-LISO 15765-4 高速 CAN 低位线
16+12V 电源适配器从车载电池取电

2008 年之后美国新车几乎都走 pin 6/14 的 CAN。老车看车:丰田、本田早期多用 pin 7/15 的 K-Line,福特早期是 pin 2/10 的 J1850 PWM,通用 VPW 走 pin 2。拿到一辆车先看针脚是否带铜芯,比问年份更准。

三、五大协议一句话速览

  • ISO 15765-4 (CAN 500kbps/250kbps):现在主流,2008+ 标配
  • ISO 9141-2 / ISO 14230-4 (KWP2000):欧系、亚系老车多见,单线 K-Line
  • SAE J1850 VPW (Variable Pulse Width):通用 1996-2008
  • SAE J1850 PWM (Pulse Width Modulation):福特 1996-2008

OBD-II 不强制必须 CAN,但红队都希望目标走 CAN —— 因为 CAN 总线连接着车内几十个 ECU(动力、车身、底盘、信息娱乐),从一个点能辐射到整辆车。

四、ELM327:红队的入门瑞士军刀

ELM Electronics 这家加拿大公司 2005 年推出 ELM327,一颗 PIC18F2480 单片机,把上面五种协议全部封装成 ASCII AT 命令。它的命令集类似老式调制解调器:

ATZ        # 重置
ATE0       # 关闭回显
ATL0       # 关闭换行
ATSP0      # 自动识别协议
0100       # Mode 01 PID 00:问车支持哪些 PID
010C       # Mode 01 PID 0C:问发动机转速
03         # Mode 03:读故障码(DTC)
04         # Mode 04:清故障码(点亮故障灯)

ELM327 把硬件层的 CAN 帧、J1850 字节、ISO 时序全部藏起来,用户只面对 01 0C 这种”读转速”的十六进制服务号 + PID 号。原始 ELM Electronics 公司 2020 年宣布 2022 年关门,但芯片代码早被克隆 —— 市面上 30 块的蓝牙 OBD-II 适配器 99% 是 v1.4 克隆版,问题一堆(协议识别慢、丢帧),但对入门够了。

五、用 python-OBD 跑通 30 分钟实验

Bryson Payne 那篇《Car Hacking in 30 Minutes》选的就是 ELM327 + python-OBD 这条最短路径。Linux 上三步:

sudo apt-get install -y python3-pip bluez
pip3 install python-obd      # 装库
sudo rfcomm bind 0 <蓝牙MAC> 1    # 绑定蓝牙串口

然后一段 5 行的 Python 就能实时拉数据:

import obd

connection = obd.OBD()  # 自动连 rfcomm0
cmd = obd.commands.RPM   # 引擎转速(PID 0x0C)

while True:
    response = connection.query(cmd)
    print(f"{response.value} {response.unit}")  # 比如 "2750.0 revolution_per_minute"

跑起来就能看到怠速 700-800 rpm、油门踩下去冲到 3000+。obd.commands.SPEED / obd.commands.COOLANT_TEMP / obd.commands.GET_DTC 都现成可用。

六、读 DTC + 清码 = 修理工也能干,但也是欺骗

DTC 是 5 位编码:首字母分系统(P 动力 / B 车身 / C 底盘 / U 网络),第二位 0 是通用、1 是厂商自定,后 3 位是具体故障号。比如 P0301 = 第一缸失火,U0100 = 与某 ECU 通信丢失。

ELM327 跑 03 拿到的是一串 hex,要解回 P0301 这种可读码。python-OBD 直接给你 list of DTC objects。清码用 04 服务,一键关灯 —— 但红队更关心的是:你能读,清码也就几秒。这意味着 OBD-II 上能”翻脸不认账”。

更危险的是 Service 2E(写数据到 ECU)和 Service 27(安全访问 / Seed-Key)。下讲会拆 ECU 和 UDS,专门讲这两个。

J1979 的 10 个诊断服务

OBD-II 标准定义了 10 个 Service(2002 年前叫 Mode):

Service含义红队用法
01读实时数据转速、车速、冷却液温度、氧传感器电压
02读冻结帧上次 DTC 触发时的数据快照
03读 DTC故障码列表
04清 DTC一键关 MIL 灯
05读氧传感器测试结果已废,2007 后由 Service 01 PID 0x15 接替
06读车上监控(O2 / Misfire)结果检测老车型时还会遇到
07读待定 DTC一次驾驶循环都没跑完就触发的码
08请求车内控制(蒸发清污、怠速)老车技师用得多
09读车辆信息(VIN、CID、CVN)改表改里程必查
0A读永久 DTC清除后还留底的码

Service 09 PID 02(VIN)和 Service 01 PID 0x51(车型年款)是红队做”改表换身份”操作时第一个要查的。

七、ELM327 AT 命令交互时序

ELM327 AT 命令交互时序

八、防御视角

OBD-II 攻击成本低到只需要 30 块适配器 + 一根弯腰的 5 秒,所以对抗方法不能靠”防接口存在”,要靠分层:

  • 物理层:驻车后 OBD 端口可加锁扣(很多出租车公司这么做)
  • 网关层:现代车 CAN 总线有中央网关(CGW),把 OBD-II 接到动力 CAN、把信息娱乐隔到另一条,限制跨段报文
  • 认证层:UDS 0x27 安全访问 + Seed-Key 认证,禁用默认密钥
  • 监控层:检测异常 OBD-II 写入(频率、来源、Service ID),车机 IDS 告警

OBD-II 的灰色产业

OBD-II 在车险、二手车、租车三个领域已经是标配工具:

  • 车险 UBI(Usage-Based Insurance):4S 店或保险公司送的”驾驶行为记录仪”本质就是 OBD-II 蓝牙适配器 + SIM 卡,每秒上报车速、急刹、急加速。你以为送你的是个”赠品”,其实是数据采集器。
  • 二手车调表:商家用 Service 04 清故障码 + Service 03 验码,配合工具刷写里程。OBD-II 接口的”合法存在”让这种操作门槛极低。
  • 租车公司 GPS 跟踪:远程断油断电(Service 2F 控制 IO)就是从 OBD-II 做的,车主完全不知情。

正规场景下 OBD-II 是诊断利器,灰色场景下它就是”数字钥匙孔”。

九、思考题

  1. 用 ATSPA0(自动协议识别)连一辆 2012 年丰田凯美瑞,AT 命令日志能看到协议切换过程。这段日志能告诉我们什么关于车辆年代和地区的信息?
  2. python-OBD 调 connection.query(obd.commands.GET_DTC) 拿到的是当前故障码。要拿到”历史码”和”冻结帧”该用什么 Service?

答案藏在 SAE J1979 第 8 章。下讲我们直接捅到 ECU 内部,看 UDS 的 0x27 安全访问和 0x2E 写数据 —— 那才是 OBD-II 背后真正的”主菜”。


十、本期素材出处

  • #16 Car Hacking in 30 Minutes or Less — Bryson Payne, 2018 → https://brysonpayayne.com/2018/10/20/start-car-hacking-in-30-minutes-or-less/
  • #125 ELM327 — ELM Electronics 官方(已停业)→ https://www.elmelectronics.com/obdic.html
  • #124 Freematics OBD-II Telematics Kit — Arduino OBD 入门硬件 → https://freematics.com/pages/products/arduino-telematics-kit-3/
  • 参考:Wikipedia OBD-II / OBD-II PIDs / ELM327 词条(综合参考)
  • 工具仓库:python-OBD → https://github.com/brendan-w/python-OBD
  • 工具仓库:ELM327 命令手册(第三方整理版)→ https://www.elmelectronics.com/DSheets/ELM327DS.pdf

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容