反转固件中的Engineering CRC 32

时间:2019-05-28 11:31:26

标签: reverse-engineering crc crc32

我有一个p闪存(大小约为700kb),在该闪存中有一个CRC32。我知道它在哪里,而且我知道CRC计算方法(多项式,初始值,最终Xor值,反映的输入和输出),问题在于这些700kb的一部分仅用于计算crc。而且我不知道哪一部分。有没有办法找出要计算的输入数据? 我有5个700kb的文件。除了4个字节不同和crc的4个字节外,文件都是相同的。

1 个答案:

答案 0 :(得分:0)

如果您可以将文件保存到PC上,那将会有所帮助。您可以对两个文件中的任何两个进行异或运算,以得到一个全零的文件,但CRC的4个不同字节和4个字节除外。两个文件的异或也将消除任何初始值或最终异或值,就像初始值= 0和最终异或值= 0一样。然后检查几乎全为零的文件,以查看CRC是否符合您的期望。如果匹配,那么您将知道CRC包括4个非零字节以及其后的所有零字节,但是您不知道CRC在其计算中包括的4个非零字节之前还有多远,但是这至少是一个开始。如果匹配,则将减少搜索CRC计算中包含的内容的次数。

假设用于CRC的部分是连续的,则可以使用快速CRC32进行蛮力搜索。在具有SSE2(xmm)寄存器的X86上,基于程序集的CRC32可以在第三代Intel 3770K 3.5GHz处理器(现在速度更快)上大约0.0002秒内计算700,000字节的CRC32。尝试从8到700,000字节的长度。

我使用CRC32和CRC32C多项式将代码从此github示例转换为Visual Studio asm,以实现反射和非反射CRC,并且可以上传代码。

https://github.com/intel/isa-l/blob/master/crc/crc16_t10dif_01.asm