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

CAPL编程:如何实现CANoe中ECU间报文的中间人篡改转发

CANoe CAPL实现CAN报文中间人篡改(转发+修改)

一、核心实现逻辑

  • 硬件部署:将CANoe的通道1连接到发送ECU所在的CAN总线,通道2连接到目标ECU所在的CAN总线,务必断开发送ECU与目标ECU的直接物理连接,避免原报文绕过CANoe直接传输
  • CAPL执行流程:监听通道1的目标报文 → 捕获后修改信号值/调整发送频率 → 从通道2以原报文的ID、帧格式转发,让目标ECU识别为原发送方的报文

二、CAPL代码示例

场景1:修改信号值并按原频率转发

如果不需要调整发送频率,直接修改后转发:

// 监听通道1的所有报文(可替换为具体ID,比如CAN1.0x123)
on message CAN1.*
{
    // 示例1:基于DBC文件修改信号(假设报文包含EngineSpeed信号)
    this.EngineSpeed = 3500; // 把原转速改成3500rpm
    
    // 示例2:无DBC时直接修改原始字节(修改第3个字节为0x55)
    // this.byte(2) = 0x55;
    
    // 从通道2发送修改后的报文,保留原ID、帧格式
    output(CAN2, this);
}

场景2:修改发送频率+信号值

如果需要调整转发频率(比如原报文100ms发一次,改成200ms),用定时器控制:

msTimer forwardTimer;
int targetPeriod = 200; // 自定义转发周期(ms)
message *capturedMsg; // 存储捕获到的原报文

// 捕获通道1的报文
on message CAN1.*
{
    capturedMsg = this;
    // 首次捕获时启动定时器
    if (!isTimerActive(forwardTimer))
    {
        setTimer(forwardTimer, targetPeriod);
    }
}

// 定时器触发时转发修改后的报文
on timer forwardTimer
{
    if (capturedMsg != 0)
    {
        // 修改信号值
        capturedMsg.EngineSpeed = 3500;
        
        // 从通道2发送,保持原报文属性
        output(CAN2, *capturedMsg);
        
        // 重置定时器,持续周期发送
        setTimer(forwardTimer, targetPeriod);
    }
}

三、关键注意点

  • 保留原报文属性:转发时必须维持原报文的ID、IDE(标准/扩展帧)、RTR位,这是目标ECU识别为原发送方的核心
  • 物理隔离:必须断开发送ECU与目标ECU的直接CAN总线连接,否则原报文和篡改后的报文会同时到达目标ECU,引发数据冲突
  • DBC依赖:如果导入了DBC文件,直接通过报文名.信号名修改更直观;没有DBC的话,直接操作byte(n)(n从0开始)修改原始数据字节
  • 调试验证:用CANoe的Trace窗口分别监控通道1(原报文)和通道2(转发报文),确认修改内容和发送频率是否符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:45:20