从已知值确定校验和算法

逆向工程 记忆
2021-07-10 08:28:22

我一直在分析一些SPI EEPROM存储器,并试图找出使用了哪种校验和算法;

例如我有数据:14567D9h 和校验和 187h。假设它是正常的 16 位校验和,我有 86h - 不匹配,但在添加 101h 后它神奇地变为 391h

另一个例子:8ADh 和校验和 B5h 与这个是正常的 - 16 位校验和结果与精确数字:B5h(完美匹配)

我已经用我能够拦截的 28 个样本进行了检查。对于某些值,我必须将 101h 添加到校验和,而对于某些值,只需将其求和即可。

奇偶校验不合适——如果你愿意,我可以分享更多数据——所有数据都收集在一个 Excel 文件中,并进行计算。经过几天的头脑风暴与我的朋友我们还没有想出任何东西:/

也许算法中有一些额外的部分,我还没有发现?检查了 CRC 和大量其他算法 - 只有 16 位校验和给出了任何有希望的结果 提前感谢您的帮助!

我的电子表格的副本:电子表格

我抓取的一些数据(更多在电子表格中):

F401 84290145h
B500 08AD0000h
D400 5D310145h
4000 79810145h
B500 08AD0000h
C100 0AB70000h
C100 0AB70000h
3401 F08500BEh
E901 FE2C00BEh
A400 01E400BFh
2A01 0D5D00BFh
7E00 208304D7h
C100 0AB70000h

您可以这样读取:校验和:01F4(始终为 2 个字节)值:01458429(始终为 4 个字节)

如您所见,您必须切换字节的位置才能正确读取数据

1个回答

我是通过手动检查发现的。

而不是像这样处理数据:

struct record {
  uint16_t csum;  // 01f4
  uint32_t data; // 84290145h
};

像这样对待它:

struct record {
  uint8_t csum;    // 0xf4
  uint8_t data[5]; // { 0x01, 0x84, 0x29, 0x01, 0x45 }
};

要计算校验和,只需对数据字节进行简单的模 256 求和。这适用于您在问题中包含的值。