Frage:
Ich hatte wirklich Mühe, es herauszufinden. Kann mir jetzt jemand helfen, diese Prüfsumme zurückzuentwickeln?
Jesper R
2016-01-20 18:40:03 UTC
view on stackexchange narkive permalink

Ich habe ein Gerät in Arbeit, für das keine Dokumentation zur Prüfsummenberechnung vorliegt. Ich weiß, dass das letzte Byte in jeder Nachricht die Prüfsumme ist und die meisten Nachrichten an das Gerät eine korrekte Prüfsumme erfordern.

Ich dachte, es sei einfach herauszufinden, wahrscheinlich etwas CRC oder so, aber ich Ich kann das wirklich nicht herausfinden.

Ich habe einige Nachrichten (vom Gerät), bei denen sich nur eines der Bytes ändert, um das Auffinden eines Musters zu erleichtern.

Das letzte Byte In jeder Nachricht befindet sich die Prüfsumme.

Das vorletzte Byte erhöht sich in diesen Nachrichten:

  00h 5Ch A2h 00h 04h D2h 38h00h 5Ch A2h 00h 04h 57h BDh00h 5Ch A2h 00h 08h AEh 1Ch00h 5Ch A2h 00h 00h 01h 7Fh00h 5Ch A2h 00h 00h 02h 80h00h 5Ch A2h 00h 00h 03h 81h00h 5Ch A2h 00h 00h 04h 82h00h 5Ch A2h 00h 27h 0Fh BCh  
  00h 5Ch A2h 00h 00h 01h 7Fh00h 5Ch A2h 01h 00h 01h 63h00h 5Ch A2h 02h 00h 01h 67h00h 5Ch A2h 03h 00h 01h 6Bh 00h 5Ch A2h 04h 00h 01h 6Fh  

Ich hoffe, jemand da draußen kann helfen, es ist wirklich ein Showstopper für mich.

BEARBEITEN - weitere Beispiele hinzugefügt

  00h 5Ch A2h 01h 01h 01h 65h00h 5Ch A2h 01h 01h 02h 66h00h 5Ch A2h 01h 01h 03h 67h00h 5Ch A2h 01h 01h 04h 68h00h 5Ch A2h 01h 01h 01h 65h 5Ch A2h 01h 01h 02h 66h00h 5Ch A2h 01h 01h 03h 67h00h 5Ch A2h 01h 01h 04h 68h00h 5Ch A2h 02h 01h 01h 69h00h 5Ch A2h 02h 01h 02h 6Ah00h 5Ch A2h 02h 01h 03h  derselben Nachricht, in der die letzten 3 Bytes 00h sind:  
  00h 5Ch A2h 00h 00h 00h 7Eh  

2. BEARBEITUNG - Ein Pastebin-Link wurde hinzugefügt zu einer Tonne anderer Beispiele, alle vom gleichen Nachrichtentyp

Es ist eine andere Nachricht, aber es gibt viele Beispiele: Viele Beispielnachrichten in Pastebin

Hast du mehr Proben?
Hey @cimarron, ich habe gerade einige weitere Beispiele hinzugefügt.
Dieser Ausdruck funktioniert für alle Proben außer einer: "0x7e + d [5] + 2 * d [4] + 4 * d [3] - (d [3] + d [4] == 0? 0: 0x20)" (d [0..5] sind die Daten). Wenn Sie mehr Samples wie das fehlerhafte oder Samples erhalten können, die die ersten drei Bytes variieren, können Sie es wahrscheinlich weiter verfeinern.
@hemflit, interessant, danke für deine Zeit! Ich schaue es mir gerade an und werde später weitere Beispiele einer anderen Nachricht veröffentlichen.
Zwei antworten:
DarthGizka
2016-01-21 21:13:10 UTC
view on stackexchange narkive permalink

Der Schlüssel ist, eine Megatonnen Proben zu erhalten, damit die Analyse etwas zu essen hat. Es ist wirklich hilfreich, wenn Sie die Beispiele in eine Datenbanktabelle oder ein Wörterbuch einfügen können, die interaktiv abgefragt werden können, z. von einer Art Skript-Shell. Python sollte bewundernswert funktionieren, aber ich habe nicht viel Erfahrung damit, da ich Visual FoxPro in den letzten zwei Jahrzehnten für interaktives Höhlenforschung verwendet habe.

Sobald Sie Ihre Beispiele zur Abfrage bereit haben, können Sie sie testen verschiedene einfache Hypothesen und widerlegen sie, indem sie Gegenbeispiele finden. Zum Beispiel scheinen die folgenden Beispiele darauf hinzudeuten, dass ein Unterschied im vierten Byte einen vierfachen Unterschied in der Prüfsumme verursacht:

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

Der Schlüssel besteht darin, Stichproben zu finden, die sich nur in der aktuellen 'Arbeits'-Spalte und der Prüfsumme unterscheiden, um den Effekt zu untersuchen was eine Änderung in der Arbeitsspalte auf der Prüfsumme hat. Angesichts der obigen Eingabe könnten wir beispielsweise 4 * b [3] als vorläufigen Term für das vierte Byte notieren und dann die Beispieldatenbank nach Gegenbeispielen abfragen, wenn dies nicht funktioniert. Das heißt, Sie wählen Stichprobenpaare aus, die sich nur im vierten Byte und in der Prüfsumme unterscheiden, und zählen die Anzahl der Erfolge und Misserfolge für

  Delta (Prüfsumme) mod 256 == 4 * Delta (Byte [3]) Mod 256.  

Das ist sowieso die Idee. Wie so etwas wie delta (Prüfsumme) mod 256 tatsächlich aussieht, hängt natürlich von Ihrer Skript-Shell ab. Mit VFP wäre es

  mod (256 + asc (substr (rechts, 7, 1)) - asc (substr (links, 7, 1)), 256)  

Der vollständige Ausdruck für den obigen Test wäre ziemlich lang, sodass Sie normalerweise kleine Hilfsfunktionen schreiben würden. Mit einem Helfer namens byte_delta () , der das Ergebnis auf den Bereich [0, 255] normalisiert, den Sie möglicherweise haben

  wähle le.sample als links, ri.sample als rechts; von all_samples le, all_samples ri; wo Zeug (links (ri.sample, 6), 4, 1, "") == Zeug (links (le.sample, 6), 4, 1, ""); und le.sample <> ri.sample; in den Cursor byte_3_pairsselect byte_delta (rechts, links, 7) == mod (4 * byte_delta (rechts, links, 4), 256) als ok, count (*); von byte_3_pairs; Gruppieren nach 1  

Im betrachteten Fall erhalten Sie ein gemischtes Bild für diese Abfrage (siehe Unterschied zwischen erstem und zweitem Beispiel oben, E4 statt 4). Normalerweise würden Sie zuerst einiges an Unterschieden auswählen, um ein Gefühl für die Dinge zu bekommen. 'Unterschied' kann ein arithmetischer Unterschied sein, bitweises xor oder was auch immer.

Deshalb benötigen Sie eine interaktive Shell wie Python oder VFP. Mit den Edit-Compile-Run-Zyklen einer kompilierten Sprache wäre dies ziemlich umständlich. Ich habe die VFP-Beispiele gegeben, weil Skriptsprachen mit Datenbankunterstützung die Dinge hier viel einfacher machen können.

Für einfache gewichtete Summen wie die üblichen 'vom Menschen berechenbaren' Prüfsummen in Dingen wie ISBNs ergeben sich ziemlich schnelle Ergebnisse . Ich habe diesen Ansatz verwendet, um alle in deutschen Krankenversicherungsnummern verwendeten Prüfzifferschemata - die größtenteils undokumentiert sind (oder zumindest zu diesem Zeitpunkt waren) - aus unterschiedlichen Probenmengen zu bestimmen. In diesem Fall hatte ich natürlich den Vorteil, dass der Grundtyp des Schemas - eine gewichtete Ziffernsumme - bekannt war und sich die Stichproben bereits in Datenbanktabellen befanden ...

Der diskutierte Fall ist schwieriger, weil das Grundschema noch nicht bekannt ist. Deshalb ist es wichtig, die Bitmuster zu betrachten, um ein Gefühl für die Dinge zu bekommen. Zum Beispiel zeigen Blasenübertragungen eine additive Funktion an. Dies wird ausführlicher im Thema Umkehren einfacher Nachrichten + Prüfsummenpaare (32 Byte) erläutert, in dem auch einige Beispiele für Änderungsmuster aufgeführt sind.

P.S.: Neben dem Versuch, Prüfsummenunterschiede für Änderungen in bestimmten Bits oder Bytes herauszufiltern, gibt es viele andere Dinge, die getan werden können, wenn die Beispiele in eine Art abfragbare Tabelle / Wörterbuch / Karte gestopft wurden. Das erste ist normalerweise, eine Reihe von Tests mit vorhandenen Standardfunktionen wie der geraden Bytesumme, dem geraden Byte xor, verschiedenen CRCs usw. durchzuführen, um den Unterschied (Arithmetik und xor) zur Prüfsumme zu beobachten. Das Anzeigen von Ergebnissen als Bitmuster - wie im verlinkten Artikel gezeigt - kann häufig hilfreich sein, um Regelmäßigkeiten zu erkennen, die im hexadezimalen oder dezimalen Format nicht so offensichtlich sind.

UPDATE Samples sind zu ähnlich (keine Unterschiede in den ersten drei Bytes) und es gibt zu wenige davon, um Hypothesen schnell zu verwerfen. Mit anderen Worten, es gibt einfach zu viele potenzielle Funktionen, die zu den vorhandenen Daten passen würden ...

Beispielsweise sagt die folgende einfache Fox-Funktion die Prüfsumme für die ursprüngliche Handvoll Stichproben korrekt voraus, mit Ausnahme einiger weniger Fälle, in denen es um 0x20 ausgeschaltet ist:

  Funktion f (s) lokales x, ix = 0 für i = 1 bis len (ms) - 1 x = Bit und (Bitverschiebung (mx, 1) + asc (substr (ms, mi, 1)), 0xFF) next i return bitand (mx + 0x8E, 0xFF)  

Das könnte daran liegen, dass es sich um eine Drehung statt um eine Verschiebung handelt, oder Es handelt sich um ein xor oder eine andere Verschiebung (relativ prim zu 8), die sich mit der Bitanzahl pro Byte überlappt, um einen Abstand von zwei Bits zwischen dem vierten Byte und der Prüfsumme zu erzeugen. Eine Drehung um 5 würde das tun. Es gibt jedoch viele andere Möglichkeiten ... Deshalb brauchen wir viel mehr Proben. ;-)

Die Analyse der Stichproben in PasteBin zeigt, dass ein Unterschied in der letzten Byteposition vor der Prüfsumme immer gleich dem Unterschied in der Prüfsumme ist. Dies bedeutet, dass das letzte Byte und seine Auswirkung auf die Prüfsumme aus der Stichprobenbasis entfernt werden können. Dies erhöht die Anzahl der Proben, die sich in nur einer Byteposition unterscheiden, was bedeutet, dass mehr niedrig hängende Früchte für die Analyse vorhanden sind ...

z. die Proben

  00 5C A0 00 00 00 00 06 00: 6900 5C A0 00 00 00 00 06 01: 6A ... 00 5C A0 00 00 00 00 06 FF: 68  

Alle werden dem neuen Beispiel zugeordnet (der Punkt zeigt ein entferntes Byte an, nur um dies hier darzustellen):

  00 5C A0 00 00 00 00 00 06. 69  

Die verkürzte Beispielbasis zeigt sofort Fälle an, in denen die Zweierpotenzregel nicht funktioniert (das letzte Byte hier ist ursprünglich das vorletzte):

  00 5C A0 00 00 00 00 00 00. 7D00 5C A0 00 00 00 00 00 01. 7F00 5C A0 00 00 00 00 00 02. 61 <-Differenz -0x20 zum vorhergesagten Delta 200 5C A0 00 00 00 00 00 03. 6300 5C A0 00 00 00 00 00 04. 65 ... 00 5C A0 00 00 00 07 00 00. B5 00 5C A0 00 00 00 08 00 00. BD00 5C A0 00 00 00 09 00 00. A5 <-Differenz -0x20 zum vorhergesagten Delta 800 5C A0 00 00 00 0A 00 00. AD00 5C A0 00 00 00 0B 00 00. D5 < - wieder auf dem richtigen Weg mit der früheren Sequenz  
Hey @DarthGizka, In erster Linie möchte ich sagen, dass ich Ihre detaillierte Antwort schätze. Hatten Sie Erfolg damit, eine Prüfsumme mit dem oben beschriebenen Ansatz zu erstellen? Ich denke, ich werde es morgen mit Ihrem Ansatz versuchen - ich bin gut in Python, also könnte ich dann die Wahl sein. Ich denke, ich brauche viel mehr Samples, die auch in der Länge variieren. Ich lasse die Frage noch ein paar Tage offen, aber wenn ich morgen die richtige Prüfsumme bekomme, werde ich Ihre Antwort akzeptieren - Nochmals vielen Dank!
@Jesper: Ich würde gerne selbst darüber nachdenken, aber leider muss ich meine Freizeit nutzen, um einen stinkenden Haufen Legacy-Code (VFP) zurückzuentwickeln. Es ist so schlecht, dass es nach dem Kompilieren und Dekompilieren leichter zu verstehen ist der Objektcode). Wenn Sie jedoch Schwierigkeiten haben, sich auf Dinge einzulassen, und irgendwie morgen ein Link zu einer schönen, fetten Reihe von Proben an einem Ort wie PasteBin erscheinen sollte, dann bin ich sicher, dass ich - und einige andere hier - nicht widerstehen können. ;-) Außerdem wäre es schön, wenn ein Python-Guru mit hilfreichen Hinweisen einspringen könnte ...
Das klingt cool oder nicht :) .. Ich habe kein VFP verwendet, tatsächlich habe ich noch nie davon gehört. Ich versuche es jetzt zu lösen, aber ich werde später bei PasteBin einen Link zu einer Reihe von Beispielen veröffentlichen, wie Sie vorgeschlagen haben. Ich freue mich sehr über Ihre Beiträge! Fühlen Sie sich frei, mich jemals nach Python zu fragen, ich werde mein Bestes geben, um zu antworten. Obwohl ich keine Erfahrung im Reverse Engineering mit Python habe.
@Jesper: Ich habe die Intervention der Götter von Python aufgerufen, da das interaktive Abfragen und Massieren von Daten an einer Python-Eingabeaufforderung sich grundlegend von der Ausgabe von SQL-Befehlen in Fox (VFP) unterscheidet. Für den Anfang würden Sie Ihre Arbeitsdaten wahrscheinlich in einer Liste / einem Wörterbuch aufbewahren, nicht in einer Datenbanktabelle / einem Cursor wie in Fox ... Weder Fox noch Python sind jedoch in Stein gemeißelt. Sie benötigen lediglich eine interaktive Umgebung, in der Sie Funktionen ändern und aufrufen, Klassen ändern / instanziieren und Daten in großen Mengen effizient massieren / anzeigen können. AutoLisp war auch sehr ähnlich (aber ich habe es seit Jahrzehnten nicht mehr benutzt)
Ich habe die Frage so bearbeitet, dass sie jetzt einen Pastebin-Link enthält, wie Sie es mit einer langen Liste von Beispielen vorgeschlagen haben. Es ist eine andere Nachricht. Ich denke, die 00 am Anfang der Nachricht kann weggelassen werden, aber denken Sie daran, dass sie sich möglicherweise vor den im Pastebin bereitgestellten Beispielen befindet
Danke, das ist schon viel besser! Dies bestätigt, dass der Unterschied in einer bestimmten Byte-Position größtenteils gleich der Zweierpotenz ist, die dem Abstand zum Ende entspricht, was auf eine Summierung mit Linksverschiebung um ein Bit hinweist (wie im Beispiel Fox gezeigt) Funktion in meinem Artikel). Das Wichtigste ist jetzt, die blutigen Details herauszufinden, bei denen die Proben für Paare abgebaut werden müssen, bei denen die Differenz nicht der erwarteten Zweierpotenz entspricht (die berühmte 0x20-Differenz zu meinem Beispiel oder der Hemflit-Formel). Und für den Abbau von Goldstaub werden riesige Erzhaufen benötigt ... ;-)
Du machst wirklich Fortschritte !! Ich kann Ihre Funktion nicht wirklich in Python zum Laufen bringen: Nur um sicherzugehen, ** Bitlshift **: ist Bit-Linksverschiebung (<<, C-Äquivalent) und ** Bitand ** ist nur UND (&, C-Äquivalent), rechts ?
Ja, Sie haben die richtigen Operatoren. Die Funktion war jedoch nur ein Beispiel, das zufällig an der ursprünglichen kleinen Handvoll Proben funktionierte, mit Ausnahme der 0x20-Sache (die auf die gleiche Weise wie Hemflit repariert werden konnte). Die Funktion funktioniert nicht mit dem Probenstapel auf PasteBin.
user14656
2016-02-11 06:08:46 UTC
view on stackexchange narkive permalink

Ich frage mich, ob Sie bei der Dekodierung Ihrer Prüfsumme weitere Fortschritte erzielt haben. Ich habe ein sehr ähnliches Problem und ich denke, Ihre Methode funktioniert möglicherweise auch für meinen Fall. Dies sind meine Daten, mit denen ich die Prüfsummenmethode herausfinden möchte, die in früheren Entwicklungen lange verloren gegangen ist:

00 8a 51 0b a0 b8 a100 8a 51 0b a1 b8 a300 8a 51 0b a2 b8 2300 8a 51 0b a3 b8 2500 8a 51 0b a4 b8 a300 8a 51 0b a5 b8 a500 8a 51 0b a6 b8 2500 8a 51 0b a7 b8 27

Schätzen Sie es sehr, wenn Sie mehr über Ihre Fortschritte diskutieren können, die zur Lösung beitragen können dieses. Außerdem habe ich herausgefunden, dass ich Knabbern tauschen kann und es hat auch die gleiche Prüfsumme. Vielen Dank im Voraus.

Entschuldigung, die Daten sind alle durcheinander: [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] Im Allgemeinen wirkt sich die Bitdifferenz in den 5. Bytes auf das letzte Byte der Prüfsumme aus.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...