车CAN总线协议学习
type
status
date
slug
tags
summary
category
icon
password
基本概念:
CAN(Controller Area Network)总线协议是由 BOSCH 发明的一种基于消息广播模式的串行通信总线,它起初用于实现汽车内ECU之间可靠的通信,后因其简单实用可靠等特点,而广泛应用于工业自动化、船舶、医疗等其它领域。
ECU(Electronic Control Unit)电子控制器单元,它们的用途就是控制汽车的行驶状态以及实现其各种功能。主要是利用各种传感器、总线的数据采集与交换,来判断车辆状态以及司机的意图并通过执行器来操控汽车。
简而言之CAN总线是用于各个ECU之间互相通信的网络以及协议。
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主要应用于汽车车身电控单元之间通信;
上层协议:
CAN总线特性 CAN总线具有多种特点其中包括:多主的工作方式;每条协议具有不同的优先级;采用非破坏性总线仲裁技术;CAN可以通过报文实现点对点、一点对多点以及全局广播方式传送数据;节点数取决于总线驱动电路;采用短帧结构(8/16字节),传输时间短,鲁棒性强,抗干扰;CRC帧校验,数据出错率低。
这其中最重要的特点是多主的工作方式,一般操作系统都有一个大脑,对整个操作系统的环境进行管理,但是CAN总线的是多主的工作方式,各个ECU只负责往总线上收发它们的协议帧即可,所以当多个ECU同时收发消息时,就会导致冲突,这就又和它第二三个特点相关了。仲裁的特点是基于协议的优先级进行仲裁的,主要是为了给CAN总线上的协议进行优先级排序,决定发生冲突的时候哪个协议先占用CAN总线进行通讯。同时CAN协议的一些特点比如短帧结构,鲁棒性强,抗干扰等等能力也让CAN总线具有了在汽车上适用的条件。
CAN总线的布局 之前汽车的各个ECU之间是通过点对点连接的,但是随着现代汽车内的ECU单元愈发增多,CAN总线连接的方式可以显著降低汽车内部布线的复杂程度。
CAN总线结构特征
CAN总线定义四种帧类型,分别为数据帧、远程帧、错误帧和过载帧。各种帧的用途分别为:
攻击面分析
访问车载诊断II(OBD-II)操纵CAN来控制各种模块,达到的效果是可以控制制动以及发动机模块。另外还可以产生虚假的仪表盘数据,改变发动机参数
第一阶段是入侵负责无线接口的ECU。第二阶段是注入报文,与安全关键的ECU进行通信。最后一个阶段是修改ECU,使ECU表现出恶意行为。
另外,通过OTA软件进行攻击也是一种方法。OTA软件是一种低成本、可扩展、可远程更新的软件解决方案。
ICSim模拟器
安装can-utils
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没有内核模式所以不支持):
虚拟 CAN 接口设置成功后就可以在这个接口中发送或接收 CAN 数据包,使用 can-utils 中的 cangen 的工具来生成虚拟的 CAN 数据包。
使用candump查看包:
存入log:
重放报文(可以测试发现仪表盘复现了前面的操作,但没那么稳定):
cansniffer 是用于嗅探 CAN 数据包的工具。cansniffer 的 -c 参数可以通过颜色高亮突出变化的字节,当需要判断执行某些操作是否会导致 CAN 数据变化时使用。
cansend 是用于将 CAN 帧发送到特定 CAN 接口的工具:
todo:
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/
上一篇
web-shell总结
下一篇
车UDS诊断协议学习
Loading...