Behringer CRC8 算法

逆向工程 CRC
2021-07-05 23:14:11

Behringer DEQ2496 音频设备可以通过 MIDI 向其发送命令,但是它们需要有效的 CRC 代码才能让设备接受它们。

到目前为止,我一直无法弄清楚 CRC 代码是如何计算的。该手册建议它是 CRC8,但是我无法配置 CRC8 算法来生成匹配值。

以下是一些示例数据,包括有效的 CRC 代码:

DEQ2496 SysEx 手册说明了上述每个文件的布局:

blockdata : 7/8 编码: blockno_h, blockno_l, crc, data[256]。

crc:blockno_h、blockno_l、data[256]的crc8校验和

blockno:传输的 256 字节数据块号(闪存偏移的第 21..15、14..8 位);块 0-0x1f:引导加载程序;块 0x20..0x5ef:应用程序;块 0x5f0-0x5ff:启动画面;块 0x600-0x67f:预设;块 0x680-0x69f:临时缓冲区;块 0x6a0-0x7ff:硬件配置;块号 0xff00 在屏幕上显示文本消息数据 [0..52]

数据:数据块

我已经处理了 7/8 编码,所以现在我有一个 3+256 字节的块,包括:

  • 偏移量 0:16 位大端整数,块号
  • 偏移量 2:8 位整数,CRC(这是我试图计算的值)
  • 偏移量 3+:实际数据

我尝试了几种 CRC 算法(有和没有查找表),编写代码来运行所有可能的 8 位多项式,初始和最终 XOR 值,但我找不到任何参数超过一个块。

尽管手册建议 CRC 字节本身不包含在 CRC 计算中,但我也尝试将其留在原处并将其设置为各种值,例如0x000xFF但这也没有产生任何结果。

有没有比我拥有更多 CRC 知识的人能够弄清楚“crc8 校验和”在这里的含义?

1个回答

感谢@IgorSkochinsky,他在我的另一个问题中建议尝试使用反汇编程序,我发现了一个包含 Blackfin 工具链Docker 映像,它允许我objdump用来反汇编代码:

bfin-elf-objdump -D -b binary -mbfin bootloader.bin > bootloader.disasm

在匆忙查阅Blackfin汇编器的手册并四处摸索后,我能够对发生的事情有一个模糊的了解,并且我能够找到CRC函数,结果证明它根本不是CRC函数,但是一个 DIY 校验和。

使用反汇编作为参考,我能够在我的 Javascript 代码中复制该算法:

function behringer_crc8(data) {
    let crc = 0;
    for (let b of data) {
        for (let j = 0; j < 8; j++) {
            if (!((b ^ crc) & 1)) crc ^= 0x19;
            b >>= 1;
            // Rotate (shift right, move lost LSB to new MSB)
            crc = ((crc & 1) << 7) | (crc >> 1);
        }
    }
    return crc ^ 0xbf;
}

将此代码与分布式固件更新进行比较表明它能够正确再现 CRC 字节!

事实证明,尽管手册上说校验和中包含两字节的块号前缀,但事实证明并没有,只有 256 字节的内容被校验和。