网联车CAN协议分析之流量监听与重放研究

admin 2025年4月27日13:56:29评论0 views字数 3007阅读10分1秒阅读模式

本篇文章将主要为大家介绍车联网中重要的组成部分之一的CAN总线的协议结构,以及在没有硬件支撑的情况下如何对其进行仿真状态下的流量嗅探与重放方法的学习与研究。

01
CAN
CAN是控制器局域网络(Controller Area Network, CAN)的简称,是 ISO 国际标准化的串行通信协议。简单的来说,CAN总线就是一种传输数据的线,主要用于在不同的ECU之间传输数据。
信号表示
而CAN总线由CAN_H 和 CAN_L 两根线组成,它应用在有很多的信息共享与高可靠性的环境中。这使得汽车制造商选择 CAN 而不是使用复杂的直接信号线连接到车辆网络中的每个ECU。
其次在CAN总线中,由CAN_H和CAN_L两根线上的电位差来表示CAN信号,而电位差分为显性电平和隐性电平两种逻辑状态:
1. 显性电平为逻辑0
2. 隐性电平为逻辑1。
在ISO11898标准(125kbps ~ 1Mbps)中CAN信号的表示为下图所示:
网联车CAN协议分析之流量监听与重放研究
输过程
发送过程:
CAN控制器将CPU传来的信号转换为逻辑电平(即逻辑0-显性电平或者逻辑1-隐性电平)。CAN发射器接收逻辑电平之后,再将其转换为差分电平输出到CAN总线上。
接收过程:
CAN接收器将CAN_H 和 CAN_L 线上传来的差分电平转换为逻辑电平输出到CAN控制器,CAN控制器再把该逻辑电平转化为相应的信号发送到CPU上。
帧结构
CAN通信的报文传输过程中有:数据帧、远程帧、错误帧、过载帧和帧间隔五种帧类型。
网联车CAN协议分析之流量监听与重放研究

而其中标准的数据帧格式主要为四个部分,即:

网联车CAN协议分析之流量监听与重放研究
网联车CAN协议分析之流量监听与重放研究

1. 起始帧(Start of Frame-SOF):1bit,显性信号,表示数据帧的开始

2. 仲裁段(Arbitration     Field):包括两部分:标识符位(Identifier field-ID)和远程发送请求位

3. 控制段(Control     Field):6bits,拓展标识位(1bit),保留位(1bit),数据长度编码位(4bit)

4. 数据段(Data     Field):发送数据的内容,最多8个字节

5. 循环校验位(CRC     Field):循环校验序列和界定符

6. 确认段(ACK     Field):确认位和界定符

7. 帧结束(End of     Fram):7bit,隐性信号,表示帧结束

02
CAN流量监听与重放
ICSim 汽车仪表盘仿真

首先需要使用ICSim工具来模拟汽车仪表盘的使用。

> sudo apt-get install libsdl2-dev libsdl2-image-dev can-utils  
> sudo apt-get install aptitude 
> git clone https://github.com/zombieCraig/ICSim.git
> cd ICSim
> make
> ./setup_vcan.sh 
> ./icsim vcan0    #启动仪表盘模拟器
> ./controls vcan0  #启动控制器
网联车CAN协议分析之流量监听与重放研究

操作方法如下:

网联车CAN协议分析之流量监听与重放研究
can-utils 

> 项目地址:https://github.com/linux-can/can-utils

通过 can-utils工具进行对can流量的监听与重放,可以使用源码安装或直接使用apt-get进行安装。

candump 

显示、过滤和记录CAN原始数据到文件(未解码的数据)。

通过candump对指定网络接口进行流量的监听,将会保存日志文件到当前目录中,在通过ctrl+c停止后可进行查看相应的流量数据。

保存的格式为:(时间戳) 网络接口 ID#数据

> candump -l vcan0
> cat candump-2022-12-28_105004.log|more
网联车CAN协议分析之流量监听与重放研究
cansniffer

根据仲裁ID进行分组显示数据,其次可以通过交互进行内容过滤。

> cansniffer -c vcan0
网联车CAN协议分析之流量监听与重放研究

输入-000000关闭所有数据包的显示,再输入+ID显示指定ID的数据包,如:

-000000
+234
[return]
canplayer

canplayer可以用来播放can帧,用于重放candump记录的流量内容。

> canplayer -I <*.log>
cansend

cansend用于将CAN帧发送到一个特定的CAN接口。

> cansend  vcan0 <ID>#<DATA>
SavvyCAN

> 项目地址:https://github.com/collin80/SavvyCAN

SavvyCAN是一个基于多个QT平台的C++程序,主要用于CAN数据的逆向分析和捕获。作为同样是免费的开源工具来说,相对于前面的can-utils 命令行的操作方式,SavvyCAN提供了更适合初学者使用的GUI图形化界面,可以用于更轻松的浏览、过滤ID数据包等。

直接下载编译好的appimage,便可以直接运行程序。

> wget https://github.com/collin80/SavvyCAN/releases/download/V208/SavvyCAN-x86_64.AppImage
> chmod 755 SavvyCAN-305dafd-x86_64.AppImage
> ./SavvyCAN-305dafd-x86_64.AppImage

但是由于QTSerialBus默认被禁用导致无法与ICSim配合使用,因此需要下载QT5环境手动编译安装SavvyCAN。

> wget https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-linux-x64-5.14.2.run
> chmod a+x ./qt-opensource-linux-x64-5.14.2.run
> ./qt-opensource-linux-x64-5.14.2.run

随后注册账户进行登录,并勾选上qt5进行安装。

网联车CAN协议分析之流量监听与重放研究

在对SavvyCAN工具进行编译。

> sudo apt install qtdeclarative5-dev qttools5-dev g++  
> git clone https://github.com/collin80/SavvyCAN  
> cd SavvyCAN/
> ~/Qt5.14.2/5.14.2/gcc_64/bin/qmake CONFIG+=debug 
> make     
> ./SavvyCAN

流量监听

Connection->Open Connection Window->Add New Device Connection 中选择 QT SerialBus Devices,将 SerialBus Devices 选择为 socketcan,将 Port 选择为虚拟端口 vcan0

网联车CAN协议分析之流量监听与重放研究

随后就可以在Savvy CAN中看到捕捉到的数据。

网联车CAN协议分析之流量监听与重放研究

流量重放

在Savvy CAN中的 Send Frames 里选择 Playback,便可以从文件加载数据或直接从捕获的数据加载数据等功能。

网联车CAN协议分析之流量监听与重放研究

对于CAN协议上的流量监听与重放的方法本篇以can-utils与SavvyCAN两种较为常用的工具为例进行讲解,到这里就算是结束了,实际上对于CAN协议进行流量嗅探的方法远不止于此,还可以使用如wireshark、Kayak等工具方便我们研究,在后续的文章中将会进行更深入的分析学习。

原文始发于微信公众号(SAINTSEC):网联车CAN协议分析之流量监听与重放研究

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月27日13:56:29
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   网联车CAN协议分析之流量监听与重放研究http://cn-sec.com/archives/4006078.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息