1. CAN总线
1.1 简介
CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。
1.2 特征
汽车各个电子单元相互通信、共享数据
允许多个ECU公用一根导线进行通信
嘈杂、拥挤、慢速版的以太局域网
流量是UDP而不是TCP
1.3 数据报文
CAN帧有3个主要部分:
仲裁标识符
数据长度代码
数据领域
帧起始(Start of Frame-SOF):1bit,显性信号,表示数据帧的开始
仲裁段(Arbitration Field):包括两部分:标识符位(Identifier field-ID)和远程发送请求位
标识符位,功能性的地址,通过标识符来过滤数据。标准格式的数据帧的标识符(CAN-ID)长度为11位(11 bits),ID10ID0,ID10为最高权重位(MSB),ID0为最低权重位(LSB),按照ID10ID0的顺序进行传输。CAN协议还规定:前7位最高权重位(ID10~ID4)不能都为“隐性”信号。
远程发送请求位,1bit。区分数据帧还是远程帧。
控制段(Control Field):6bits,拓展标识位(1bit),保留位(1bit),数据长度编码位(4bit)
数据段(Data Field):发送数据的内容,最多8个字节
循环校验位(CRC Field):循环校验序列和界定符
循环校验序列,15bit,用于校验传输正确
界定符,1bit,隐形信号,表示循环校验序列结束
确认段(ACK Field):确认位和界定符
确认位:1bit,节点收到正确的CRC序列,发送端的ACK位被置位
界定符,1bit,隐形信号
帧结束(End of Fram-EOF):7bit,隐性信号,表示帧结束
2. 仪表模拟器
项目地址:https://github.com/zombieCraig/ICSim
2.1 安装
依赖
$ sudo apt-get install libsdl2-dev libsdl2-image-dev can-utils
添加虚拟网卡
$ sudo modprobe can
$ sudo modprobe vcan
$ sudo ip link add dev vcan0 type vcan
$ sudo ip link set up vcan0
2.2 运行
汽车仪表盘
$ ./icssim vcan0
控制器
$ ./controls vcan0
2.3 操作仪表盘
操作 | 按键 |
---|---|
加速 | ↑ |
左右转向 | ←/→ |
解锁前左右车门 | Right-Shift + A/B |
解锁后左右车门 | Right-Shift + X/Y |
锁定全部车门 | Right-Shift + Left-Shift |
解锁全部车门 | Left-Shift + Right-Shift |
3. CAN总线数据获取
3.1 CAN报文分析
第一列:接口
第二列:仲裁ID
第三列:数据大小
第四列:数据本身
3.2 CAN-Utils工具
3.2.1 candump
转储或记录帧
输出显示
$ candump vcan0
CAN帧转储
$ candump -l vcan0
3.2.2 canplayer
重放CAN帧
$ canplayer -l candump*.log
3.2.3 cansniffer
嗅探CAN数据包工具
$ cansniffer -c vcan0
3.2.4 cansend
将 CAN 帧发送到特定 CAN 接口的工具
$ cansend vcan0 039#000C
4. 挑战
目标控制车辆加速、转向灯、开关门、仪表盘指针
4.1 控制左右转向灯
查找关键仲裁ID
通过嗅探的方式查找变化数据
左转灯:01 00 00 00
右转灯:02 00 00 00
双闪:03 00 00 00
测试
$ cansend vcan0 188#01000000
$ cansend vcan0 188#02000000
$ cansend vcan0 188#03000000
4.2 控制开关门
查找关键仲裁ID
通过嗅探的方式查找变化数据
解锁左前门:00 00 0E 00 00 00
解锁右前门:00 00 0D 00 00 00
解锁后左门:00 00 0B 00 00 00
解锁后右门:00 00 07 00 00 00
解锁全部车门:00 00 00 00 00 00
锁定全部车门:00 00 0F 00 00 00
测试
$ cansend vcan0 19B#00000E000000
$ cansend vcan0 19B#00000D000000
$ cansend vcan0 19B#00000B000000
$ cansend vcan0 19B#000007000000
$ cansend vcan0 19B#000000000000
$ cansend vcan0 19B#00000F000000
4.3 油门控制
查找关键仲裁ID
通过嗅探的方式查找变化数据
加速
测试
$ cansend vcan0 244#0000003800
$ cansend vcan0 244#000000B000
总结
对车联网安全感兴趣,但却没有实车拿来练手,此篇对想入门车联网安全的小伙伴,起到入门的作用。