You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python CAN库修改CAN帧CRC字段注入错误?

用Python CAN库修改CRC字段注入CAN总线错误

完全可以通过软件篡改CRC字段来注入CAN总线错误,python-can库提供了直接操作报文字段的能力,下面是具体实现方法:

实现原理

CAN报文的CRC是由仲裁ID、控制段和数据段计算得出的,默认情况下python-can会自动计算并填充CRC值。要注入错误,你需要禁用自动CRC计算,然后手动设置一个和报文内容不匹配的CRC值。

具体步骤

  1. 初始化CAN总线:根据你的硬件(比如socketcan、Vector适配器等)配置总线接口。
  2. 构造报文并禁用自动CRC:创建Message对象时,指定auto_crc=False(部分旧版本库可能需要用RawFrame替代),避免库自动计算CRC。
  3. 篡改CRC值:可以基于正确CRC做偏移(比如加1、减1),或者直接设置随机无效值,确保和当前报文内容不匹配。
  4. 发送篡改后的报文:通过总线发送该报文,接收节点会检测到CRC错误并触发错误帧。

代码示例

import can
import random

# 初始化CAN总线(根据实际硬件调整channel和bustype)
bus = can.interface.Bus(channel='can0', bustype='socketcan')

# 创建基础报文,禁用自动CRC计算
msg = can.Message(
    arbitration_id=0x123,
    data=[0x01, 0x02, 0x03, 0x04],
    is_extended_id=False,
    auto_crc=False
)

# 获取正确CRC(可选,用于对比)
correct_crc = msg.crc

# 篡改CRC:这里给正确CRC加1,也可以设随机值
tampered_crc = (correct_crc + 1) % 0x1FFFFF  # CAN CRC是21位,取模保证范围
# 或者用随机值:tampered_crc = random.randint(0, 0x1FFFFF)

# 手动设置篡改后的CRC
msg.crc = tampered_crc

# 发送报文
bus.send(msg)
print(f"已发送CRC篡改报文:ID=0x{msg.arbitration_id:X}, 数据={msg.data.hex()}, 篡改CRC=0x{tampered_crc:X}")

注意事项

  • 硬件限制:部分CAN控制器会强制校验CRC,拒绝发送无效CRC的报文。这种情况下需要使用支持原始帧发送的适配器,或者通过控制器配置关闭CRC校验(如果硬件支持)。
  • 版本兼容:不同版本的python-can可能有API差异,比如某些版本没有auto_crc参数,此时可以尝试使用can.RawFrame手动构造所有字段,包括CRC。
  • 错误行为:接收节点收到CRC不匹配的报文后,会立即发送错误帧,总线会根据错误计数进入主动/被动错误状态,符合CAN总线的错误处理机制。

内容的提问来源于stack exchange,提问作者jiji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 11:42:17