第4章:CAN总线嗅探——用Wireshark抓取CAN报文、过滤与分析CAN ID、识别关键信号

好,咱们进入实战环节。CAN总线嗅探,说白了就是“听”车上的通信。你想想看,ADAS系统里那么多传感器、控制器,它们之间怎么说话?就是通过CAN总线。我们做安全测试,第一步就是得知道它们在聊什么。

我个人习惯,上车第一件事就是接上CAN总线,打开Wireshark。嗯,别急着抓包,先搞清楚拓扑结构。我在项目中遇到过,有人直接怼上去,结果总线负载过高,导致ECU复位——那场面,挺尴尬的。

4.1 硬件准备与连接

你需要一个CAN转USB的工具。我常用的是PCAN-USB或者Kvaser Leaf Light。别买太便宜的,稳定性差,丢包了你还不知道。

  • CAN-High:接工具上的CAN_H
  • CAN-Low:接工具上的CAN_L
  • GND:一定要接!不接地,共模电压会飘,数据全是错的
警告: 我曾经见过有人把CAN_H和CAN_L接反了,结果抓了一整天全是错误帧。记住,CAN_H是2.5V~3.5V,CAN_L是1.5V~2.5V,量一下再动手。

4.2 Wireshark配置与抓包

Wireshark默认不支持CAN协议。你得装个插件,或者用专门的CAN分析软件。我推荐用SocketCAN + Wireshark的组合,Linux下特别好用。

配置步骤:

  1. 加载vcan内核模块:sudo modprobe vcan
  2. 创建虚拟CAN接口:sudo ip link add dev vcan0 type vcan
  3. 启动接口:sudo ip link set up vcan0
  4. 用candump抓取:candump vcan0 -l,生成log文件
  5. 在Wireshark中打开log文件,或者用cangen模拟数据

核心命令:

# 实时抓取并显示
candump vcan0

# 保存到文件
candump -l vcan0

# 过滤特定ID(比如0x123)
candump vcan0,0x123:0x7FF

为什么用0x7FF?这是11位ID的掩码。说白了,就是只匹配ID的高11位。你想想看,CAN 2.0A标准就是11位ID,0x7FF就是全匹配。

4.3 过滤与分析CAN ID

抓到的报文里,ID是最关键的信息。我一般先看ID的分布规律。举个例子,ADAS系统的雷达数据通常集中在0x300~0x3FF区间,摄像头数据在0x400~0x4FF。

Wireshark过滤语法:

  • can.id == 0x123:只看ID为0x123的报文
  • can.id >= 0x300 && can.id <= 0x3FF:看一个范围
  • can.dlc == 8:只看8字节的数据帧(大部分ADAS信号都是8字节)
小技巧: 我习惯先抓5分钟的总线数据,然后按ID排序。你会发现,有些ID每秒出现100次,有些只有10次。频率高的,通常是控制信号或传感器数据。频率低的,可能是诊断或配置信息。

4.4 识别关键信号

识别信号,说白了就是猜。你想想看,一个8字节的CAN报文,64个bit,哪些bit代表车速?哪些代表方向盘转角?

我的方法:

  1. 静态分析:车不动时抓一次,记录所有ID的值
  2. 动态激励:踩油门、打方向盘、按按钮,观察哪些bit变了
  3. 差分分析:对比两次抓包,变化的bit就是信号

举个例子,我曾在某款车上分析ACC(自适应巡航)信号:

操作 ID 数据变化 推测含义
踩油门 0x128 Byte[2]从0x00变为0x3F 油门踏板位置
打左转向 0x1A0 Bit[3]从0变为1 转向灯状态
按ACC开关 0x2B0 Byte[0]从0x00变为0x01 ACC使能信号

避坑指南: 我曾经花了一整天去分析一个信号,怎么变都不对。后来发现,那个信号是Intel字节序(小端),而我按Motorola(大端)解析的。记住,CAN报文默认是Motorola格式,但很多ADAS厂商用Intel。你最好先看DBC文件确认。

4.5 实战:抓取ADAS雷达信号

咱们来走一遍完整流程。假设你要分析某款车的毫米波雷达数据。

  1. 连接硬件,启动candump,抓取30秒数据
  2. 在Wireshark中打开,过滤出ID范围0x300~0x3FF
  3. 观察数据变化:雷达检测到障碍物时,Byte[4]和Byte[5]会变化
  4. 记录下变化的bit位置,这就是目标距离信号
  5. 用同样的方法,找出目标速度、角度信号

嗯,这里要注意。雷达数据通常是浮点数,但CAN报文里是整数。你需要知道缩放因子和偏移量。比如,距离信号可能是:实际距离 = 原始值 * 0.01 - 10(单位米)。

我的经验: 别试图一次分析所有信号。先找出3~5个关键信号(比如车速、转向、制动),其他的慢慢来。你想想看,ADAS系统有上百个信号,一天根本搞不完。

4.6 总结与下一步

CAN总线嗅探,是ADAS安全测试的敲门砖。你学会了抓包、过滤、分析ID、识别信号,接下来就可以做更高级的测试了,比如重放攻击、模糊测试。

我个人建议,每次测试前先花10分钟做静态分析。车不通电时抓一次,上电后抓一次,发动机启动后再抓一次。对比这三组数据,你能快速定位哪些ID是关键的。

好,这一章就到这儿。下一章咱们聊聊如何用Python写个脚本,自动解析CAN信号。到时候,我会分享一个我常用的解析库,省得你手算bit位。