第3章:CAN总线基础
3.1 CAN协议帧结构
CAN总线,说白了就是汽车内部的神经系统。我刚开始接触ADAS测试时,第一件事就是搞懂CAN帧长什么样。
一个标准CAN数据帧,由这么几部分组成:
- SOF(起始帧):1个显性位,告诉所有节点“我要发数据了”
- 仲裁场:11位ID + 1位RTR,这里决定了谁有优先权
- 控制场:6位,包含IDE、保留位和DLC
- 数据场:0-8字节,真正干活的数据
- CRC场:15位校验 + 1位界定符
- ACK场:2位,接收节点确认
- EOF:7位隐性位,帧结束
重点记住:CAN帧最大数据长度只有8字节。很多新手问我为什么不能多传点?嗯,这是为了实时性做的妥协。你想想看,ADAS系统里刹车指令延迟1ms都可能出大事。
我在做某主机厂的AEB测试时,遇到过一个问题:某个ECU发送的帧总是丢数据。后来发现是DLC设置错了,明明只发4字节,DLC却写了8。接收方傻傻地等了8字节,结果超时了。这种坑,踩过一次就记住了。
3.2 CAN ID与DLC
CAN ID,就是每个消息的身份证。ID越小,优先级越高。0x000是最高的,0x7FF是最低的。
为什么这样设计?因为CAN总线是CSMA/CA机制,多个节点同时发送时,ID小的会“赢”。说白了就是:谁ID小谁先走。
| ID范围 | 优先级 | 典型应用 |
|---|---|---|
| 0x000 - 0x0FF | 最高 | 刹车、转向等安全关键消息 |
| 0x100 - 0x3FF | 中等 | 发动机、变速箱控制 |
| 0x400 - 0x7FF | 较低 | 车窗、空调等舒适系统 |
DLC(数据长度码),就是告诉接收方“我这次带了几个字节”。取值范围0-8。我建议你在做渗透测试时,一定要检查DLC是否合法。我曾经见过一个攻击样本,把DLC改成9,结果接收ECU直接崩溃了。
实战技巧:用CANalyzer或PCAN抓包时,第一件事就是看ID分布。如果某个ID出现频率异常高,八成有问题。我在一次测试中,发现0x123这个ID每秒出现了1000次,正常应该是100次。后来查出来是某个节点时钟漂移导致的。
3.3 CAN总线物理层特性
物理层这块,很多人觉得枯燥。但我要说,不懂物理层,渗透测试就是瞎搞。
CAN总线用两根线:CAN_H和CAN_L。差分信号传输,说白了就是两根线的电压差来决定是0还是1。
- 显性位(逻辑0):CAN_H 3.5V,CAN_L 1.5V,压差2V
- 隐性位(逻辑1):CAN_H 2.5V,CAN_L 2.5V,压差0V
为什么要用差分?抗干扰啊!你想想看,汽车发动机舱里电磁干扰那么强,单端信号早就被干废了。差分信号共模抑制比高,干扰来了两根线一起变,压差不变。
注意:CAN总线终端电阻必须是120Ω,而且要在总线两端各放一个。我见过有人偷懒只放一个,结果信号反射严重,通信时好时坏。做渗透测试时,可以故意拔掉一个终端电阻,看看系统会不会报警。
波特率也是个关键参数。常见的CAN波特率有:
| 波特率 | 总线长度 | 典型应用 |
|---|---|---|
| 125 kbps | 500m | 车身控制、舒适系统 |
| 250 kbps | 250m | 动力系统、诊断 |
| 500 kbps | 100m | ADAS、底盘控制 |
| 1 Mbps | 40m | 高速数据、刷写 |
我记得有一次做ADAS雷达的渗透测试,发现雷达发出的CAN消息总是丢包。查了半天,原来是波特率设置错了。雷达用的是500k,但网关配置成了250k。这种低级错误,在实车测试中其实很常见。
避坑指南:我曾经在测试CAN FD时犯过一个错。CAN FD的波特率可以到8Mbps,但数据段和仲裁段的波特率可以不同。我一开始没注意,直接用CAN工具默认配置去抓,结果数据全是乱码。后来才意识到,CAN FD的物理层和经典CAN不一样,需要专门的硬件支持。
最后说一个物理层的攻击面:电压攻击。CAN总线的显性位电压是3.5V/1.5V,如果你能注入一个更高的电压(比如12V),就可以强制把总线拉成显性,造成总线锁死。这种攻击在物理接入的情况下很容易实现,所以做渗透测试时一定要检查ECU的CAN收发器有没有过压保护。
嗯,CAN总线基础就讲这么多。下一章我们会聊CAN协议的更高层——比如J1939和UDS,这些在ADAS渗透测试中更常用。记住我今天说的:帧结构要熟记,ID和DLC要检查,物理层特性要理解。这三样搞定了,CAN总线这块你就入门了。