我该如何扭转这种看似简单的算法?

时间:2016-03-22 14:52:33

标签: c# reverse-engineering

我有一些旧的LED板,你要发送一些文字并把它挂在某个地方......它是在1994/95制造的,它通过串口与16位MS-DOS进行通信您可以在其中输入某些文字的应用程序。

所以,因为你可能无法在任何地方运行它,除非使用DOSBox或类似的技巧,我决定用C#重写它。

在对原始dos-exe进行端口监控之后,我发现它对你重建它真的不感兴趣 - 请求必须回答合适,不同的字节,预先发送" ping&# 34;消息等...

也许你知道类似我的dos-exe使用的校验和例程/模式,或者你可以提供任何关于尝试对此进行逆向工程的提示......另外,因为我只熟悉编程并且没有花费在反转方法和/或分析协议上花了很多时间,请不要判断我这个主题是否有点愚蠢 - 我会对任何帮助感到高兴...

真正包含应该显示的文本的消息是 143字节长(只是那么长,因为如果你不用你的文字占用所有空间,它就会填充填充字节),在那个消息中,我注意到以下模式:

  • 第四个字节(仍属于msg标头)与6或7个重复值的列表不同(在我的示例中,该字节始终为0F)。

  • 最后两个字节用作校验和

一些例子

  • 显示文字:" 123" (十六进制:" 31 32 33"),校验和十六进制:" 45 52"
  • text:" 132" (" 31 33 32"),校验和十六进制:" 55 FF"
  • text:" 122" (" 31 32 32"),校验和十六进制:" 95 F4"
  • text:" 133" (" 31 33 33"),校验和十六进制:" 85 59"
  • text:" 112" (" 31 31 32"),校验和十六进制:" C5 C8"
  • text:" 124" (" 31 32 34"),校验和十六进制:" 56 62"
  • text:" 134" (" 31 33 34"),校验和十六进制:" 96 69"
  • text:" 211" (" 32 31 31"),校验和十六进制:" 5D 63"
  • text:" 212" (" 32 31 32"),校验和十六进制:" 3C A8"
  • text:{empty},校验和十六进制:" DB BA"
  • text:" 1" (" 31"),校验和十六进制:" AE 5F"

到目前为止,我完全确定校验和确实依赖于标题中的第四个字节,因为如果它发生变化,则校验和将完全不同,以便显示相同的文本。

这是一个完整的143字节字符串显示" 123"的示例,只是为了给您一个更好的方向:

02 86 04 0F 05 03 01 03 01 03 01 03 00 01 03 00   ...............
00 31 00 32 00 33 00 20 00 20 00 20 00 20 00 20   .1.2.3. . . . . 
00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20   . . . . . . . . 
00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20   . . . . . . . . 
00 20 00 20 00 20 00 20 00 20 00 FE 03 01 03 01   . . . . . .þ....
04 01 03 00 01 03 00 00 20 00 20 00 20 00 20 00   ........ . . . .
20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00    . . . . . . . .
20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00    . . . . . . . .
20 00 20 00 20 00 20 00 20 00 20 00 20 45 52

(文字信息以第2行的第2个字符开头" 31 00 32 00 33 00(...) "

不幸的是,在整个网络上,没有用户手册,文档,甚至没有这个信息板设备曾经存在的真实证据。

1 个答案:

答案 0 :(得分:6)

我会为你在用字符串s喂食时得到的校验和写出F(s)。

观察:

  • F(“122”)xor F(“123”)= 95 F4 xor 45 52 = D0 A6
  • F(“132”)xor F(“133”)= 55 FF xor 85 59 = D0 A6
  • F(“123”)xor F(“124”)= 45 52 xor 56 62 = 13 30
  • F(“133”)xor F(“134”)= 85 59 xor 96 69 = 13 30

所有这些都与具有以下属性的校验和一致,校验和不经常出现:更改输入中的给定位总是将输出与同一事物进行异或

我预测,例如,F(“210”)= F(“211”)x或D0 A6 = 8D C5,类似地,F(“222”)= 3C A8 xor C5 C8 xor 95 F4 = 6C 94

如果这是真的,那么下面给出了一个粗暴的方法来计算一般的校验和,前提是你有一个黑盒子为你计算校验和(显然你有):

  • 找到所有位为0的输入的校验和。请将此 a
  • 对于每个位位置 k ,找到输入的校验和,除了位 k 之外,其所有位都为0.除此之外,请调用 a < / em> XOR b k )。
  • 现在任意输入的校验和是 a XOR,每个 b k ),其中位 k 是在输入中设置。

通常 b k )彼此密切相关 - 通常的模式是你将位提供给移位寄存器 - 所以鉴于对算法的理解,上面比你需要的更强大。但是如果你能够以任意选择的位模式作为输入,我希望它有效。

如果没有,您仍然可以这样做。例如,假设您实际选择的是29个7位ASCII字符值,位于输入的17,19,... 73位置。然后你可以首先进入所有空间(0x20),然后在0..6位置依次对1位进行异或。这不会给你所有的 b k ),但它会为你提供足够的任意29-ASCII字符输入。