首页 > 解决方案 > 固件中的逆向工程 CRC 32

问题描述

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

标签: reverse-engineeringcrccrc32

解决方案


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

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

我使用 CRC32 和 CRC32C 多项式将代码从这个 github 示例转换为 Visual Studio asm,用于反射和非反射 CRC,如果有兴趣,我可以上传代码。

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


推荐阅读