第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:一定要接!不接地,共模电压会飘,数据全是错的
4.2 Wireshark配置与抓包
Wireshark默认不支持CAN协议。你得装个插件,或者用专门的CAN分析软件。我推荐用SocketCAN + Wireshark的组合,Linux下特别好用。
配置步骤:
- 加载vcan内核模块:
sudo modprobe vcan - 创建虚拟CAN接口:
sudo ip link add dev vcan0 type vcan - 启动接口:
sudo ip link set up vcan0 - 用candump抓取:
candump vcan0 -l,生成log文件 - 在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字节)
4.4 识别关键信号
识别信号,说白了就是猜。你想想看,一个8字节的CAN报文,64个bit,哪些bit代表车速?哪些代表方向盘转角?
我的方法:
- 静态分析:车不动时抓一次,记录所有ID的值
- 动态激励:踩油门、打方向盘、按按钮,观察哪些bit变了
- 差分分析:对比两次抓包,变化的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雷达信号
咱们来走一遍完整流程。假设你要分析某款车的毫米波雷达数据。
- 连接硬件,启动candump,抓取30秒数据
- 在Wireshark中打开,过滤出ID范围0x300~0x3FF
- 观察数据变化:雷达检测到障碍物时,Byte[4]和Byte[5]会变化
- 记录下变化的bit位置,这就是目标距离信号
- 用同样的方法,找出目标速度、角度信号
嗯,这里要注意。雷达数据通常是浮点数,但CAN报文里是整数。你需要知道缩放因子和偏移量。比如,距离信号可能是:实际距离 = 原始值 * 0.01 - 10(单位米)。
4.6 总结与下一步
CAN总线嗅探,是ADAS安全测试的敲门砖。你学会了抓包、过滤、分析ID、识别信号,接下来就可以做更高级的测试了,比如重放攻击、模糊测试。
我个人建议,每次测试前先花10分钟做静态分析。车不通电时抓一次,上电后抓一次,发动机启动后再抓一次。对比这三组数据,你能快速定位哪些ID是关键的。
好,这一章就到这儿。下一章咱们聊聊如何用Python写个脚本,自动解析CAN信号。到时候,我会分享一个我常用的解析库,省得你手算bit位。