2012-09-15 13 views
5

Ich muss Reverse Engineering CRC/Checksum Algorithmus von Windows CE ausführbar implementiert. Als propriorisches Protokoll sagt es nichts über den CRC/Prüfsummenalgorithmus. Es gibt jedoch Konsolenschnittstelle, die eine korrekte/berechnete Prüfsumme berichtet und ich kann meine eigenen Nachrichten mit Zufallsbits konstruieren, wenn Message-Protokoll ist korrekt:Methoden zum Festhalten des 16-Bit-CRC/Checksum-Algorithmus, der von Windows CE ausführbar ist?

ich beobachtet habe, dass

  • einzelnes Bit in Meldung Änderungen ändern Prüfsummenbytes vollständig.

  • Algorithmus scheint positionsabhängig zu sein, da ich einige einzelne 1-Bit-Nachrichten in verschiedenen Nachrichtendatenpositionen mit Rest der Bits null und die ganze Zeit Konsole unterschiedliche Prüfsumme berichtet. Wenn es eine einfache additive Prüfsumme wäre, wäre die Prüfsumme identisch gewesen.

I gemeinsame XOR angewendet, LRC, additive Prüfsummenalgorithmen, gemeinsame CRC-Polynome (Standerd, CCITT, X-Modem) und durchlaufen [CRC-Engineering Essay umkehren] [2], aber leider kann ich nicht gehen vorbei an der herzuleiten Polynom, weil der Nachrichtentyp fest ist, so dass keine 1-Bit-Nachricht erzeugt werden kann.

Meine Fragen:

  1. Gibt es CRC/Prüfsummen-Algorithmus Eigenschaften, die ich gegen Nachrichten zu testen, um zu bestimmen, ob Algorithmus CRC-Prüfsumme oder Polynom basiert?

  2. Gibt es eine Möglichkeit, die Fehlermeldung in der Programmdemontage mit entsprechenden Montageanleitungen zu vergleichen?

  3. Wie kann man Disassembly-Code debuggen/genau lokalisieren, wenn er die korrekte Prüfsumme auf der Konsole meldet? Speicherauszug oder etwas?

+0

sollte dies auch getaggt werden [Reverse-Engineering], denke ich. – moooeeeep

+0

Ersetzt "Algorithmus" -Tag durch "Reverse-Engineering" –

Antwort

4

Versuchen CRC RevEng. Einige schnelle Versuche mit Ihren Daten waren fruchtlos, aber ich habe mich nicht sehr angestrengt. Ziehen Sie in Betracht, nicht nur alle zehn Nachrichtenbytes zu versuchen, sondern auch die letzten acht und die letzten sechs.

Darüber hinaus können Sie auf der gleichen Website die most comprehensive list of known CRCs finden, die ich kenne.

Update:

Es ist sehr wahrscheinlich, dass dies eine CRC von einer Art ist, oder zumindest eine lineare Operation über GF (2). Es hat diese Eigenschaft, die CRCs haben: Wenn zwei Sequenzen das gleiche Exklusiv-Oder haben, dann haben ihre CRCs auch die gleichen Exklusiv-Oder. Zum Beispiel aus Ihren Daten (Fallenlassen der gemeinsamen Präfix, obwohl beachten Sie, dass das Präfix oder einen Teil davon, einschließlich das Ergebnis nicht ändern):

00000000000122b5^0000000000022421 = 0000000000030694 
0447080a300130A1^0447080a30023635 = 0000000000030694 

und

0447080a300130A1^0447080a30043A36 = 0000000000050a97 
00000000000122b5^0000000000042822 = 0000000000050a97 

In Anbetracht dieser Tatsache gibt ist eine Möglichkeit für Sie, eine Routine zu erstellen, um den Prüfwert zu berechnen, ohne zu bestimmen, ob es sich um eine CRC oder um die CRC-Parameter handelt.

Generiert den 16-Bit-Prüfwert für alle Einzelbitnachrichten, d. H.ein einzelnes Bit, das in den sechs Bytes der Nachrichtendaten gesetzt ist, wobei der Rest der Nachrichtendatenbits null ist. Diese Nachrichten sind ein vollständiger Satz von Basisvektoren für dieses lineare Feld. Es gibt 48 von ihnen. Generieren Sie auch die Prüfwerte für eine Nachricht mit allen Nullwerten. Sie haben bereits einen Anfang mit Nullen, die 2020 geben, das letzte Bit, das 22b5, etc. Exclusive-oder den Prüfwert für alle Nullen (2020) mit jedem der anderen gibt. Sie haben nun 49 Werte, von denen 48 für die Basisvektoren und einer für die Korrektur des Nullvektors (der wegen der Vor- und Nachkonditionierung eines CRC und der Präfixbytes wahrscheinlich ungleich Null ist). Zum Beispiel ist der Wert für den Basisvektor mit dem letzten gesetzten Bit 0295.

Jetzt können Sie diese 49 Werte verwenden, um den Prüfwert für jede 6-Byte-Nachricht zu berechnen. Exklusiv - oder zusammen die Werte für alle entsprechenden Bits, die in dieser Nachricht auf Eins gesetzt sind. Exklusiv - oder das mit dem Prüfwert für Null. Das Ergebnis ist der Prüfwert für diese Nachricht.

+0

Ich brauche etwas Hilfe nach letzten Para, Können Sie bitte erarbeiten, muss ich Lookup-Tabelle der Check-Werte nach Bit-Position zu halten? Hier ist der Basisvektor für die ersten 5 Nachrichten in checksum.txt; Letztes gesetztes Bit, zweitletztes gesetztes Bit und so weiter ... (1): 2020^22b5 = 0295 (2): 2020^2421 = 0401 (3): 2020^2822 = 0802 (4): 2020^3024 = 1004 (5): 2020^0028 = 2008 –

+0

Ja. Sie benötigen eine Tabelle mit 48 Prüfwerten, einen für jede Bitposition. Wenn Sie die Einträge in der Tabelle, die den 1 Bits in der Nachricht entsprechen, exklusiv oder zusammenfassen, führen Sie eine weitere Exklusiv-Oder mit 0x2020 für die Antwort aus. –