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

Fab*_*abi 8 c# reverse-engineering

我有一些旧的LED板,你可以发送一些文本并将其挂在某处...它是在1994/95制造的,它通过串行端口进行通信,使用16位MS-DOS应用程序,你可以在其中输入一些文字.

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

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

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

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

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

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

一些例子:

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

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

这是一个显示"123"的完整143字节字符串的示例,仅用于为您提供更好的方向:

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
Run Code Online (Sandbox Code Playgroud)

(文本信息从第2行的第2个字节开始" 31 00 32 00 33 00(...)"

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

Gar*_*han 6

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

观察:

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

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

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

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

  • 找到所有位为0的输入的校验和.将其命名为a.
  • 对于每个比特位置k,找到输入的校验和,除了比特k为1 之外,其所有比特都是0.将其称为 XOR b(k).
  • 现在任意输入的校验和是每个b(k) XOR ,其中在输入中设置位k.

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

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