通过 RS-232 确定 CRC 算法(16 位?)

逆向工程 混淆 串行通讯 二元诊断
2021-06-16 22:40:11

我放弃了......我已经尝试了两年来确定在两台设备之间的 RS-232 串行连接上使用的是哪种 CRC 算法。该设备可追溯到 2002 年左右。我只是假设它的 CRC 受到保护,但我可能是错的。

我已经构建了一个连接到数据线的 RS-232 监视器。

我可以在我的示波器上清楚地看到它是标准的 RS-232,带有一个起始位、8 个数据位和一个停止位。我可以说它首先发送了 LSbit。它的 9600 波特。

我可以控制消息中的部分数据,但不能控制来自传输设备的全部数据。我已经能够确定消息中每个字节的含义。通过转动发射器上的旋钮,我可以看到特定字节增加一。所以我相当确定我知道消息的每个数据字节的含义。它们都是旋钮位置的简单二进制编码,有时是开关位置的 ASCII 字符编码。消息中的数据字节在设备做什么的上下文中都是有意义的。

这是串行线上的一长串消息。我已经能够通过所有 256 个值生成第 4 个字节序列。传输设备正在构建这些消息,我刚刚捕获了它们。前 6 个字节是消息。

在我看来,最后两个字节是 CRC 而不是校验和。从这个列表中,可以收集到许多在第 4 个字节中相差一位的消息对。我知道这很有用。



   0x00 0x09 0x69 0x31 0x97 0x03 0x54 0x67
   0x00 0x09 0x69 0x31 0x98 0x03 0xAD 0xD5
   0x00 0x09 0x69 0x31 0x99 0x03 0x16 0xC9
   0x00 0x09 0x69 0x31 0x9A 0x03 0xDB 0xEC
   0x00 0x09 0x69 0x31 0x9B 0x03 0x60 0xF0
   0x00 0x09 0x69 0x31 0x9C 0x03 0x41 0xA7
   0x00 0x09 0x69 0x31 0x9D 0x03 0xFA 0xBB
   0x00 0x09 0x69 0x31 0x9E 0x03 0x37 0x9E
   0x00 0x09 0x69 0x31 0x9F 0x03 0x8C 0x82
   0x00 0x09 0x69 0x31 0xA0 0x03 0x87 0x7C
   0x00 0x09 0x69 0x31 0xA1 0x03 0x3C 0x60
   0x00 0x09 0x69 0x31 0xA2 0x03 0xF1 0x45
   0x00 0x09 0x69 0x31 0xA3 0x03 0x4A 0x59
   0x00 0x09 0x69 0x31 0xA4 0x03 0x6B 0x0E
   0x00 0x09 0x69 0x31 0xA5 0x03 0xD0 0x12
   0x00 0x09 0x69 0x31 0xA6 0x03 0x1D 0x37
   0x00 0x09 0x69 0x31 0xA7 0x03 0xA6 0x2B
   0x00 0x09 0x69 0x31 0xA8 0x03 0x5F 0x99
   0x00 0x09 0x69 0x31 0xA9 0x03 0xE4 0x85
   0x00 0x09 0x69 0x31 0xAA 0x03 0x29 0xA0
   0x00 0x09 0x69 0x31 0xAB 0x03 0x92 0xBC
   0x00 0x09 0x69 0x31 0xAC 0x03 0xB3 0xEB
   0x00 0x09 0x69 0x31 0xAD 0x03 0x08 0xF7
   0x00 0x09 0x69 0x31 0xAE 0x03 0xC5 0xD2
   0x00 0x09 0x69 0x31 0xAF 0x03 0x7E 0xCE
   0x00 0x09 0x69 0x31 0xB0 0x03 0x26 0xBF
   0x00 0x09 0x69 0x31 0xB1 0x03 0x9D 0xA3
   0x00 0x09 0x69 0x31 0xB2 0x03 0x50 0x86
   0x00 0x09 0x69 0x31 0xB3 0x03 0xEB 0x9A
   0x00 0x09 0x69 0x31 0xB4 0x03 0xCA 0xCD
   0x00 0x09 0x69 0x31 0xB5 0x03 0x71 0xD1
   0x00 0x09 0x69 0x31 0xB6 0x03 0xBC 0xF4
   0x00 0x09 0x69 0x31 0xB7 0x03 0x07 0xE8
   0x00 0x09 0x69 0x31 0xB8 0x03 0xFE 0x5A
   0x00 0x09 0x69 0x31 0xB9 0x03 0x45 0x46
   0x00 0x09 0x69 0x31 0xBA 0x03 0x88 0x63
   0x00 0x09 0x69 0x31 0xBB 0x03 0x33 0x7F
   0x00 0x09 0x69 0x31 0xBC 0x03 0x12 0x28
   0x00 0x09 0x69 0x31 0xBD 0x03 0xA9 0x34
   0x00 0x09 0x69 0x31 0xBE 0x03 0x64 0x11
   0x00 0x09 0x69 0x31 0xBF 0x03 0xDF 0x0D
   0x00 0x09 0x69 0x31 0xC0 0x03 0x63 0xE5
   0x00 0x09 0x69 0x31 0xC1 0x03 0xD8 0xF9
   0x00 0x09 0x69 0x31 0xC2 0x03 0x15 0xDC
   0x00 0x09 0x69 0x31 0xC3 0x03 0xAE 0xC0
   0x00 0x09 0x69 0x31 0xC4 0x03 0x8F 0x97
   0x00 0x09 0x69 0x31 0xC5 0x03 0x34 0x8B
   0x00 0x09 0x69 0x31 0xC6 0x03 0xF9 0xAE
   0x00 0x09 0x69 0x31 0xC7 0x03 0x42 0xB2
   0x00 0x09 0x69 0x31 0xC8 0x03 0xBB 0x00
   0x00 0x09 0x69 0x31 0xC9 0x03 0x00 0x1C
   0x00 0x09 0x69 0x31 0xCA 0x03 0xCD 0x39
   0x00 0x09 0x69 0x31 0xCB 0x03 0x76 0x25
   0x00 0x09 0x69 0x31 0xCC 0x03 0x57 0x72
   0x00 0x09 0x69 0x31 0xCD 0x03 0xEC 0x6E
   0x00 0x09 0x69 0x31 0xCE 0x03 0x21 0x4B
   0x00 0x09 0x69 0x31 0xCF 0x03 0x9A 0x57
   0x00 0x09 0x69 0x31 0xD0 0x03 0xC2 0x26
   0x00 0x09 0x69 0x31 0xD1 0x03 0x79 0x3A
   0x00 0x09 0x69 0x31 0xD2 0x03 0xB4 0x1F
   0x00 0x09 0x69 0x31 0xD3 0x03 0x0F 0x03
   0x00 0x09 0x69 0x31 0xD4 0x03 0x2E 0x54
   0x00 0x09 0x69 0x31 0xD5 0x03 0x95 0x48
   0x00 0x09 0x69 0x31 0xD6 0x03 0x58 0x6D
   0x00 0x09 0x69 0x31 0xD7 0x03 0xE3 0x71
   0x00 0x09 0x69 0x31 0xD8 0x03 0x1A 0xC3
   0x00 0x09 0x69 0x31 0xD9 0x03 0xA1 0xDF
   0x00 0x09 0x69 0x31 0xDA 0x03 0x6C 0xFA
   0x00 0x09 0x69 0x31 0xDB 0x03 0xD7 0xE6
   0x00 0x09 0x69 0x31 0xDC 0x03 0xF6 0xB1
   0x00 0x09 0x69 0x31 0xDD 0x03 0x4D 0xAD
   0x00 0x09 0x69 0x31 0xDE 0x03 0x80 0x88
   0x00 0x09 0x69 0x31 0xDF 0x03 0x3B 0x94
   0x00 0x09 0x69 0x31 0xE0 0x03 0x30 0x6A
   0x00 0x09 0x69 0x31 0xE1 0x03 0x8B 0x76
   0x00 0x09 0x69 0x31 0xE2 0x03 0x46 0x53
   0x00 0x09 0x69 0x31 0xE3 0x03 0xFD 0x4F
   0x00 0x09 0x69 0x31 0xE4 0x03 0xDC 0x18
   0x00 0x09 0x69 0x31 0xE5 0x03 0x67 0x04
   0x00 0x09 0x69 0x31 0xE6 0x03 0xAA 0x21
   0x00 0x09 0x69 0x31 0xE7 0x03 0x11 0x3D
   0x00 0x09 0x69 0x31 0xE8 0x03 0xE8 0x8F
   0x00 0x09 0x69 0x31 0xE9 0x03 0x53 0x93
   0x00 0x09 0x69 0x31 0xEA 0x03 0x9E 0xB6
   0x00 0x09 0x69 0x31 0xEB 0x03 0x25 0xAA
   0x00 0x09 0x69 0x31 0xEC 0x03 0x04 0xFD
   0x00 0x09 0x69 0x31 0xED 0x03 0xBF 0xE1
   0x00 0x09 0x69 0x31 0xEE 0x03 0x72 0xC4
   0x00 0x09 0x69 0x31 0xEF 0x03 0xC9 0xD8
   0x00 0x09 0x69 0x31 0xF0 0x03 0x91 0xA9
   0x00 0x09 0x69 0x31 0xF1 0x03 0x2A 0xB5
   0x00 0x09 0x69 0x31 0xF2 0x03 0xE7 0x90
   0x00 0x09 0x69 0x31 0xF3 0x03 0x5C 0x8C
   0x00 0x09 0x69 0x31 0xF4 0x03 0x7D 0xDB
   0x00 0x09 0x69 0x31 0xF5 0x03 0xC6 0xC7
   0x00 0x09 0x69 0x31 0xF6 0x03 0x0B 0xE2
   0x00 0x09 0x69 0x31 0xF7 0x03 0xB0 0xFE
   0x00 0x09 0x69 0x31 0xF8 0x03 0x49 0x4C
   0x00 0x09 0x69 0x31 0xF9 0x03 0xF2 0x50
   0x00 0x09 0x69 0x31 0xFA 0x03 0x3F 0x75
   0x00 0x09 0x69 0x31 0xFB 0x03 0x84 0x69
   0x00 0x09 0x69 0x31 0xFC 0x03 0xA5 0x3E
   0x00 0x09 0x69 0x31 0xFD 0x03 0x1E 0x22
   0x00 0x09 0x69 0x31 0xFE 0x03 0xD3 0x07
   0x00 0x09 0x69 0x31 0xFF 0x03 0x68 0x1B
   0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
   0x00 0x09 0x69 0x31 0x01 0x03 0x01 0xC2
   0x00 0x09 0x69 0x31 0x02 0x03 0xCC 0xE7
   0x00 0x09 0x69 0x31 0x03 0x03 0x77 0xFB
   0x00 0x09 0x69 0x31 0x04 0x03 0x56 0xAC
   0x00 0x09 0x69 0x31 0x05 0x03 0xED 0xB0
   0x00 0x09 0x69 0x31 0x06 0x03 0x20 0x95
   0x00 0x09 0x69 0x31 0x07 0x03 0x9B 0x89
   0x00 0x09 0x69 0x31 0x08 0x03 0x62 0x3B
   0x00 0x09 0x69 0x31 0x09 0x03 0xD9 0x27
   0x00 0x09 0x69 0x31 0x0A 0x03 0x14 0x02
   0x00 0x09 0x69 0x31 0x0B 0x03 0xAF 0x1E
   0x00 0x09 0x69 0x31 0x0C 0x03 0x8E 0x49
   0x00 0x09 0x69 0x31 0x0D 0x03 0x35 0x55
   0x00 0x09 0x69 0x31 0x0E 0x03 0xF8 0x70
   0x00 0x09 0x69 0x31 0x0F 0x03 0x43 0x6C
   0x00 0x09 0x69 0x31 0x10 0x03 0x1B 0x1D
   0x00 0x09 0x69 0x31 0x11 0x03 0xA0 0x01
   0x00 0x09 0x69 0x31 0x12 0x03 0x6D 0x24
   0x00 0x09 0x69 0x31 0x13 0x03 0xD6 0x38
   0x00 0x09 0x69 0x31 0x14 0x03 0xF7 0x6F
   0x00 0x09 0x69 0x31 0x15 0x03 0x4C 0x73
   0x00 0x09 0x69 0x31 0x16 0x03 0x81 0x56
   0x00 0x09 0x69 0x31 0x17 0x03 0x3A 0x4A
   0x00 0x09 0x69 0x31 0x18 0x03 0xC3 0xF8
   0x00 0x09 0x69 0x31 0x19 0x03 0x78 0xE4
   0x00 0x09 0x69 0x31 0x1A 0x03 0xB5 0xC1
   0x00 0x09 0x69 0x31 0x1B 0x03 0x0E 0xDD
   0x00 0x09 0x69 0x31 0x1C 0x03 0x2F 0x8A
   0x00 0x09 0x69 0x31 0x1D 0x03 0x94 0x96
   0x00 0x09 0x69 0x31 0x1E 0x03 0x59 0xB3
   0x00 0x09 0x69 0x31 0x1F 0x03 0xE2 0xAF
   0x00 0x09 0x69 0x31 0x20 0x03 0xE9 0x51
   0x00 0x09 0x69 0x31 0x21 0x03 0x52 0x4D
   0x00 0x09 0x69 0x31 0x22 0x03 0x9F 0x68
   0x00 0x09 0x69 0x31 0x23 0x03 0x24 0x74
   0x00 0x09 0x69 0x31 0x24 0x03 0x05 0x23
   0x00 0x09 0x69 0x31 0x25 0x03 0xBE 0x3F
   0x00 0x09 0x69 0x31 0x26 0x03 0x73 0x1A
   0x00 0x09 0x69 0x31 0x27 0x03 0xC8 0x06
   0x00 0x09 0x69 0x31 0x28 0x03 0x31 0xB4
   0x00 0x09 0x69 0x31 0x29 0x03 0x8A 0xA8
   0x00 0x09 0x69 0x31 0x2A 0x03 0x47 0x8D
   0x00 0x09 0x69 0x31 0x2B 0x03 0xFC 0x91
   0x00 0x09 0x69 0x31 0x2C 0x03 0xDD 0xC6
   0x00 0x09 0x69 0x31 0x2D 0x03 0x66 0xDA
   0x00 0x09 0x69 0x31 0x2E 0x03 0xAB 0xFF
   0x00 0x09 0x69 0x31 0x2F 0x03 0x10 0xE3
   0x00 0x09 0x69 0x31 0x30 0x03 0x48 0x92
   0x00 0x09 0x69 0x31 0x31 0x03 0xF3 0x8E
   0x00 0x09 0x69 0x31 0x32 0x03 0x3E 0xAB
   0x00 0x09 0x69 0x31 0x33 0x03 0x85 0xB7
   0x00 0x09 0x69 0x31 0x34 0x03 0xA4 0xE0
   0x00 0x09 0x69 0x31 0x35 0x03 0x1F 0xFC
   0x00 0x09 0x69 0x31 0x36 0x03 0xD2 0xD9
   0x00 0x09 0x69 0x31 0x37 0x03 0x69 0xC5
   0x00 0x09 0x69 0x31 0x38 0x03 0x90 0x77
   0x00 0x09 0x69 0x31 0x39 0x03 0x2B 0x6B
   0x00 0x09 0x69 0x31 0x3A 0x03 0xE6 0x4E
   0x00 0x09 0x69 0x31 0x3B 0x03 0x5D 0x52
   0x00 0x09 0x69 0x31 0x3C 0x03 0x7C 0x05
   0x00 0x09 0x69 0x31 0x3D 0x03 0xC7 0x19
   0x00 0x09 0x69 0x31 0x3E 0x03 0x0A 0x3C
   0x00 0x09 0x69 0x31 0x3F 0x03 0xB1 0x20
   0x00 0x09 0x69 0x31 0x40 0x03 0x0D 0xC8
   0x00 0x09 0x69 0x31 0x41 0x03 0xB6 0xD4
   0x00 0x09 0x69 0x31 0x42 0x03 0x7B 0xF1
   0x00 0x09 0x69 0x31 0x43 0x03 0xC0 0xED
   0x00 0x09 0x69 0x31 0x44 0x03 0xE1 0xBA
   0x00 0x09 0x69 0x31 0x45 0x03 0x5A 0xA6
   0x00 0x09 0x69 0x31 0x46 0x03 0x97 0x83
   0x00 0x09 0x69 0x31 0x47 0x03 0x2C 0x9F
   0x00 0x09 0x69 0x31 0x48 0x03 0xD5 0x2D
   0x00 0x09 0x69 0x31 0x49 0x03 0x6E 0x31
   0x00 0x09 0x69 0x31 0x4A 0x03 0xA3 0x14
   0x00 0x09 0x69 0x31 0x4B 0x03 0x18 0x08
   0x00 0x09 0x69 0x31 0x4C 0x03 0x39 0x5F
   0x00 0x09 0x69 0x31 0x4D 0x03 0x82 0x43
   0x00 0x09 0x69 0x31 0x4E 0x03 0x4F 0x66
   0x00 0x09 0x69 0x31 0x4F 0x03 0xF4 0x7A
   0x00 0x09 0x69 0x31 0x50 0x03 0xAC 0x0B
   0x00 0x09 0x69 0x31 0x51 0x03 0x17 0x17
   0x00 0x09 0x69 0x31 0x52 0x03 0xDA 0x32
   0x00 0x09 0x69 0x31 0x53 0x03 0x61 0x2E
   0x00 0x09 0x69 0x31 0x54 0x03 0x40 0x79
   0x00 0x09 0x69 0x31 0x55 0x03 0xFB 0x65
   0x00 0x09 0x69 0x31 0x56 0x03 0x36 0x40
   0x00 0x09 0x69 0x31 0x57 0x03 0x8D 0x5C
   0x00 0x09 0x69 0x31 0x58 0x03 0x74 0xEE
   0x00 0x09 0x69 0x31 0x59 0x03 0xCF 0xF2
   0x00 0x09 0x69 0x31 0x5A 0x03 0x02 0xD7
   0x00 0x09 0x69 0x31 0x5B 0x03 0xB9 0xCB
   0x00 0x09 0x69 0x31 0x5C 0x03 0x98 0x9C
   0x00 0x09 0x69 0x31 0x5D 0x03 0x23 0x80
   0x00 0x09 0x69 0x31 0x5E 0x03 0xEE 0xA5
   0x00 0x09 0x69 0x31 0x5F 0x03 0x55 0xB9
   0x00 0x09 0x69 0x31 0x60 0x03 0x5E 0x47
   0x00 0x09 0x69 0x31 0x61 0x03 0xE5 0x5B
   0x00 0x09 0x69 0x31 0x62 0x03 0x28 0x7E
   0x00 0x09 0x69 0x31 0x63 0x03 0x93 0x62
   0x00 0x09 0x69 0x31 0x64 0x03 0xB2 0x35
   0x00 0x09 0x69 0x31 0x65 0x03 0x09 0x29
   0x00 0x09 0x69 0x31 0x66 0x03 0xC4 0x0C
   0x00 0x09 0x69 0x31 0x67 0x03 0x7F 0x10
   0x00 0x09 0x69 0x31 0x68 0x03 0x86 0xA2
   0x00 0x09 0x69 0x31 0x69 0x03 0x3D 0xBE
   0x00 0x09 0x69 0x31 0x6A 0x03 0xF0 0x9B
   0x00 0x09 0x69 0x31 0x6B 0x03 0x4B 0x87
   0x00 0x09 0x69 0x31 0x6C 0x03 0x6A 0xD0
   0x00 0x09 0x69 0x31 0x6D 0x03 0xD1 0xCC
   0x00 0x09 0x69 0x31 0x6E 0x03 0x1C 0xE9
   0x00 0x09 0x69 0x31 0x6F 0x03 0xA7 0xF5
   0x00 0x09 0x69 0x31 0x70 0x03 0xFF 0x84
   0x00 0x09 0x69 0x31 0x71 0x03 0x44 0x98
   0x00 0x09 0x69 0x31 0x72 0x03 0x89 0xBD
   0x00 0x09 0x69 0x31 0x73 0x03 0x32 0xA1
   0x00 0x09 0x69 0x31 0x74 0x03 0x13 0xF6
   0x00 0x09 0x69 0x31 0x75 0x03 0xA8 0xEA
   0x00 0x09 0x69 0x31 0x76 0x03 0x65 0xCF
   0x00 0x09 0x69 0x31 0x76 0x03 0x65 0xCF
   0x00 0x09 0x69 0x31 0x77 0x03 0xDE 0xD3
   0x00 0x09 0x69 0x31 0x78 0x03 0x27 0x61
   0x00 0x09 0x69 0x31 0x79 0x03 0x9C 0x7D
   0x00 0x09 0x69 0x31 0x7A 0x03 0x51 0x58
   0x00 0x09 0x69 0x31 0x7B 0x03 0xEA 0x44
   0x00 0x09 0x69 0x31 0x7C 0x03 0xCB 0x13
   0x00 0x09 0x69 0x31 0x7D 0x03 0x70 0x0F
   0x00 0x09 0x69 0x31 0x7E 0x03 0xBD 0x2A
   0x00 0x09 0x69 0x31 0x7F 0x03 0x06 0x36
   0x00 0x09 0x69 0x31 0x80 0x03 0xD4 0xF3
   0x00 0x09 0x69 0x31 0x81 0x03 0x6F 0xEF
   0x00 0x09 0x69 0x31 0x82 0x03 0xA2 0xCA
   0x00 0x09 0x69 0x31 0x83 0x03 0x19 0xD6
   0x00 0x09 0x69 0x31 0x84 0x03 0x38 0x81
   0x00 0x09 0x69 0x31 0x85 0x03 0x83 0x9D
   0x00 0x09 0x69 0x31 0x86 0x03 0x4E 0xB8
   0x00 0x09 0x69 0x31 0x87 0x03 0xF5 0xA4
   0x00 0x09 0x69 0x31 0x88 0x03 0x0C 0x16
   0x00 0x09 0x69 0x31 0x89 0x03 0xB7 0x0A
   0x00 0x09 0x69 0x31 0x8A 0x03 0x7A 0x2F
   0x00 0x09 0x69 0x31 0x8B 0x03 0xC1 0x33
   0x00 0x09 0x69 0x31 0x8C 0x03 0xE0 0x64
   0x00 0x09 0x69 0x31 0x8D 0x03 0x5B 0x78
   0x00 0x09 0x69 0x31 0x8E 0x03 0x96 0x5D
   0x00 0x09 0x69 0x31 0x8F 0x03 0x2D 0x41
   0x00 0x09 0x69 0x31 0x90 0x03 0x75 0x30
   0x00 0x09 0x69 0x31 0x91 0x03 0xCE 0x2C
   0x00 0x09 0x69 0x31 0x92 0x03 0x03 0x09
   0x00 0x09 0x69 0x31 0x93 0x03 0xB8 0x15
   0x00 0x09 0x69 0x31 0x94 0x03 0x99 0x42
   0x00 0x09 0x69 0x31 0x95 0x03 0x22 0x5E
   0x00 0x09 0x69 0x31 0x96 0x03 0xEF 0x7B
   0x00 0x09 0x69 0x31 0x97 0x03 0x54 0x67
   0x00 0x09 0x69 0x31 0x98 0x03 0xAD 0xD5
   0x00 0x09 0x69 0x31 0x99 0x03 0x16 0xC9
   0x00 0x09 0x69 0x31 0x9A 0x03 0xDB 0xEC
   0x00 0x09 0x69 0x31 0x9B 0x03 0x60 0xF0
   0x00 0x09 0x69 0x31 0x9C 0x03 0x41 0xA7
   0x00 0x09 0x69 0x31 0x9D 0x03 0xFA 0xBB
   0x00 0x09 0x69 0x31 0x9E 0x03 0x37 0x9E
   0x00 0x09 0x69 0x31 0x9F 0x03 0x8C 0x82
   0x00 0x09 0x69 0x31 0xA0 0x03 0x87 0x7C
   0x00 0x09 0x69 0x31 0xA1 0x03 0x3C 0x60
   0x00 0x09 0x69 0x31 0xA2 0x03 0xF1 0x45
   0x00 0x09 0x69 0x31 0xA3 0x03 0x4A 0x59
   0x00 0x09 0x69 0x31 0xA4 0x03 0x6B 0x0E
   0x00 0x09 0x69 0x31 0xA5 0x03 0xD0 0x12
   0x00 0x09 0x69 0x31 0xA6 0x03 0x1D 0x37
   0x00 0x09 0x69 0x31 0xA7 0x03 0xA6 0x2B
   0x00 0x09 0x69 0x31 0xA8 0x03 0x5F 0x99
   0x00 0x09 0x69 0x31 0xA9 0x03 0xE4 0x85
   0x00 0x09 0x69 0x31 0xAA 0x03 0x29 0xA0
   0x00 0x09 0x69 0x31 0xAB 0x03 0x92 0xBC
   0x00 0x09 0x69 0x31 0xAC 0x03 0xB3 0xEB
   0x00 0x09 0x69 0x31 0xAD 0x03 0x08 0xF7
   0x00 0x09 0x69 0x31 0xAE 0x03 0xC5 0xD2
   0x00 0x09 0x69 0x31 0xAF 0x03 0x7E 0xCE

我已经尝试对这些消息进行“报复”,但没有成功。该设备旨在与 PC 配合使用,因此我认为我们正在使用小端字节。

在我的 PC 上,我可以复制这些消息来模仿发送设备,而接收设备会接受它们。我可以使用任意数量的 0x00 字节作为消息前缀,接收设备会接受它们。如果我更改了消息中的任何位,包括可能的 CRC 字节,接收设备将拒绝它们(如果接收器接受该消息,则它会发送一个简单的 OK 消息,否则它根本不响应。)

在我的 PC 上,我已经获取了其中一条消息,并将其发送到接收器,最后每可能两个字节。除了最后两个字节与原始消息相同的消息外,接收方拒绝所有消息。

这两个字节很重要。也许它们是某种校验和而不是 CRC。

我花了两年时间浏览了 Greg Ewing 编写的逆向工程文档 http://www.cosc.canterbury.ac.nz/greg.ewing/essays/CRC-Reverse-Engineering.html ,我可以在以下方面取得一些进展他的方法,但我的进步最终停滞不前。

我不想说 Greg 的方法帮我找到了什么,因为我可能做错了。如果有人认为它可能有用,我会在这里发布。

如果我关闭设备然后重新打开并让它再次发送相同的消息,则每次执行此操作时最后两个字节都是相同的。

所以我希望我能在这里得到更多关于逆向工程堆栈交换的提示。

恩里科

2个回答

我想到了!这个网站上的一些评论让我回过头来更努力地思考——实际上是换一种方式思考。

我认为我应该发布我对这些消息所做的分析,以尝试确定 CRC 算法。

我的分析基于 Greg Ewing 撰写的一篇论文http://www.cosc.canterbury.ac.nz/greg.ewing/essays/CRC-Reverse-Engineering.html他在那篇论文中提出了很多见解。除了用他的方法总结和解释我的结果外,我不会重复他写的内容。因此,在我展示我的数据时,请继续阅读他的论文。

他展示了 CRC 的“遵循一种叠加原则。您可以将 CRC 视为由一组组件 CRC 的异或组成,每个组件仅依赖于消息中的一个位。

他展示了,对于 XorIn = XorOut = 0x0000 的情况,即:

C1 xor C2 = M1 xor M2 其中: Cx = CRC Mx = 等长消息

他称“M1 xor M2”为不同的信息。

Greg 写道:“然后我与 Patrick Maupin 进行了一次对话,他提出了一项测试,可能有助于澄清它是否是真正的 CRC。由于叠加原理,如果通过与位模式 B1 异或来更改消息导致其 CRC 由 C1 改变,另一个位模式 B2 导致 CRC 由 C2 改变,然后使用 (B1 xor B2) 对消息进行异或应该将 CRC 改变为 (C1 xor C2)。如果这没有发生,则算法不可能是普通的CRC算法。”

使用从发送器到接收器比特流的这 4 条消息:


                                    CRC
                                  LSB  MSB
   ---- ---- ---- ---- ---- ---- ---- ----
M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
M1 0x00 0x09 0x69 0x31 0x01 0x03 0x01 0xC2
M2 0x00 0x09 0x69 0x31 0x02 0x03 0xCC 0xE7
M3 0x00 0x09 0x69 0x31 0x03 0x03 0x77 0xFB
   ---- ---- ---- ---- ---- ---- ---- ----

然后,


                                    CRC
                                  LSB  MSB
   ---- ---- ---- ---- ---- ---- ---- ----
M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
B1 0x00 0x00 0x00 0x00 0x01 0x00
   ------------ XOR ------------
M1 0x00 0x09 0x69 0x31 0x01 0x03 0x01 0xC2   

C1 = 0xDEBA xor 0xC201 = 0x1CBB

另一个位模式 B2 导致 CRC 改变 C2,


                                    CRC
                                  LSB  MSB
   ---- ---- ---- ---- ---- ---- ---- ----
M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
B2 0x00 0x00 0x00 0x00 0x02 0x00
   ------------ XOR ------------
M2 0x00 0x09 0x69 0x31 0x02 0x03 0xCC 0xE7

C2 = 0xDEBA xor 0xE7CC = 0x3976

C1 xor C2 = 0x1CBB xor 0x3976 = 0x25CD

然后使用 B3 = (B1 xor B2) 对数据包进行异或应该将 CRC 更改为 C3 = (C1 xor C2)。如果没有发生这种情况,该算法就不能是普通的 CRC 算法。


                                    CRC
                                  LSB  MSB
   ---- ---- ---- ---- ---- ---- ---- ----
B1 0x00 0x00 0x00 0x00 0x01 0x00
B2 0x00 0x00 0x00 0x00 0x02 0x00
   ------------ XOR ------------

B3 0x00 0x00 0x00 0x00 0x03 0x00

M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
B3 0x00 0x00 0x00 0x00 0x03 0x00
   ------------ XOR ------------
M3 0x00 0x09 0x69 0x31 0x03 0x03 0x77 0xFB

C3 = 0xDEBA xor 0xFB77 = 0x25CD

Does C3 = 0x25CD == C1 XOR C2 = 0x25CD  ? Yes

在这个串行流的情况下,它发生了所以它必须是一个普通的CRC算法。

Greg 写道:“现在考虑从两个 1 位消息中获得的两个 CRC 值,其中 1 位位于相邻位置。结果 CRC 将仅相差一个移位异或周期。准确地说,如果 C1 对应于具有位置 i 为 1,而 C2 对应位置 i+1 为 1 的消息,则 C1 是通过对 C2 应用一个移位异或循环得出的。(如果这看起来是倒退,那是因为 1 位离得越远消息结束时,更多的移位异或周期应用于 CRC。)

有两种可能。如果 C2 的前导位(即将移出的位)为 0,则 C1 将等于 C2 移一位。如果它是 1,那么 C2 将等于 C1 移位一位并与多项式异或。”

我使用我在这里第一次发布的数据构建了几个差异消息,这些消息仅在一点上有所不同。


                                     CRC
                                  LSB  MSB
    ---- ---- ---- ---- ---- ---- ---- ----
M0  0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
M1  0x00 0x09 0x69 0x31 0x01 0x03 0x01 0xC2
    ---- ---- ---- ---- ---- ---- ---- ---- 
D01    0    0    0    0 0x01    0 0xBB 0x1C 

    ---- ---- ---- ---- ---- ---- ---- ----
M0  0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
M2  0x00 0x09 0x69 0x31 0x02 0x03 0xCC 0xE7
    ---- ---- ---- ---- ---- ---- ---- ----  
D02    0    0    0    0 0x02    0 0x76 0x39

    ---- ---- ---- ---- ---- ---- ---- ----
M0  0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
M3  0x00 0x09 0x69 0x31 0x04 0x03 0x56 0xAC
    ---- ---- ---- ---- ---- ---- ---- ---- 
D04    0    0    0    0 0x04    0 0xEC 0x72 

    ---- ---- ---- ---- ---- ---- ---- ----
M0  0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
m8  0x00 0x09 0x69 0x31 0x08 0x03 0x62 0x3B
    ---- ---- ---- ---- ---- ---- ---- ---- 
D08    0    0    0    0 0x08    0 0xD8 0xE5

    ---- ---- ---- ---- ---- ---- ---- ----
M0  0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
M10 0x00 0x09 0x69 0x31 0x10 0x03 0x1B 0x1D
    ---- ---- ---- ---- ---- ---- ---- ----
D10    0    0    0    0 0x10    0 0xA1 0xC3

    ---- ---- ---- ---- ---- ---- ---- ----
M0  0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
M20 0x00 0x09 0x69 0x31 0x20 0x03 0xE9 0x51
    ---- ---- ---- ---- ---- ---- ---- ----
D20    0    0    0    0 0x20    0 0x53 0x8f

    ---- ---- ---- ---- ---- ---- ---- ----
M0  0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
M40 0x00 0x09 0x69 0x31 0x40 0x03 0x0D 0xC8
    ---- ---- ---- ---- ---- ---- ---- ----
D40    0    0    0    0 0x40    0 0xB7 0x16

    ---- ---- ---- ---- ---- ---- ---- ----
M0  0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE
M80 0x00 0x09 0x69 0x31 0x80 0x03 0xD4 0xF3
    ---- ---- ---- ---- ---- ---- ---- ---- 
D80    0    0    0    0 0x80    0 0x6e 0x2d

我想出了这些带有显示字节的差异消息的 CRC 值:


Byte    CRC (with byte swap to MSB-LSB order)
-----   ----
01  1CBB            
02  3976    LSB of CRC = 0
04  72EC    LSB of CRC = 0
08  E5D8    LSB of CRC = 0
10  C3A1    LSB of CRC = 1
20  8F53    LSB of CRC = 1
40  16b7    LSB of CRC = 1
80  2d6e    Lsb of CRC = 0

Greg 解释说,当 LSB 为 0 时,前面的 CRC 是这个 CRC 的右移一位。如果 LSB 是 1,则前面的 CRC 是当前 CRC 与多项式异或,然后右移。


Byte    CRC shift   xor Previous CRC
-----   ----    ----    ----    ----
01  1CBB            
02  3976    1CBB    0000    1CBB
04  72EC    3976    0000    3976
08  E5D8    72EC    0000    72EC
10  C3A1    61D0    8408    E5D8
20  8F53    47A9    8408    C3A1
40  16b7    0B5B    8408    8F53
80  2d6e    16B7    0000    16b7

这告诉我多项式是 0x8408。

下一句话转述了 Greg 所写的内容:“移位方向表明 ReflectOut 参数应该为 True,因为向右移位等效于使用具有多项式 0x1021 的算法的规范左移版本,然后反映生成的 CRC。值得注意的是,0x1021 是标准的 16 位多项式之一——称为“CRC-16-CCITT”,也称为“KERMIT”。

所以 Greg 帮助我进行了相当多的分析。它确实看起来像是一个 CRC,并且最有可能是 CRC-16-CCITT 或 Kermit(至少在 init = XorOut = 0x0000 的情况下)。

但是,当然,当我尝试通过 RevEng 运行我的消息并要求它使用 KERMIT 算法时,消息中的实际 CRC 与 RevEng 生成的不匹配。

例如,使用 D01 消息:

d:>reveng -c -m kermit 000000000100 返回 d819

Greg 对其问题的分析表明,CRC 计算中可能包含一些不明显的字节。在 Greg 的案例中,他写道:“我想出了以下想法。首先用多项式初始化寄存器——这对应于在 1 位差异消息中遇到 1 后的状态。然后运行算法并计数“在达到已知 CRC 值之前所需的步骤数。假设最终达到了,这将告诉我 1 之后有多少 0 位包含在 CRC 中。”

所以,我说也许这对我有用。所以我在消息 D01 的末尾添加了 00 个字节:

d:>reveng -c -m kermit 00000000010000 返回 dc5a

d:>reveng -c -m kermit 0000000001000000 返回 bb1c

哇,0xbb1c 是我从 M0 和 M1 对两个实际 CRC 进行异或时得到的 CRC 值。(如果实际消息中的实际字节相同并且在将它们异或到差异消息中后为 0x00,我可以在差异消息中添加 0x00 字节。我需要记住,这个分析仍然需要 init 和 XorOut 是零,在实际算法中可能不是这种情况。

所以我花了大约一年的时间(不,不是全职)试图找到额外字节的值。我写了一个程序,它尝试了所有额外字节的组合,但我的值都跳了。我将省略我为寻找额外字节所做的一切。这是一个死胡同。

** 这是我在此网页上发布我的问题描述时的情况。**

也许我仍然没有在正确的位置有正确的数据字节,或者 init = XorOut = 0x0000 的假设不正确。

所以我决定尝试更多的消息。我编造了一堆消息,我可以在其中控制第二个字节的值。以下是我能够生成的消息:


                                                  CRC
                                                LSB  MSB
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x02 0x77 0x32                0x97 0x13 0x22 0x8D        
   0x00 0x04 0x77 0x32                0x97 0x13 0x14 0xE8
   0x00 0x08 0x77 0x32                0x97 0x13 0x78 0x22
   0x00 0x10 0x77 0x32                0x97 0x13 0xB1 0xBE
   0x00 0x20 0x77 0x32                0x97 0x13 0x32 0x8F
   0x00 0x40 0x77 0x32                0x97 0x13 0x34 0xEC
   0x00 0x06 0x77 0x32                0x97 0x13 0x06 0xCB
   0x00 0x0A 0x77 0x32                0x97 0x13 0x6A 0x01
   0x00 0x12 0x77 0x32                0x97 0x13 0xA3 0x9D
   0x00 0x22 0x77 0x32                0x97 0x13 0x20 0xAC
   0x00 0x42 0x77 0x32                0x97 0x13 0x26 0xCF

以下是不同的信息:


                                                  CRC
                                                LSB  MSB
     ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
M02a 0x00 0x02 0x77 0x32                0x97 0x13 0x22 0x8D
M03a 0x00 0x03 0x77 0x32                0x97 0x13 0xAB 0x9C
     ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
D01a 0x00 0x01 0x00 0x00                0x00 0x00 0x89 0x11

                                                LSB  MSB
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x04 0x77 0x32                0x97 0x13 0x14 0xE8
   0x00 0x06 0x77 0x32                0x97 0x13 0x06 0xCB
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x02 0x00 0x00                0x00 0x00 0x12 0x23

                                                LSB  MSB
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x02 0x77 0x32                0x97 0x13 0x22 0x8D
   0x00 0x06 0x77 0x32                0x97 0x13 0x06 0xCB
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x04 0x00 0x00                0x00 0x00 0x24 0x46

                                                LSB  MSB
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x02 0x77 0x32                0x97 0x13 0x22 0x8D
   0x00 0x0A 0x77 0x32                0x97 0x13 0x6A 0x01
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x08 0x00 0x00                0x00 0x00 0x48 0x8C

                                                LSB  MSB
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x02 0x77 0x32                0x97 0x13 0x22 0x8D
   0x00 0x12 0x77 0x32                0x97 0x13 0xA3 0x9D
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x10 0x00 0x00                0x00 0x00 0x81 0x10

                                                LSB  MSB
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x02 0x77 0x32                0x97 0x13 0x22 0x8D
   0x00 0x22 0x77 0x32                0x97 0x13 0x20 0xAC
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x20 0x00 0x00                0x00 0x00 0x02 0x21

                                                LSB  MSB
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x02 0x77 0x32                0x97 0x13 0x22 0x8D
   0x00 0x42 0x77 0x32                0x97 0x13 0x26 0xCF
   ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
   0x00 0x40 0x00 0x00                0x00 0x00 0x04 0x42

然后我对 CRC 词进行了相同的分析,并得出了与以前相同的多项式:0x8408 或当向另一个方向移动时,0x1021


Byte    CRC (with byte swap to MSB-LSB order)
-----   ----
0x01    1189
0x02    2312    LSB of CRC = 0
0x04    4624    LSB of CRC = 0
0x08    8C48    LSB of CRC = 0
0x10    1081    LSB of CRC = 1
0x20    2102    LSB of CRC = 0
0x40    4204    LSB of CRC = 0


Byte    CRC shift   xor Previous CRC
-----   ----    ----    ----    ----
0x01    1189
0x02    2312    1189    0000    1189
0x04    4624    2312    0000    2312
0x08    8C48    4624    0000    4624
0x10    1081    0840    8408    8C48    
0x20    2102    1081    0000    1081
0x40    4204    2102    0000    2102

以下是带有此多边形的所有 RockSoft CRC 模型,我需要考虑一下 Kermit:


width=16  poly=0x1021  init=0x0000  refin=false  refout=false  xorout=0x0000  check=0x31c3  name="XMODEM"
width=16  poly=0x1021  init=0x0000  refin=true  refout=true  xorout=0x0000  check=0x2189  name="KERMIT"
width=16  poly=0x1021  init=0x1d0f  refin=false  refout=false  xorout=0x0000  check=0xe5cc  name="CRC-16/AUG-CCITT"
width=16  poly=0x1021  init=0x89ec  refin=true  refout=true  xorout=0x0000  check=0x26b1  name="CRC-16/TMS37157"
width=16  poly=0x1021  init=0xb2aa  refin=true  refout=true  xorout=0x0000  check=0x63d0  name="CRC-16/RIELLO"
width=16  poly=0x1021  init=0xc6c6  refin=true  refout=true  xorout=0x0000  check=0xbf05  name="CRC-A"
width=16  poly=0x1021  init=0xffff  refin=false  refout=false  xorout=0x0000  check=0x29b1  name="CRC-16/CCITT-FALSE"
width=16  poly=0x1021  init=0xffff  refin=false  refout=false  xorout=0xffff  check=0xd64e  name="CRC-16/GENIBUS"
width=16  poly=0x1021  init=0xffff  refin=true  refout=true  xorout=0x0000  check=0x6f91  name="CRC-16/MCRF4XX"
width=16  poly=0x1021  init=0xffff  refin=true  refout=true  xorout=0xffff  check=0x906e  name="X-25"

我注意到这组最新消息的某些内容。如果我只使用第一个字节而忽略其他 0x00 字节,则不需要这两个额外的字节来获得差异消息的正确 CRC。在消息 D01a 上使用 RevEng:

D:>reveng -s -w 16 018911 width=16 poly=0x1021 init=0x0000 refin=true refout=true xorout=0x0000 check=0x2189 name="KERMIT"

然后我意识到如果我以相反的字节顺序将消息输入 CRC 生成器,我的原始 D01 消息会生成正确的 CRC。

D:>reveng -c -m kermit 01000000 bb1c

所以这些我认为是额外字节的字节实际上只是消息的字节,但消息将以相反的字节顺序进行处理。

这是真的吗?

我拿了 M02a 和 M03a,并以相反的字节顺序将它们送入 RevEng:

D:>reveng -s -w 16 1397327702228d width=16 poly=0x1021 init=0xffff refin=true refout=true xorout=0x0000 check=0x6f91 name="CRC-16/MCRF4XX"

D:>reveng -s -w 16 1397327703ab9c width=16 poly=0x1021 init=0xffff refin=true refout=true xorout=0x0000 check=0x6f91 name="CRC-16/MCRF4XX"

令我惊讶的是,init 全是 init 并且算法具有与我之前发现的相同的多边形。该算法来自 MCRF4xx 通信(现在我认为这是有道理的,因为我正在跟踪的 RS-232 线路取代了 RF 连接)。

MCRF4xx 是一种 RFID 协议。

该消息被视为一组长位,因此最先处理最后一个字节,最后处理第一个字节。不使用消息开头的 0x00 字节。init = 0xffff 时,MCRF4xx 算法将检测额外或丢失的前导零。

我在几十条消息上尝试了这个算法,每次都能得到正确的 CRC。

这是我在http://www.snip2code.com/Snippet/86260/Simple-CRC-16-MCRF4XX-C-implementation- 上找到的一段代码


    #include 
    #include 

    uint16_t crc16_mcrf4xx(uint16_t crc, uint8_t *data, size_t len)
    {
    if (!data || len > 1) ^ 0x8408;
            else crc = (crc >> 1);
            }
        }
    return crc;
    }

RevEng 站点上的一个网页指向一些关于 MCRF4xx 的文档:http: //reveng.sourceforge.net/crc-catalogue/16.htm

感谢所有以我的方式传递正能量的人。

我在 2004 年编写了自己的 CRC 暴力破解程序,但它非常专门针对特定问题。https://github.com/sitsec/bruteforce-crc 上有一个更好的通用开源软件

您应该能够收集一些不同的传输数据包样本并通过该程序提供它们。对于 16 位 CRC,它相当快。我还没有尝试过更长的 CRC。