我有一台正在使用的设备,没有有关其校验和计算的文档。我知道每个消息中的最后一个字节是校验和,并且发送到设备的大多数消息都需要正确的校验和。我真的无法解决这个问题。

我有一些消息(来自设备),其中只有一个字节发生了变化,从而更容易找到模式。

每个消息中的最后一个字节是校验和。

这些消息中的倒数第二个字节递增:



00h 5Ch A2h 00h 04h D2h 38h
00h 5Ch A2h 00h 04h 57h BDh
00h 5Ch A2h 00h 08h AEh 1Ch
00h 5Ch A2h 00h 00h 01h 7Fh
00h 5Ch A2h 00h 00h 02h 80h
00h 5Ch A2h 00h 00h 03h 81h
00h 5Ch A2h 00h 00h 04h 82h
00h 5Ch A2h 00h 27h 0Fh BCh


我希望外面有人可以提供帮助,这对我来说确实是个好选择。 >
00h 5Ch A2h 00h 00h 01h 7Fh
00h 5Ch A2h 01h 00h 01h 63h
00h 5Ch A2h 02h 00h 01h 67h
00h 5Ch A2h 03h 00h 01h 6Bh 
00h 5Ch A2h 04h 00h 01h 6Fh


同一消息的另一个示例,后3个字节为00h:

00h 5Ch A2h 01h 01h 01h 65h
00h 5Ch A2h 01h 01h 02h 66h
00h 5Ch A2h 01h 01h 03h 67h
00h 5Ch A2h 01h 01h 04h 68h

00h 5Ch A2h 01h 01h 01h 65h
00h 5Ch A2h 01h 01h 02h 66h
00h 5Ch A2h 01h 01h 03h 67h
00h 5Ch A2h 01h 01h 04h 68h
00h 5Ch A2h 02h 01h 01h 69h
00h 5Ch A2h 02h 01h 02h 6Ah
00h 5Ch A2h 02h 01h 03h 6Bh


第二次编辑-已添加一个Pastebin链接到大量其他样本,所有样本都具有相同的消息类型

它是不同的消息,但是样本很多:
很多Pastebin中的示例消息集

评论

您还有更多样品吗?

嘿@cimarron我刚刚添加了更多示例。

该表达式适用于除一个样本外的所有样本:0x7e + d [5] + 2 * d [4] + 4 * d [3]-(d [3] + d [4] == 0?0:0x20)(d [0..5]是数据)。如果可以获得更多像失败的样本那样的样本,或者可以改变前三个字节的样本,则可以进一步完善它。

@hemflit,有趣,感谢您的宝贵时间!我正在看它,稍后我将发布更多其他示例的消息。

#1 楼

关键是要获得一百万吨的样品,以便进行分析。如果您可以将样本粘贴到可以交互查询的数据库表或字典中,这确实有帮助。从某种脚本外壳。 Python应该可以很好地工作,但是我没有太多经验,因为最近二十年来我一直在使用Visual FoxPro进行交互式拼写。

一旦您准备好查询样本,就可以测试各种简单的假设并通过找到反例来反驳它们。例如,以下样本似乎表明第四字节的差异导致校验和的四倍差异:

当前的“工作”列和校验和,以研究工作列中的更改对校验和的影响。例如,鉴于上述输入,我们可以记下4 * b[3]作为第四个字节的初步术语,然后在样本数据库中查询反例,以防它不起作用。也就是说,您选择仅在第四个字节和校验和不同的样本对,并计算

00h 5Ch A2h 00h 00h 01h 7Fh
00h 5Ch A2h 01h 00h 01h 63h
00h 5Ch A2h 02h 00h 01h 67h
00h 5Ch A2h 03h 00h 01h 6Bh 
00h 5Ch A2h 04h 00h 01h 6Fh


的成功和失败次数,就是这样,无论如何。很明显,delta(checksum) mod 256之类的东西实际上取决于您的脚本外壳。使用VFP,它将是

delta(checksum) mod 256 == 4 * delta(byte[3]) mod 256.


上面测试的完整表达式会很长,因此您通常只编写一些辅助函数。使用名为byte_delta()的帮助程序将其结果归一化为[0,255]范围,您可能会遇到以下问题:

此查询(请参见上面的第一个样本和第二个样本之间的差异,即E4而不是4)。通常,您会首先选择一些差异,以便对事物有所了解。 “差异”可能是算术差异,按位异或。

这就是为什么需要交互式外壳(如Python或VFP)的原因;在编译语言的edit-compile-run周期中,这将非常麻烦。我已经给出了VFP示例,因为具有数据库支持的脚本语言可以使事情变得更加简单。结果。我已经使用这种方法从不同数量的样本中确定了德国医疗保险号码中使用的所有校验数字方案,这些方案大多是无证的(或至少在当时是这样)。当然,在那种情况下,我的优势是已知方案的基本类型-加权数字和-并且样本已经驻留在数据库表中...

正在讨论的情况因为基本方案尚不清楚,所以难度更大。这就是为什么查看位模式以使事物感觉很重要的原因。例如,冒泡进位表示加法函数。在主题“反转简单消息+校验和对(32字节)”中对此进行了详细说明,该示例还显示了一些更改模式示例。

PS:除了尝试梳理校验和差异以进行特定的更改外,位或字节,将样本填充到某种可查询的表/字典/地图中后,还有许多其他事情可以完成。第一件事通常是使用现有的标准功能(例如,直字节总和,直字节异或,各种CRC等)运行一系列测试,以观察校验和的差异(算术和异或)。如链接的文章中所示,将结果显示为位模式通常有助于辨别十六进制或十进制格式不太明显的规则。

更新当前样本太相似(前三个字节没有差异),并且样本太少,无法快速丢弃假设。换句话说,有太多潜在函数无法满足现有数据的需求。例如,以下简单的Fox函数可以正确预测原始少数样本的校验和,在少数情况下,其偏移为0x20:素数到8)与每个字节的位计数重叠,从而在第四个字节和校验和之间产生两个位的距离。旋转5可以做到这一点。但是,还有许多其他可能性...这就是为什么我们需要更多的样本。 ;-)

对PasteBin上的样本进行分析后发现,校验和之前最后一个字节位置的差异始终等于校验和中的差异。这意味着可以从样本库中删除最后一个字节及其对校验和的影响。这增加了仅在一个字节位置上不同的样本数量,这意味着有更多的低挂水果可用于分析...

样本

mod(256 + asc(substr(right, 7, 1)) - asc(substr(left, 7, 1)), 256)


全部映射到新样本(点表示删除的字节,仅出于此处的说明):
select le.sample as left, ri.sample as right ;
   from all_samples le, all_samples ri ;
   where stuff(left(ri.sample, 6), 4, 1, "") == stuff(left(le.sample, 6), 4, 1, "") ;
      and le.sample <> ri.sample ;
   into cursor byte_3_pairs

select byte_delta(right, left, 7) == mod(4 * byte_delta(right, left, 4), 256) as ok, count(*) ;
   from byte_3_pairs ;
   group by 1


缩短的样本库立即显示出“ 2的幂”规则不起作用的情况(此处的最后一个字节本来是倒数第二个): />

评论


嘿@DarthGizka,首先,我想说的是,我感谢您的详细回答。您是否成功使用上述方法对校验和进行了工程设计?我想我明天会尝试使用您的方法-我擅长Python,所以那时可能是我的选择。我想我还需要更多长度不同的样本。我将问题再待几天,但是如果明天以后我得到正确的校验和,我会接受您的回答-再次感谢!

– Jesper R
16年1月21日在19:50



@Jesper:我很想自己对此加以破解,但不幸的是,我现在必须利用业余时间对大量臭味累累的旧代码进行反向工程(VFP;它太糟糕了,编译后更容易理解并反编译目标代码)。但是,如果您遇到困难,并且明天某种程度上会出现指向PasteBin这样的地方的大量胖链接,那么我敢肯定,我-还有很多其他人-将无法抵抗。 ;-)此外,如果Python专家可以加入有用的提示,那就太好了...

– DarthGizka
16年1月21日在20:53



这听起来很酷,或者不是:) ..我还没有使用过VFP,实际上我以前从未听说过它。我现在想解决这个问题,但是稍后我会按照您的建议在PasteBin上发布指向一堆示例的链接。非常感谢您的投入!随时问我Python的问题,我会尽力回答。虽然我没有使用Python进行逆向工程的经验。

– Jesper R
16 Jan 22'9:01



我编辑了问题,现在按照您的建议包括一个Pastebin链接,其中包含一长串示例。这是一条不同的消息。我认为可以省略消息开头的00,但是请记住,它可能位于Pastebin中提供的示例之前

– Jesper R
16 Jan 22 '11:49



谢谢,那已经好多了!这证实了-在大多数情况下-某个字节位置上的差异等于与到末尾距离相对应的2的幂,这表明左移一位的总和(如示例Fox所示)功能在我的文章中)。现在重要的是找出细节,这需要挖掘样本以获取差值不等于2的期望乘方对的样本(我的示例或hemflit公式的著名0x20差)。开采金粉需要大量矿石... ;-)

– DarthGizka
16年1月22日在13:29

#2 楼

我想知道您在校验和解码方面是否取得了更多进展。我有一个非常相似的问题,我认为您的方法也可能适用于我的情况。这些是我想弄清楚在早期开发中长期丢失的校验和方法的数据:

00 8a 51 0b a0 b8 a1
00 8a 51 0b a1 b8 a3
00 8a 51 0b a2 b8 23
00 8a 51 0b a3 b8 25
00 8a 51 0b a4 b8 a3
00 8a 51 0b a5 b8 a5
00 8a 51 0b a6 b8 25
00 8a 51 0b a7 b8 27

如果您可以就您的进步进行更多讨论,这可能有助于解决这一问题,我们将不胜感激。另外,我发现我可以交换半字节,并且它也具有相同的校验和。谢谢你。

评论


抱歉,数据全部弄乱了:[00 8a 51 0b a0 b8 a1] [00 8a 51 0b a1 b8 a3] [00 8a 51 0b a2 b8 23] [00 8a 51 0b a3 b8 25] [00 8a 51 0b a4 b8 a3] [00 8a 51 0b a5 b8 a5] [00 8a 51 0b a6 b8 25] [00 8a 51 0b a7 b8 27]通常,第5个字节的位差会影响校验和的最后一个字节。

–user14656
16年2月11日,0:09