CAN 总线逆向工程
1、定位 CAN 总线
在反转 CAN 总线之前,我们需要先找到 CAN 总线的位置。如果可以访问 OBD-II 连接器,车辆的连接器引脚图应该会显示 CAN 总线的位置。
寻找成对且绞合的电线。CAN 总线通常是两根电线绞合一起。
用万用表检查基准电压是否为 2.5V。
用万用表检查电阻。CAN 总线在两端都用 120 Ω 的终端电阻,因此 CAN 总线两根双绞线之间的电阻应该为 60 Ω。
使用双通道示波器,将两条疑似故障的 CAN 总线之间的信号差相减。差分信号会相互抵消,因此应该得到一个恒定信号。
如果汽车熄火,CAN 总线通常处于静默状态,但像插入车钥匙或拉起车门把手这样简单的操作通常会唤醒车辆并产生信号。
2、使用 can-utils 和 Wireshark 反向解析 CAN 总线通信
我们需确定总线上运行的通信类型。需要识别特定的信号或特定的组件的通信方式。
例如汽车如何解锁或动力传动系统如何工作。为此我们需要找到组件使用的总线,然后对该总线上传输的数据包进行逆向工程,来确定用途。
使用 can-utils 套件和 Wireshark 来捕获和过滤数据包。
candump -b vcan0 slcan0。
我们能看到如下图数据未解码,仅显示原始十六进制字节。这是因为 Wireshark 的解码器仅处理基本的 CAN 头部,无法处理 ISO-TP 或 UDS 数据包。

3、使用 candump
candump 不会自动解码数据。

各列分别显示嗅探设备、仲裁 ID、CAN 数据包大小、CAN 数据字段。
4、对 CAN 总线的数据分流
CAN 网络上的设备会发出噪声,通常会按照固定间隔或由事件触发脉冲信号。
使用罐嗅探器对数据包进行分组。
cansniffer 命令行对工具按仲裁 ID 对数据包进行分组。

可以添加 -c 标志对任何变化的字节进行着色。
cansniffer -c slcan0
CAN 嗅探器工具还可以删除没变化的重复 CAN 包。
cansniffer 优点是我们可以向其发送键盘输入来过滤终端显示的结果。例如仅看数据包中 ID 为 301 和 308,可输入

输入 -000000 会关闭所有数据包,输入 +301 和 +308 会过滤掉 ID 301 和 308 之外的所有数据包。
-000000 命令使用位掩码,将掩码与仲裁 ID 进行垃圾比较,掩码中任何二进制值 1 都表示该位必须为真,而二进制值 0 则是一个通配符,可以匹配任何值。
全为 0 则 cansniffer 匹配所有仲裁 ID。掩码前的 - 号会移除所有的匹配的位,也就是每个数据包。
还可以用过滤器和位掩码获取 ID,如将 ID 500 到 5FF 添加显示中,其中 500 是应用位掩码 700 定义的 ID,从而定义我们的范围。

或者用图形化界面,Kayak。
5、录制和重放

如图是 Kayak 的嗅探器。
首先单击日志文件选项中的播放按钮,然后将一个或多个总线从项目窗格拖到日志输出窗口选项卡的总线字段。按日志输出窗口底部的记录和停止按钮开始或停止记录。
如果打开 Kayak 日志文件,可以看到类似于下图的代码片段。


日志文件选项卡设置的右侧窗格。
日志格式于 can-utils 包捕获的日志基本相同:时间戳、总线号、仲裁 ID。数据间用 # 隔开。

5-3 中的 candump 日志文件与 Kayak 在图 5-4 中文件几乎相同。
使用 Kayak 查找门锁控制按钮
1、按下录制键
2、执行实际动作,例如开门
3、停下录制
4、按下播放键
5、观察结果,门锁是否打开
如果没解锁可能存在以下几个问题。
错过了录制中的操作,重新录制并播放。
无法录制和回放,则信息可能与物理锁定按钮直接绑定,这种情况在驾驶员侧车门锁中很常见。
尝试录制同时解锁乘客侧车门。如果无效,则解锁操作的信息可能位于正在监控的 CAN 总线之外的其他线上,或回放操作导致冲突覆盖了数据包。
一旦获取了能执行操作的录音,使用图 5-6 方法过滤噪声,并找到通过 CAN 总线解锁门的确切数据包和位。
现在将数据包捕获的大小减半,直到剩下一个数据包。
此时可以找到解锁车门的位或字节。最快方法是打开嗅探器,并筛选之前找到的仲裁 ID。
解锁车门后,发生变化的位或字节会高亮。

这一段我简而言之的总结一下,首先就是我们捕获数据,接下来就进行验证,重放去看车辆是否执行命令,执行了那我们就用二分法过滤,直到最后一条数据包。然后观察开锁的一瞬间高亮的数据包。
使用 can-utils 查找门锁控制
可以用 candump 记录,用 canplayer 重放。最后用 cansend 发包。
ICSim 模拟
sudo modprobe can
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

然后我们启动就能得到这两个图。

以下是操作手册。

接下来就是捕获 CAN 流量了。
candump -l vcan0
这里就是进行捕获 can 流量,会以日志文件保存下来。
cansniffer 能够动态显示我们的 can 报文变化状态,对于 can 报文的逆向起到很大帮助。我们看图片。

这是我们捕获的流量。

按统计频率查找操作
在此之前我们要确定相对应操作的数据,因此我们这里先进行左转向和右转向.

我们进行一次左转向,然后记录下数据,现在需要用到脚本去分类数据包.

我们尝试分类后发现了非常多的报文,我们先测试出现次数较少的报文.

我们依次发包尝试是否触发转向.

我们这里 5A1 都失败了,接下来尝试 188.

在这里我们清晰看到只有一个数据包是出现过一次的,尝试一下.
尝试发送后左转向亮起,能确定左转的帧 ID 为 188#01000000.
那我们可以以此进行遍历,去更改 1 字段,改为 2 来尝试是否右转.

最终确定右转 ID 字段为 2.
那我们在接下来就可以尝试开关门字段,还是同理,我们监听同时,进行车门开关的操作,从而寻找相应的数据包.

我们关注到 19B 这个 ID,查看一下.

该 ID 为开主驾驶车门.

关闭所有车门.

开启所以车门.
二分法
这里参考文章所提到,加减速很难通过数量去分析,这里选择二分法分析.
首页我们依旧监听 vcan0.

canplayer -I candump-2026-04-01_170603.log -l i -v
我们录制完重放观察是否加速.然后我们观察到了前一半部分是有加速的,因此我们留下前面这部分.

目前该文件是有12630条数据,我们取前一半.

取前后两部分继续重放观察现象.
我们在part1中的前半段又发现了出现加速的变化,我们再切.
这里我切了很多次,这种方法呢,不是特别好用,尤其是只出现了几次的报文,说实话太折磨了,我看不清这个转速表变化,因为他待机状态也是一直在跳动,更好的方法还是统计频率好一点.
这里用网上的文章来介绍吧.

网上某篇文章切分到50条数据中,然后依次测试,我这里就不测试了,这个转速表一直在上下跳动,而且按了一下油门,他变化也特别的不明显.

最后发现油门帧是这个.

不知道大家能不能看到,这个转速特别抽象,他只会停零点几秒,就连截图也要找时机.
SavvyCAN
这是一个 CAN 总线分析工具,用于捕获、分析和记录 CAN 总线数据,图形化的。

别人总结的特征,主要记住就是监控 CAN 总线数据、支持多系统、图形化即可。

就是这么个东西,我们看看使用效果。

这就集成的 sniffer ,绿色是变化的,红色不变。
这东西也能重放 CAN 报文。
这里介绍几个个人感觉比较有用的功能,Retool 吧。

这个应该是根据颜色来表示出现频率,我也不怎么会用这东西。
后面有时间再研究吧,看得眼花的。
Fuzz 功能
通过其FUZZ功能筛选灯控、门控、加速的关键数据帧。

这里我们就打开左侧车门,然后选择 0x244。然后我们发包。

这玩意疯狂抽出,并且伴随着四个车门不断地开关。

我们将第一个字段设置为00.

依次设置为0。

破案了,我们发现这个第四个字段是加速字段。
说实话,这个 Fuzz 效果感觉还不错,图形化的非常的方便,而且还可以控制数据包,很棒。

1290

被折叠的 条评论
为什么被折叠?



