mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Tip: Reverse-Engineering von CRCs


Autor: Georg A. (georga)
Datum:

Bewertung
4 lesenswert
nicht lesenswert
Falls andere auch ab und an das Problem haben, beim Reverse-Engineering 
fremder Protokolle rauszufinden, mit welcher CRC-Methode das geschützt 
ist: Habe gestern "CRC RevEng: arbitrary-precision CRC calculator and 
algorithm finder" auf http://reveng.sourceforge.net/ entdeckt.

Da muss man fast nicht mehr nachdenken, das Programm findet alles raus. 
Wenn man ahnt, dass es zB. eine CRC32 ist, man aber keine Ahnung hat, 
welches Polynom, welcher Initwert, ob/wie das Ergebnis invertiert wird 
und in welche Richtung die Ein/Ausgabe geschoben wird, alles kein 
Problem...

Konkretes Beispiel: Das WeatherHub-Protokoll, an dem ich gerade sitze. 
Die letzten vier Bytes der Nachricht sind offensichtlich eine Prüfsumme, 
nur welche...

Es braucht nur drei (unterschiedliche) Nachrichten im Hexformat mit der 
CRC am Ende:

msg1=250833c27080f1400000000000c0000000000000000000000000000000000000007 
100549f
msg2=250833c27080f1400000040000c0000000000000000000000000000000000000006 
830f3df
msg3=250833c27080f1400000080000c0000000000000000000000000000000000000004 
3611a1f

Dann einfach

./reveng -w 32 -s $msg1 $msg2 $msg3

und schwupps schon nach <20s:

width=32  poly=0x04c11db7  init=0x29f0f49b  refin=false  refout=false 
xorout=0x00000000  check=0xb901303d  residue=0x00000000  name=(none)

Das Polynom ist Standard, nur der komische Init-Wert nicht... Die 
gesamte Suche über alle CRC32-Möglichkeiten würde single-threaded so 
15-20min dauern.

Autor: Eduard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der INIT Wert ist nicht "komisch" sondern willkürlich gewählt. Der ist 
oft Null, muss aber nicht.

Ansonsten bleibt festzustellen, dass das Verfahren evident ist, weil CRC 
ja nichts anderes ist, als umgerechnete Information, die observierbar 
ist. Der Trick ist ja nur, die Infor auf mehre Bits zu verteilen, um 
einen Einzelbitfehler auszumerzen.

CRC ist keine Verschlüsselungsmethode.

Man könnte auch einen Scrambler nehmen.

Autor: Georg A. (georga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eduard schrieb:
> Der INIT Wert ist nicht "komisch" sondern willkürlich gewählt. Der ist
> oft Null, muss aber nicht.

Normal ist halt ffffffff oder 0. Dann hätte ich es auch so gefunden. 
Jeder andere Wert klingt stark nach absichtlicher Obfuskation ;)

> CRC ist keine Verschlüsselungsmethode.

Weiss ich... Aber es hilft ungemein, wenn man sie checken kann...

> Man könnte auch einen Scrambler nehmen.

Gibts da auch, der ist mit G3RUH aber Standard, weil das der 
RF-Sendechip selbst macht.

Autor: ~Mercedes~ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, Georg!
hey, ein schönes Progamm!

Da sieht man , das CRC "nur" ein cyclic redunance check
ist und keine Hashfunktion, die könnte man dann nicht
rückrechnen.
Trotzdem gibts ja auch bei einer Hashfunktion
Möglichkeiten, da tobt halt ein K(r)ampf. ;-)

mfg

Autor: Christian B. (casandro) Flattr this
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Für Leute die mehr über die Hintergründe erfahren wollen. Hier gibts 
einen Vortrag vom Easterhegg 2016
https://media.ccc.de/v/eh16-27-how_to_reverese_crcs

Autor: Achim S. (achs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Georg A. schrieb:
> Jeder andere Wert klingt stark nach absichtlicher Obfuskation ;)

Oder nach einem anderen Start. Z.b. die ersten 2 Byte nicht, oder schon 
3 Byte (impliziten) Header vorher.

Autor: Georg A. (georga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achim S. schrieb:
> Georg A. schrieb:
>> Jeder andere Wert klingt stark nach absichtlicher Obfuskation ;)
>
> Oder nach einem anderen Start. Z.b. die ersten 2 Byte nicht, oder schon
> 3 Byte (impliziten) Header vorher.

Die 4 Bytes vorher sind immer dieselben (Sync-Word). Aber der 
CRC-Startwert ist offensichtlich abhängig vom Typ des Sensors (2tes Byte 
der Message), also kanns das nicht sein. Die Länge (erstes Byte) hängt 
auch vom Typ ab. Ich habe aber die einfachen Möglichkeiten (mit ohne 
erstes/zweitem Byte) schon probiert, damit wird der Startwert leider 
nicht allgemeingültig. Muss wohl noch etwas rumspielen...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.