CAN总线学习过程

此文记录一下CAN总线学习笔记

0 CAN 相关知识


CAN总线可以被理解为一个嘈杂、拥挤、缓慢的以太网局域网,不过流量为UDP而不是TCP。
图1来源https://cloud.tencent.com/developer/article/1662635

1 CAN总线的优势

1、从传输速度角度:

数据传输速度相对较高,可达到1 Mbit/s。(此时距离最长40m;通信距离最远可以达到10km,但是速率会降到5kbps以下)(CAN-FD和CAN-XL分别可以达到2 Mbit/s和10 Mbit/s。)

2、从成本角度:

多主通信模式,从而降低节点设计成本
采用双绞线作为通信介质,从而降低布线成本

3、从可靠性角度:

采用差分数据线,抗干扰能力强
使用CRC校验方式,具有错误侦听的自我诊断功能,通信可靠信较高
报文帧仲裁失败或传输期间被破坏有自动重发机制
节点在错误严重的情况下,具有自动脱离总线的功能,切断与总线的联系,不影响总线的正常工作(错误帧自我诊断)

4、从实时性角度:

采用短帧结构,报文帧的有效字节数是8个
报文ID越小,优先级越高。报文ID分为不同的优先级,进一步满足网络报文的实时性要求
非破坏性总线仲裁处理机制

5、驱动单元数量角度:

理论上可以带动110个节点

2 CAN如何工作?


汽车有多个节点,可以接受和发送报文

节点比如:发动机控制单元、安全气囊、变速箱、齿轮单元、防抱死制动系统(ABS)、信息娱乐系统、气候控制系统、车窗、车门等部件。

报文基本上由一个 ID 组成,ID分为不同的优先级,一次可以是 8 个字节或更少。

CAN 总线由两根不同的导线组成,由于它是总线,因此这些导线可以连接到多个设备。一个 CAN 帧有 3 个主要部分:

1、仲裁标识符

2、数据长度代码

3、数据领域

下面来看看 CAN 数据帧的结构:
在这里插入图片描述
SOF:帧起始位,显性位表示,标识一个数据帧的开始,用于同步。
ID:表明报文的含义,可以包括报文的源地址和目标地址。
RTR:用于区分数据帧和远程帧,数据帧RTR=0,远程帧=1。
IDE:用于区分标准帧和扩展帧,标准帧IDE=0,扩展帧IDE=1.
SRR:该位无实际意义,SRR永远置1,在扩展帧中表明在该位代替了标准帧中的RTR。
r0、r1:保留位,置0.
DLC:表明数据场中包含数据的字节数,DLC=0~8.
Data Field:数据场,包含CAN数据帧发送的内容。
CRC:用于CRC校验。
DEL:CRC界定符,固定1个隐性位,CRC界定符前进行位填充。
ACK:确定报文被至少一个节点正确接收。
DEL:固定格式,1个隐性位
EOF:表示数据帧结束,固定格式,7个连续的隐性位。
ITM:固定格式,3个连续的隐性位
DEL+EOF+ITM:11个连续的隐性位,节点检测到11个连续隐性位后,认为总线进入空闲阶段,此时节点可以发送报文。

  • 差分电平信号传输

在这里插入图片描述

 CAN BUS上的电平信号(`CAN_diff`)在模拟量上等于`CAN_H`电平与`CAN_L`电平的差值(即`CAN_diff=CAN_H-CAN_L`),可以看到第一张图的每一个bit都是由`CAN_H`与`CAN_L`决定的。
 `CAN_H`与`CAN_L`都为2.5V时为隐性,逻辑为1,电压差为0V。
 `CAN_H`为3.5V,`CAN_L`为1.5V时为显性,逻辑为0,电压差为2V。

图4

注:
1)CAN标准有两个,即IOS11898和IOS11519,两者差分电平特性不同。这里讲的是IOS11898
2)不同类型CAN总线相应的CAN_H和CAN_L值也不尽相同。
3)当外界输入噪声时,CAN_H和CAN_L会产生相同的波动,CAN_diff值不受影响
4)来源https://zhuanlan.zhihu.com/p/615139366
  • 报文类型
      CAN总线包括以下五种报文类型,其中错误帧、过载帧、帧间隔都是硬件自动完成的,无法由软件实现控制。对于使用者而言,只需要掌握数据帧和遥控帧,如图
    图5
    数据帧遥控帧又分为标准格式扩展格式
    标准格式有11位标识符,而扩展格式有29位标识符

  • 报文结构
    遥控帧结构如下:
    图6数据帧结构如下:
    图7
    可以看出数据帧遥控帧最明显的区别就是有没有数据段。

3 帧结构各段详解


图8

什么时候认定总线空闲?

  • 1、当连续监测到11个隐形位时认定总线空闲(bus idle),即
	1(DEL)+ 7(帧结束)+ 3(ITM)

在这里插入图片描述

  • 2、SOF只有为显性电平时会启动一个新的帧,监测到0就是没有发送新的帧,即总线空闲。

何谓仲裁段?

  • 1、仲裁段里含有CAN通信中一项非常重要的信息(ID)​,你可以把它当成是每一个报文的名字,每个CAN device可以发送多条不同的ID报文。每一个总线节点的CAN控制器中都有一个东西叫过滤器​,通过设置相关寄存器能够配置它,一旦设置好,CAN控制器会根据你的设置,自动去判断要不要接收报文,这部分完全由硬件实现,这个判断要不要接收的过程,也叫过滤,判断的依据就是每个报文的ID。
  • 2、扩展格式的ID具有比标准格式更多的位数,从而有更高的ID容量。
    在这里插入图片描述
  • 3、标准格式的标识符长度的是11位,紧随其后的是RTR位,用于表明此帧是数据帧还是远程帧​(逻辑0是远程帧,逻辑1为数据帧)。IDE位用于表明此帧是标准帧还是扩展帧​(逻辑0为标准帧,逻辑1为扩展帧)
  • 4、扩展格式的标识符长度的是29位,紧随其后的是RTR位,用于表明此帧是数据帧还是远程帧。IDE位用于表明此帧是标准帧还是扩展帧。

何谓控制段?

  • 控制段含有保留位(r0,r1)​和数据长度码(DLC)​
  • 保留位(r0、r1) 必须全部以显性电平(逻辑0)​发送。但接收方可以接收显性、隐性及其任意组合的电平​。
  • 数据长度码(DLC) 与数据的字节数的对应关系下表所示。数据的字节数必须为 0~8字节。但接收方对 DLC=9~15的情况并不视为错误。​

在这里插入图片描述

何谓数据段?

  • 数据段就是你需要发送的数据,可能包含字符0~8个字节数据,CAN控制器有对应的寄存器,只需要把数据直接填进去就可以了。

CAN总线仲裁方式

  CAN总线采用的是一种非破坏性总线仲裁方式

  • 在总线空闲时,刚开始发送的节点获得发送权,一旦开始发送,就不会被别的节点抢占
  • 如果多个节点在总线空闲时同时发送,各发送节点从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的节点可继续发送。(基于CAN总线线与规则)

4 如何在汽车上使用CAN总线

  为了访问汽车的 CAN 总线,需要先访问车载自诊断端口,也就是 OBD。虽然可能存在数以百计的其它诊断标准或者端口,但基本上现在所有汽车都使用的 OBD-Ⅱ,这也正是修车修理工用来识别汽车故障的途径,OBD 是最直接访问 CAN 的,找到 OBD-Ⅱ 的方法非常简单,它通常位于乘客座椅或者驾驶员座椅附近,且不用使用螺丝刀就能访问。

  这就是 OBD 的具体样子:
在这里插入图片描述

下面是 OBD 端口的引脚:

在这里插入图片描述

通过 OBD 访问 CAN 所需的硬件和软件:

  • 因为电脑不能直接与 CAN 连接,为了与 CAN 总线交互,需要类似 USB 转 CAN 的工具,通过 USB 连接到 OBD-II 端口,这样就可以发送或接收 CAN 数据包。同时在软件上需要一些能够读取或写入 CAN 数据包以及编码或解码 CAN 数据包的工具。只要有一点硬件和软件,绝对可以连接 CAN。

硬件:

  • 连接 OBD-II 所需的硬件可以很容易地在市场上找到,有昂贵以及廉价的硬件设备。高端设备包括 Kvaser 和 EMS,这些设备价格昂贵且矫枉过正,性价比很高的组合是 USB2CAN 和原生的 Linux 系统。

  • 另外,很多时候会遇到 ELM327,它是一个基于蓝牙的设备,但对于黑客来说是非常糟糕的,原因是它的数据速率比较慢,最后会丢失很多数据包。

  • Macchina M2 是一个开源的汽车接口,可以通过 OBD-II 与 CAN 总线通信。Macchina M2 最大的优点是它是模块化的,也就是说可以在 Macchina M2 的基础上增加 WiFi、GSM、LTE、BLE 模块。Macchina M2 有 2 个 CAN 通道。Macchina M2 还具有 LIN,可以通过访问链接获取更多信息:

	https://www.macchina.cc/catalog/m2-boards/m2-under-dash
  • 另一个低成本的选择是 CSS 电子公司的 CLX000,它可以记录和流式传输 CAN 数据,数据可以在免费的开源软件 Wireshark 中可视化,一个插件便可以实现逆向功能,CLX000 是可视化和远程信息处理的理想选择。
  • 可以通过访问链接:
https://www.csselectronics.com/screen/page/reverse-engineering-can-bus-messages-with-wireshark/language/en

在这里插入图片描述

5 所需软件的安装与使用

在软件方面,Linux 内核中内置了 SocketCAN、can-utils、vcan,它们的作用是发送和接收 CAN 数据包,对数据进行编码或解码,也可以通过 Wireshark 分析 CAN 数据包。

如果想了解更多关于 CAN 操作的知识,而又不想破坏自己的汽车,ICSim 将会是首选工具:

https://github.com/zombieCraig/ICSim

ICSim 安装及设置:

1 安装 SDL 库

  • SDL 是用于计算机图形和音频的跨平台开发库,由于 ISCim 使用 SDL 绘制虚拟汽车组合仪表板的动画,因此必须安装。这可以通过 apt-get 安装
sudo apt-get install libsdl2-dev libsdl2-image-dev -y

2 安装 CAN Utils

  • can-utils 是一套 Linux 特有的实用工具,它可以让 Linux 与车辆上的 CAN 网络进行通信,为了发送、接收和分析

  • CAN 数据包,需要安装 CAN utils。canutils 主要包括 5 个经常使用的工具:
    1、cansniffer 用于嗅探数据包
    2、cansend 发送一条数据
    3、candump 转储所有接收的数据包
    4、canplayer 重播 CAN 数据包
    5、cangen 随机生成 CAN 数据包

这可以通过 apt-get 安装:

sudo apt-get install can-utils -y

3 安装 ICSim

git clone https://github.com/zombieCraig/ICSim
cd ICSim
make

在这里插入图片描述

4 准备虚拟 CAN 网络

  • 进入 ICSim 目录,有一个名为 setup_vcan.sh 的 shell 脚本:

  • modprobe 命令是用来加载内核模块,比如 can 和 vcan 模块,最后两行将创建一个 vcan0
    接口以便模拟汽车网络,可以运行下面的命令来设置一个虚拟的 can 接口:

  • 执行setup_vcan.sh

./setup_vcan.sh

在这里插入图片描述

  • 要验证 vcan0 接口,如果配置 vcan0 将显示:

在这里插入图片描述

5 运行 ICSim

  • 运行 ICSim 至少需要两个组件,一个仪表盘和一个控制器,用来模拟加速、刹车、控制车门、转向灯等,需要至少 3
    个终端窗口或标签来运行仪表盘、控制器和 can-utils。

6 运行仪表盘

  • 为了运行仪表盘,需要运行一个名为 icsim 的文件,参数为 vcan0,也就是之前创建的接口。
./icsim vcan0

在这里插入图片描述

7 运行控制器

  • 此时,仪表盘仍无法正常工作,包括速度表、转向灯、刹车和车门。这是因为接口 vcn0 上没有流量,为了模拟接口 vcan0
    上的流量,这里需要启动控制器。
./controls vcan0

在这里插入图片描述
vcan0 是一个虚拟的 CAN 接口,ICSim 将通过它来发送和接收 CAN 帧,当启动控制面板时,可以观察到车速表有一些波动,这是因为控制面板模拟了噪声,启动控制面板后,便可以使用键盘来模拟流量。

动作按键
加速
左右转向←/→
解锁前左右车门Right-Shift + A/B
解锁后左右车门Right-Shift + X/Y
锁定全部车门Right-Shift + Left-Shift
解锁全部车门Left-Shift + Right-Shift

8 监测发送CAN总线数据

  • 再打开一个端口,使用can-utils 提供的 cansniffer 工具来嗅探数据包
  • 输入:
cansniffer -c vcan0

在这里插入图片描述

6 CAN 总线操作

前几章已经实现了控制仪表盘和读取CAN总线通讯数据,下面讲继续学习通讯数据内容。

理解CAN报文

在这里插入图片描述
这是 CAN 报文通过 can-utils 采集后的具体样子,如果把这几列细分的话,第一列是接口,第二列是仲裁 ID,第三列是 CAN 报文的大小,这个不能超过 8 个字节,如果看一下 CAN 帧,就更明白为什么这个不能超过 8 个字节,第四列是 CAN 数据本身。

在这里插入图片描述
在这个例子中,这是一个 8 字节的帧,该消息是由一个仲裁 ID 0x111 发送的,仪表盘看到这个报文后,首先会确定这个报文是否是为仪表盘准备的,如果是那么它就会读取这个报文,这个报文的数据是 0x0BB8,即十进制的 3000,现在仪表盘会将转速表的指针移到 3000
(此处有些疑问,为什么只用高位的0BB8?是否因为控制段为0x02?查一下CAN总线位序和字节序)

注:
CAN总线中位序和字节序都有大端和小端,共有四种:
msb: most significant bit
lsb: least significant bit
MSB: Most Significant Byte
LSB: Least Significant Byte

另

在这里插入图片描述

详解can-utils前配置接口

在进入 ICSim 的演示之前,需要先看看 can-utils 提供的其它工具是如何工作的,要做到这一点首先需要设置虚拟 can 接口,下面的内容主要是讲解 setup_vcan.sh 文件内的命令具体是什么含义,在实际操作中可以直接运行 setup_vcan.sh 文件。
在这里插入图片描述

  • 设置虚拟 CAN 接口

加载 CAN 的内核模块以及虚拟 CAN 的内核模块:

sudo modprobe can
sudo modprobe vcan

验证是否加载了所需的内核模块:

lsmod | grep can

这将显示 can 和 vcan 的内核模块是否被加载:

在这里插入图片描述

接下来设置虚拟接口:

sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

可以通过下面方法来验证虚拟 CAN 接口是否设置成功:

ifconfig vcan0

在这里插入图片描述

生成CAN帧工具cangen

虚拟 CAN 接口设置成功后就可以在这个接口中发送或接收 CAN 数据包了,接下来使用 can-utils 中的一个叫做 cangen 的工具来生成虚拟的 CAN 数据包。

在这里插入图片描述
cangen 可以生成用于测试的 CAN 帧,要使用 cangen 需要指定要生成 CAN 帧的接口,比如vcan0。

cangen vcan0

查看CAN 帧工具candump

查看CAN帧可以选择使用 can-utils 提供的工具,比如 cansniffer 和 candump,它们的功能和 Wireshark 差不多。

  • candump

在这里插入图片描述
可以使用 candump 转储或记录 CAN 帧:

candump vcan0

此时candump 会将 CAN 帧输出显示:

在这里插入图片描述
左边是使用cangen生成CAN数据,右边是使用candump工具查看cangen生成的CAN数据。

candump 还可以转储 CAN 帧,如果想进行重放攻击,需要先转储 CAN 帧,然后使用 canplayer 对转储的 CAN 帧进行重放,CAN 帧的转储可以使用 -l 参数启动:

candump -l vcan0

使用 candump 转储 CAN 帧时,会创建一个以 candump 为前缀和日期命令的文件,如果想查看转储文件的内容,可以在 Linux 中使用 cat 命令查看:

在这里插入图片描述

重放CAN帧工具canplayer

在这里插入图片描述
顾名思义,canplayer 是用来重放 CAN 帧的工具。理想情况下,当必须进行重放攻击时,首先需要转储或记录 CAN 帧,然后使用 canplayer 对 CAN 帧进行重放。

想象一个场景,希望对转速表进行欺骗,但是却不知道转速表的读数在哪个仲裁 ID 上工作,这种情况需要先用 candump 的 -l (此处为小写的L)参数转储 CAN 帧数,然后用 canplayer 重放转储的 CAN 帧,使用 canplayer 重放 CAN 帧时需要通过 -I (此处为大写的i)参数来接受输入文件:

canplayer -I canfile.log

在这里插入图片描述

使用canplayer将刚刚转储的candump文件进行重放,发现它将每一帧都插进vcan0里。

canplayer还有其他好用的功能,可以通过以下指令获取:

man canplayer

在这里插入图片描述

嗅探CAN帧工具cansniffer

cansniffer 是用于嗅探 CAN 数据包的工具。首先看手册:
在这里插入图片描述
cansniffer 的 -c 参数可以通过颜色高亮突出变化的字节,当需要判断执行某些操作是否会导致 CAN 数据变化时使用。

在这里插入图片描述
cansniffer 可以通过仲裁 ID 进行过滤,当需要只显示某一个特定仲裁 ID 的帧时,只需在嗅探的过程中,按减号(-)然后输入 000000,再按 Enter 键清除所有的帧,按加号(+)然后输入仲裁 ID,再按 Enter 键便只显示特定仲裁 ID 的帧。

发送CAN帧工具cansend

cansend interface frame

以上就是CAN总线操作的所有工具。

7 ICSim

前面已经介绍了如何安装和设置 ICSim,这里直接启动仪表盘和控制器:

./icsim vcan0
./controls vcan0

在这里插入图片描述

1 使用cansniffer嗅探CAN帧

在新的终端中输入:

cansniffer -c vcan0

在这里插入图片描述
可以看到 CAN 帧的变化非常快,很难跟上通信发生的速度,在真实的汽车中,这种通信会发生得更快,为了跟上它的速度,可以使用仲裁 ID 过滤。如果只想查看仲裁 ID 为 40C 的帧,可以按减号(-)然后输入 000000,再按 Enter 键清除所有的帧,按加号(+)然后输入 40C,再按 Enter 键便只显示仲裁 ID 为 40C 的帧。

在这里插入图片描述

2 重放攻击

在进行重放攻击前需要打开 ICSim,这个时候会在 cansnifer 工具中看到 CAN 帧的变化,在使用命令

candump -l vcan0

转储 CAN 帧的同时在控制器对仪表盘进行操作,例如:加速、转向,然后停止转储,将会看到创建了一个 candump-XXXXX.log 命名的文件,接下来使用

canplayer -I candump-XXXXX.log

对转储的 CAN 帧进行重放,将会在仪表盘中看到转储时进行的操作。

在这里插入图片描述

3 转储 CAN 帧分析

在真实的汽车中,CAN 总线的噪音可能会大很多,且 CAN 帧出现速度也会快很多,所以如何识别出关键的仲裁 ID 是一个难题,这里列出两种方法:二分法和统计法,推荐使用统计法。

二分法
将转储的 CAN 帧文件一分为二,然后分别重放观察哪一个文件包含了关键的仲裁 ID,然后对相应的文件再进行操作,依次循环。

统计法
以仲裁 ID 或仲裁 ID 和 CAN 数据为依据,统计出 CAN 帧文件各仲裁 ID 或仲裁 ID 和 CAN 数据出现的次数,根据出现的此处进行判断。

4 SavvyCAN工具

款图形界面的工具,SavvyCAN 提供了更多额外的功能,它除了能够轻轻的浏览、过滤数据包和仲裁 ID,还可以在 CAN 帧上执行脚本、Fuzzing,以及内置了几个逆向工具。
https://www.savvycan.com/
在这里插入图片描述
总结一下这个SavvyCan工具具有图形化界面,可以进行嗅探CAN帧,也可以更加方便的进行重放攻击、识别CAN仲裁ID,也可以对CAN端口发送自定义帧。

笔记来源:
1、https://zhuanlan.zhihu.com/p/615139366
2、https://cloud.tencent.com/developer/article/1662635
3、https://github.com/t0night/t0night/blob/

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aprilaaaaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值