5

我有一组受 16 位校验和保护的数据,我需要更正这些数据。校验和位置是已知的,计算它们的确切区域以及用于计算它们的确切算法是未知的。16 位,LSB 在前。我怀疑它是某种 16 位 CRC,但我无法找到实际计算校验和的代码。

例子:

00    4E00FFFF26EC14091E00A01830393630  
10    30313131313030393030363030313030  
20    30303131313030393030363030313030  
30    30303131313030393030363030313030  
40    3030FFFF225E363436304D313037**0CE0**  
50    64000000000000008080808080800000  
60    00000000**BE6E**FC01E001EB0013010500  

校验和存储在 4E 和 64 处。我不知道它们是从每个数据段开头的第一个字的偏移量开始计算的,还是之后开始计算的,还是从整个范围开始计算的。我尝试了许多常见的 CRC 算法和多项式,但都没有成功。此应用程序没有可用的参考资料或规范。

为了比较,这里是另一个具有不同 CRC 的数据部分。

00    4E00FFFF26C014091600A01030393132  
10    30313131313030393030313230313030  
20    30303131313030393030313230313030  
30    30303131313030393030313230313030  
40    3030FFFF225E343231324F313044**8348**  
50    64000000000000008080808080800000  
60    00000000**72F8**E001EB00130105000E01  

我的问题是,任何人都可以识别算法吗?有什么方法可以从数据和 CRC 计算 CRC 多项式和其他因素?

谢谢!

编辑:

在我的反汇编中搜索常见的 CRC16 多项式 0xA001 发现了这个函数:

34F86 ; =============== S U B R O U T I N E =======================================
34F86
34F86
34F86 Possible_Checksum:                    ; CODE XREF: MEM_EXT_4:00034FEEP
34F86                                         ; MEM_EXT_4:0003503AP ...
34F86                 mov     [-r0], r9       ; Move Word
34F88                 mov     r4, r12         ; Move Word
34F8A                 mov     r5, r13         ; Move Word
34F8C                 shr     r4, #14         ; Shift Right
34F8E                 shl     r5, #2          ; Shift Left
34F90                 or      r5, r4          ; Logical OR
34F92                 mov     r4, r12         ; Move Word
34F94                 mov     DPP0, r5        ; Move Word
34F98                 and     r4, #3FFFh      ; Logical AND
34F9C                 movb    rl3, [r4]       ; Move Byte
34F9E                 mov     DPP0, #4        ; Move Word
34FA2                 movbz   r9, rl3         ; Move Byte Zero Extend
34FA4                 mov     r15, #0         ; Move Word
34FA6
34FA6 loc_34FA6:                              ; CODE XREF: MEM_EXT_4:00034FC8j
34FA6                 mov     r4, [r14]       ; Move Word
34FA8                 xor     r4, r9          ; Logical Exclusive OR
34FAA                 and     r4, #1          ; Logical AND
34FAC                 jmpr    cc_Z, loc_34FBA ; Relative Conditional Jump
34FAE                 mov     r4, [r14]       ; Move Word
34FB0                 shr     r4, #1          ; Shift Right
34FB2                 xor     r4, #0A001h     ; Logical Exclusive OR
34FB6                 mov     [r14], r4       ; Move Word
34FB8                 jmpr    cc_UC, loc_34FC0 ; Relative Conditional Jump
34FBA ; ---------------------------------------------------------------------------
34FBA
34FBA loc_34FBA:                              ; CODE XREF: MEM_EXT_4:00034FACj
34FBA                 mov     r4, [r14]       ; Move Word
34FBC                 shr     r4, #1          ; Shift Right
34FBE                 mov     [r14], r4       ; Move Word
34FC0
34FC0 loc_34FC0:                       
4

2 回答 2

3

您从 loc_34FA6 向下发布的代码基本上如下:

unsigned short
crc16_update(unsigned short crc, unsigned char nextByte)
{
    crc ^= nextByte;

    for (int i = 0; i < 8; ++i) {
        if (crc & 1)
            crc = (crc >> 1) ^ 0xA001;
        else
            crc = (crc >> 1);
    }

    return crc;
}

这是一个具有 0xA001 多项式的 CRC-16。一旦找出适用 CRC-16 的数据范围,将 CRC 初始化为 0xFFFF 并为序列中的每个字节调用此函数。存储返回值并在下次通过时将其传回。最后返回的值是您的最终 CRC。

我不知道序言在做什么......

于 2008-12-30T21:46:03.860 回答
1

更一般地说,CRC 的部分概念是,当您计算某个数据文件的 CRC,然后在最后附加 CRC 时,您会得到一个文件,其 CRC 是取决于文件长度的某个值,但是不是它的内容。(对于某些 CRC 算法,它甚至不依赖于文件长度。)

因此,如果您怀疑您尝试逆向工程的应用程序正在使用 CRC16,并且您有一个计算 CRC16 的程序,并且您有多个相同长度的样本,只需计算这些数据文件的 CRC16(其中包括校验和)。如果每次都返回相同的校验和数据(对于相同长度的文件),那么它们必须包含使用相同宽度和多项式的 CRC 校验和。

例如,我曾经不得不对一些文件进行逆向工程,开发人员认为他很聪明,通过更改两个常量来更改 CRC32 算法。我不必找到验证校验和的目标代码,将其反汇编,然后费力地弄清楚。这个简单的测试成功了。

于 2009-01-07T19:23:22.137 回答