4、CAN总线嗅探:使用Wireshark捕获CAN报文、过滤与分析CAN ID、识别关键信号

好,咱们进入第四章。这一章我打算聊聊CAN总线嗅探。说实话,这是ADAS安全测试里最基础、也最核心的一步。你想想看,如果连报文都抓不到、看不懂,后面那些攻击模拟根本无从谈起。

我个人习惯把CAN嗅探比作“听诊”。一辆智能汽车在路上跑,它的CAN总线就像人的神经系统,不断在传递心跳、血压、体温这些关键数据。而Wireshark,就是我们的听诊器。嗯,今天我们就来聊聊怎么用好这个听诊器。

4.1 硬件准备:你得先“接上线”

在开始抓包之前,先得把物理链路打通。我见过不少新手,软件玩得贼溜,结果一上车发现线都接不对,这就尴尬了。

你需要准备这些东西:

  • CAN转USB工具:比如PCAN-USB、Kvaser Leaf Light v2,或者便宜点的USB-CAN Analyzer。我个人推荐PCAN,稳定,抗干扰能力强。我在项目里遇到过廉价工具丢包的情况,排查了半天,最后发现是工具本身的问题。
  • 120欧终端电阻:CAN总线两端必须各有一个120Ω电阻。如果车上已经带了,你就不用加。如果不确定,最好自己备一个。我曾经在测试一台改装车时,忘了检查终端电阻,结果抓到的报文全是乱码,折腾了半小时才发现是阻抗不匹配。
  • 杜邦线或DB9接头:用来连接你的工具和车辆的OBD-II接口。注意CAN-High和CAN-Low的线序,别接反了。
⚠️ 警告: 连接前务必确认车辆已断电或处于安全状态。不要带电插拔CAN接口,容易烧坏收发器。我吃过这个亏,烧过一个PCAN,心疼了好几天。

4.2 软件配置:让Wireshark认识CAN

硬件接好了,接下来就是软件。Wireshark默认不认识CAN报文,你得给它装个“翻译插件”。

具体步骤如下:

  1. 下载并安装最新版Wireshark(我目前用的是4.0.6)。
  2. 安装对应的CAN接口驱动(比如PCAN的驱动)。
  3. 打开Wireshark,你应该能看到一个新的网络接口,名字类似“PCAN-USB”或“CAN bus 0”。
  4. 点击开始捕获。如果一切正常,你会看到一堆数据刷刷地往上跑。

这里有个小技巧:如果Wireshark里看不到CAN接口,多半是驱动没装好,或者权限不够。Linux下记得用sudo运行,Windows下要以管理员身份启动。

4.3 过滤与分析CAN ID:从噪音里找信号

好,现在报文已经抓到了。但你看一眼,是不是头都大了?成百上千条报文,每秒几十上百帧,根本分不清哪个是哪个。

别急,我们得学会过滤。Wireshark的过滤语法很强大,针对CAN报文,我常用的几个过滤条件如下:

过滤表达式 含义 示例
can.id == 0x123 只显示CAN ID为0x123的报文 查看特定ID的信号
can.id >= 0x100 and can.id <= 0x1FF 显示ID在0x100到0x1FF之间的报文 缩小范围,比如只看动力域
can.data contains 01 显示数据段包含字节0x01的报文 寻找特定状态变化
can.dlc == 8 只显示数据长度为8字节的报文 过滤掉短报文

我个人习惯先按ID范围过滤。比如ADAS相关的信号,通常集中在0x200到0x500之间。你可以先抓一段正常行驶的数据,然后回放,观察哪些ID在频繁变化。

💡 提示: 如果你不确定某个ID是干嘛的,可以试试“差分分析法”。记录下车辆静止时的报文,再记录下车辆运动时的报文,对比一下哪些ID的数据变了。变了的就是关键信号。

4.4 识别关键信号:找到方向盘、刹车、车速

过滤出ID之后,下一步就是解析数据。CAN报文的数据段通常是8个字节,但每个字节甚至每个bit都可能代表不同的含义。

举个例子,假设我们抓到了ID为0x128的报文,数据是 02 1A 00 00 00 00 00 00。怎么知道它代表什么?

我的方法是:

  1. 物理动作触发法:比如你转动方向盘,观察哪个ID的数据在跟着变。我曾在测试中,让同事在车里左右打方向盘,我在车外用Wireshark盯着看,很快就锁定了方向盘角度信号。
  2. 数值范围推断法:车速信号通常是一个递增的数值,范围在0-250 km/h左右。如果你看到某个字节在车辆加速时从0x00涨到0x64(100十进制),那八成就是车速。
  3. 逆向工程法:如果以上方法都试过了还是找不到,那就得用CANdb或逆向工具了。不过那是后话,咱们先掌握基础的。

这里我分享一个我自己的经验:识别刹车信号时,别只看数值变化。刹车信号往往是“边沿触发”的,也就是从0跳变到1的那一瞬间。你可以在Wireshark里用 can.data[0] != 0 这样的条件来过滤,能更快找到。

🔑 核心要点: 识别关键信号的核心思路是“控制变量法”。一次只改变一个车辆状态(比如只踩刹车、只打转向灯),然后观察CAN总线上的变化。这是最笨但最有效的方法。

4.5 实战演练:抓一段真实的ADAS报文

理论说完了,咱们来点实际的。假设你现在坐在一辆支持自适应巡航(ACC)的测试车里,我们要抓取ACC激活和关闭时的CAN报文。

操作步骤:

  1. 连接好硬件,启动Wireshark,开始捕获。
  2. 让车辆保持怠速,记录10秒的“背景噪声”。
  3. 按下ACC激活按钮,记录5秒。
  4. 再按下ACC关闭按钮,记录5秒。
  5. 停止捕获,保存为pcapng文件。

然后我们回放分析。你可能会发现,在按下按钮的瞬间,某个ID的数据从 00 变成了 01,或者某个字节的值发生了跳变。恭喜你,你找到了ACC的开关信号。

嗯,这里要注意:有些信号是“取反”的,比如激活时是0x00,关闭时是0x01。别被惯性思维带偏了。

4.6 避坑指南:我踩过的那些坑

最后,我总结几个我在CAN嗅探中踩过的坑,希望能帮你少走弯路。

  • 坑一:波特率不匹配。CAN总线有125k、250k、500k等多种波特率。如果设置不对,抓到的全是错误帧。我曾经在测试一辆进口车时,默认用500k,结果抓了半小时全是乱码,后来才发现人家用的是250k。
  • 坑二:忘记保存过滤条件。Wireshark的过滤条件是可以保存的。我建议你把常用的过滤条件存成配置文件,下次直接加载,省时省力。
  • 坑三:忽略时间戳。分析报文时,时间戳非常重要。它能告诉你信号变化的先后顺序。比如是先有刹车信号,还是先有车速变化?这能帮你理清控制逻辑。

好了,这一章的内容就到这里。CAN嗅探是门手艺活,多练几次就熟了。下一章,我们会聊聊如何利用这些抓到的信号,进行简单的重放攻击。准备好了吗?