Wie würde ich diesen einfach aussehenden Algorithmus umkehren?

8

Ich habe eine alte LED-Platine bekommen, an die Sie etwas Text senden und irgendwo aufhängen ... es wurde 1994/95 hergestellt und kommuniziert über eine serielle Schnittstelle mit einer 16-Bit-MS-DOS-Anwendung in was Sie in etwas Text eingeben können.

Also, weil Sie es wahrscheinlich nirgends außer mit DOSBox oder ähnlichen Tricks ausführen konnten, entschied ich mich, es in C # umzuschreiben.

Nach Port-Überwachung der ursprünglichen DOS-exe habe ich festgestellt, dass es wirklich nicht daran interessiert ist, es neu aufzubauen - Anfragen müssen passender beantwortet werden, variierende Bytes, vorher gesendete "ping" Nachrichten, etc ...

Vielleicht kennst du eine ähnliche Prüfsummenroutine / Muster, wie meine Dos-exe verwendet, oder du könntest irgendwelche Tipps geben, um das zu rekonstruieren ... Außerdem, weil ich nur mit der Programmierung vertraut bin und nicht viel Zeit verbringe über Umkehrmethoden und / oder Analyseprotokolle, verurteile mich bitte nicht, wenn dieses Thema eine dumme Idee ist - ich werde mich über jede Hilfe freuen, die ich bekomme ...

Die Nachricht, die wirklich den Text enthält, der angezeigt werden soll, ist 143 Byte lang (nur so lang, weil Füllbytes eingefügt werden, wenn Sie nicht den ganzen Platz mit Ihrem Text verbrauchen) und dass msg ich habe die folgenden Muster bemerkt:

  • Das vierte Byte (das immer noch zum msg-Header gehört) variiert von einer Liste von 6 oder 7 sich wiederholenden Werten (in meinen Beispielen ist dieses Byte immer 0F).

  • Die beiden letzten Bytes funktionieren als Prüfsumme

Einige Beispiele :

  • angezeigter Text: "123" (hex: "31 32 33"), Prüfsumme hex: "45 52"
  • text: "132" ("31 33 32"), Prüfsumme hex: "55 FF"
  • text: "122" ("31 32 32"), Prüfsumme hex: "95 F4"
  • text: "133" ("31 33 33"), Prüfsumme hex: "85 59"
  • text: "112" ("31 31 32"), Prüfsumme hex: "C5 C8"
  • text: "124" ("31 32 34"), Prüfsumme hex: "56 62"
  • text: "134" ("31 33 34"), Prüfsumme hex: "96 69"
  • text: "211" ("32 31 31"), Prüfsumme hex: "5D 63"
  • text: "212" ("32 31 32"), Prüfsumme hex: "3C A8"
  • text: {empty}, Prüfsumme hex: "DB BA"
  • text: "1" ("31"), Prüfsumme hex: "AE 5F"

Bisher bin ich mir absolut sicher, dass die Prüfsumme wirklich von diesem vierten Byte in der Kopfzeile abhängt, denn wenn sich die Prüfsumme ändert, werden die Prüfsummen für den gleichen anzuzeigenden Text völlig anders sein.

Hier ist ein Beispiel für eine vollständige 143-Byte-Zeichenfolge, die "123" anzeigt, nur um Ihnen eine bessere Orientierung zu geben:

%Vor%

(die Textinformation beginnt mit dem 2. Byte in der 2. Zeile) 31 00 32 00 33 00 (...)

Leider gibt es im ganzen Web keine Benutzerhandbücher, Dokumentationen, nicht einmal einen wirklichen Beweis dafür, dass dieses Informationstafel-Gerät jemals existiert hat.

    
Fabi 22.03.2016, 14:52
quelle

1 Antwort

6

Ich schreibe F (s) für die Prüfsumme, die man erhält, wenn man String s eingibt.

Beachten Sie Folgendes:

  • 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

all dies stimmt mit der Prüfsumme überein, die die folgende Eigenschaft hat, die Prüfsummen nicht selten haben: das Ändern eines gegebenen Bits in der Eingabe XOR immer die Ausgabe mit der gleichen Sache .

Ich sage z. B. voraus, dass F ("210") = F ("211") x oder D0 A6 = 8D C5 und ähnlich F ("222") = 3C A8 x oder C5 C8 x oder 95 F4 = 6C 94 .

Wenn dies zutrifft, gibt Ihnen das Folgende einen brute-force-y-Weg, um die Prüfsumme im Allgemeinen herauszufinden, vorausgesetzt, Sie haben eine Blackbox, die Prüfsummen für Sie berechnet (was Sie anscheinend haben):

  • Ermitteln Sie die Prüfsumme einer Eingabe, deren Bits alle 0 sind. Rufen Sie dies a .
  • auf
  • Suchen Sie für jede Bitposition k die Prüfsumme eines Eingangs, dessen Bits 0 sind, mit Ausnahme von Bit k , das 1. Rufen Sie a XOR b ( k ).
  • Nun ist die Prüfsumme einer beliebigen Eingabe a XOR b ( k ), wobei Bit k ist in der Eingabe festgelegt.

Normalerweise ist b ( k ) eng miteinander verwandt - das übliche Muster ist, dass Sie Bits in ein Schieberegister einspeisen - also das oben ist mehr Brute-Force-y, als Sie angesichts des Verständnisses des Algorithmus benötigen würden. Aber ich erwarte, dass es funktioniert, wenn Sie willkürlich ausgewählte Bitmuster als Eingabe einspeisen können.

Wenn nicht, können Sie es möglicherweise noch tun. Z. B. angenommen, dass alles, was Sie tatsächlich wählen können, 29 7-Bit-ASCII-Zeichenwerte an den Positionen 17, 19, ... 73 Ihrer Eingabe ist. Dann können Sie zunächst alle Leerzeichen (0x20) und dann XOR nacheinander mit 1 Bit an den Positionen 0..6 einspeisen. Das gibt Ihnen nicht alle b ( k ), aber es gibt Ihnen genug für beliebige 29-ASCII-Zeichen-Eingaben.

    
Gareth McCaughan 22.03.2016, 18:32
quelle

Tags und Links