我有一组受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:
答案 0 :(得分: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。
我不确定序幕在做什么......
答案 1 :(得分:1)
更一般地说,CRC的概念的一部分是当你计算某些数据文件的CRC,然后在最后追加CRC时,你会得到一个文件,其中CRC的某个值取决于它的长度。文件,但不是它的内容。 (对于某些CRC算法,它甚至不依赖于文件长度。)
所以,如果你怀疑你试图逆向工程的应用程序正在使用说CRC16,并且你有一个计算CRC16的程序,并且你有多个相同长度的样本,那么只需计算这些数据文件的CRC16 (包括校验和)。如果每次都返回相同的校验和数据(对于相同长度的文件),则它们必须包含使用相同宽度和多项式的CRC校验和。
例如,我曾经不得不通过更改两个常量来改变CRC32算法,从而对开发人员认为他很聪明的一些文件进行逆向工程。我没有必要找到验证校验和的目标代码,反汇编它然后用艰难的方式弄清楚它。这个简单的测试就是它。