车CAN总线协议学习

# PREFACE:

# 基本概念:

CAN(Controller Area Network)总线协议是由 BOSCH 发明的一种基于消息广播模式的串行通信总线,它起初用于实现汽车内 ECU 之间可靠的通信,后因其简单实用可靠等特点,而广泛应用于工业自动化、船舶、医疗等其它领域。

ECU(Electronic Control Unit)电子控制器单元,它们的用途就是控制汽车的行驶状态以及实现其各种功能。主要是利用各种传感器、总线的数据采集与交换,来判断车辆状态以及司机的意图并通过执行器来操控汽车。

简而言之 CAN 总线是用于各个 ECU 之间互相通信的网络以及协议

Untitled

# CAN 协议标准

底层协议:

CAN 总线协议大的分类包含底层的标准协议和上层协议两种;其中以 ISO 11898-1;ISO 11898-2 和 ISO11898-3 这三种协议为主,下面介绍这三种协议的主要作用和应用方向。

ISO 11898-1: 2015 定义 CAN 总线的数据链路层(DLL)和电气信号标准,描述 CAN 总线的基本架构,定义不同 CAN 总线设备在数据链路层通信方式,详细说明逻辑链接控制(LLC)和介质访问控制(MAC)子层部分;

ISO 11898-2: 2003 定义高速 CAN 总线(HS-CAN)物理层标准,最高数据传输速率 1Mbps ,应用为两线平衡式信号(CAN_H, CAN_L),HS CAN 是汽车动力和工业控制网络中应用最为广泛的物理层协议;

ISO 11898-3: 2006 定义低速 CAN 总线(LS-CAN, Fault-Tolerant CAN)物理层标准,数据传输速率在 40Kbps ~ 125Kbps 。Fault-Tolerant 是指总线上一根传输信号失效时,依靠另外的单根信号也可以通信,LS CAN 主要应用于汽车车身电控单元之间通信;

Untitled

![Untitled (1)](车 CAN 总线协议学习 / Untitled (1).png)

上层协议:

![Untitled (2)](车 CAN 总线协议学习 / Untitled (2).png)

CAN 总线特性 CAN 总线具有多种特点其中包括:多主的工作方式;每条协议具有不同的优先级;采用非破坏性总线仲裁技术;CAN 可以通过报文实现点对点、一点对多点以及全局广播方式传送数据;节点数取决于总线驱动电路;采用短帧结构(8/16 字节),传输时间短,鲁棒性强,抗干扰;CRC 帧校验,数据出错率低。

这其中最重要的特点是多主的工作方式,一般操作系统都有一个大脑,对整个操作系统的环境进行管理,但是 CAN 总线的是多主的工作方式,各个 ECU 只负责往总线上收发它们的协议帧即可,所以当多个 ECU 同时收发消息时,就会导致冲突,这就又和它第二三个特点相关了。仲裁的特点是基于协议的优先级进行仲裁的,主要是为了给 CAN 总线上的协议进行优先级排序,决定发生冲突的时候哪个协议先占用 CAN 总线进行通讯。同时 CAN 协议的一些特点比如短帧结构,鲁棒性强,抗干扰等等能力也让 CAN 总线具有了在汽车上适用的条件。

CAN 总线的布局 之前汽车的各个 ECU 之间是通过点对点连接的,但是随着现代汽车内的 ECU 单元愈发增多,CAN 总线连接的方式可以显著降低汽车内部布线的复杂程度。

CAN 总线结构特征

CAN 总线定义四种帧类型,分别为数据帧、远程帧、错误帧和过载帧。各种帧的用途分别为:

![Untitled (3)](车 CAN 总线协议学习 / Untitled (3).png)

# 攻击面分析

访问车载诊断 II(OBD-II)操纵 CAN 来控制各种模块,达到的效果是可以控制制动以及发动机模块。另外还可以产生虚假的仪表盘数据,改变发动机参数

![Untitled (4)](车 CAN 总线协议学习 / Untitled (4).png)

第一阶段是入侵负责无线接口的 ECU。第二阶段是注入报文,与安全关键的 ECU 进行通信。最后一个阶段是修改 ECU,使 ECU 表现出恶意行为。

另外,通过 OTA 软件进行攻击也是一种方法。OTA 软件是一种低成本、可扩展、可远程更新的软件解决方案。

ICSim 模拟器

# 安装依赖
sudo apt-get install libsdl2-dev libsdl2-image-dev can-utils  
# 下载 ICSim
git clone <https://github.com/zombieCraig/ICSim.git>
# 编译
cd ICSim
sudo make

安装 can-utils

sudo apt-get install can-utils -y

setip_vcan.sh:

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

sudo modprobe can sudo modprobe vcan

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

lsmod | grep can

接下来设置虚拟接口:

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

可以通过下面方法来验证虚拟 CAN 接口:

ifconfig vcan0

运行 ICSim 模拟器(注意:wsl 没有内核模式所以不支持):

./setup_vcan.sh
./controls vcan0
./icsim vcan0

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

cangen vcan0

使用 candump 查看包:

candump vcan0

存入 log:

candump -l vcan0

重放报文(可以测试发现仪表盘复现了前面的操作,但没那么稳定):

canplayer -I xxx.log -v

cansniffer 是用于嗅探 CAN 数据包的工具。cansniffer 的 -c 参数可以通过颜色高亮突出变化的字节,当需要判断执行某些操作是否会导致 CAN 数据变化时使用。

cansniffer -c vcan0

cansend 是用于将 CAN 帧发送到特定 CAN 接口的工具:

cansend interface frame

参考:山石岩读丨前沿领域探析 —— 汽车 CAN 总线协议详解及攻击面分析_商用车 can 协议与乘用车 can 的区别 - CSDN 博客

CAN 总线安全之 ICSim 模拟器 - 腾讯云开发者社区 - 腾讯云 (tencent.com)

这几篇还没看:

https://yogeshojha.com/me/car-hacking-101-practical-guide-to-exploiting-can-bus-using-instrument-cluster-simulator-part-i-setting-up/

https://yogeshojha.com/me/car-hacking-101-practical-guide-to-exploiting-can-bus-using-instrument-cluster-simulator-part-ii-exploitation/

https://yogeshojha.com/me/car-hacking-101-practical-guide-to-exploiting-can-bus-using-instrument-cluster-simulator - part-iii-savvycan-fuzzing-can-frame-and-playing-around-with-can-frames/