Forum: Mikrocontroller und Digitale Elektronik Wer von euch kann bei Crc Checksummenberechnung eines Datenblockes helfen ?


von Karl (karl110)


Lesenswert?

Hallo,

ich benötige Hilfe bei Berechnen einer CRC Checksumme, gibt es hier 
eventuell jemanden der diesbezüglich helfen kann ?

von Stephan D. (50plus)


Lesenswert?

Hi Karl,
*wobei hapert es genau?
*welche "CRC" Berechnung genau (CRC32, CRCC ...)?
*welche Programmiersprache?
*wenn Eigenentwicklung: muss es portierbar sein (Endianess)?
VG, Stephan

von Peter (pittyj)


Lesenswert?

Wenn man bei Google "CRC Berechnung" eingibt, dann kommen eine Menge von 
Seiten raus. Wo ist das Problem sich dort einzulesen?

Geht es um einen Algoithmus/Funktion in einer Programmiersprache?
Oder soll die Theorie für eine Hausaufgabe nachvollzogen werden?

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

> ich benötige Hilfe bei Berechnen einer CRC Checksumme, gibt es hier
> eventuell jemanden der diesbezüglich helfen kann ?

Da gibt es doch libs dafür und crc sollte so mit das am besten 
dokumentierte eines Protokolls/Blocksicherung sein.
* Beitrag "CRC von Ethernet Frame berechnen"
* https://www.patrick-saar.de/programme/crc-online-rechner

: Bearbeitet durch User
von Cartman E. (cartmaneric)


Lesenswert?

Das klingt doch mal nach einer echten Aufgabe für eine KI. ☺
Und wenn die versagt, bleibt immer noch REVENG.
Danach solltest du dann einmal suchen.

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

> Und wenn die versagt, bleibt immer noch REVENG.


Beitrag "Tip: Reverse-Engineering von CRCs"

von Karl (karl110)


Lesenswert?

Stephan D. schrieb:
> Hi Karl,
> *wobei hapert es genau?
> *welche "CRC" Berechnung genau (CRC32, CRCC ...)?
> *welche Programmiersprache?
> *wenn Eigenentwicklung: muss es portierbar sein (Endianess)?
> VG, Stephan


Also, ich habe davon wirklich nicht viel Ahnung, bitte schlagt mich 
jetzt nicht gleich deswegen..........

Ich habe einen hex- Datenblock der am Ende einen CRC16 Checksumme hat. 
Ich muss in diesem Block Änderungen vornehmen, demzufolge muss die 
Checksumme angepasst werden.

Ich habe mich versucht ohnline einzulesen, auch einige Generatoren habe 
ich ausprobiert, leider ohne Erfolg, wahrscheinlich haben diese 
Generatoren nicht den Algorythmus der hier verwendet wurde.

von Falk B. (falk)


Lesenswert?

Karl schrieb:
> Ich habe mich versucht ohnline einzulesen, auch einige Generatoren habe
> ich ausprobiert, leider ohne Erfolg, wahrscheinlich haben diese
> Generatoren nicht den Algorythmus der hier verwendet wurde.

Unwahrscheinlich. Aber es gibt viele Optionen für CRC, Initialwert, 
reflektiert, invertiert.

Zeig uns deinen Datenblock und die originale CRC, dann können wir das 
passende Polynom und Verfahren finden.

von Wulf D. (holler)


Lesenswert?

Jeder CRC Code wird mit einem Startwert initialisiert: den muss man auch 
kennen. Der kann 0x0000 sein, muss aber nicht. Ich denke das liegt eher 
daran, und nicht am Algorithmus.

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

> Also, ich habe davon wirklich nicht viel Ahnung, bitte schlagt mich
> jetzt nicht gleich deswegen..........

Wobei Schläge schon bei manchen das Denkvermögen angestossen haben ...

> Ich habe einen hex- Datenblock der am Ende einen CRC16 Checksumme hat.
> Ich muss in diesem Block Änderungen vornehmen, demzufolge muss die
> Checksumme angepasst werden.

Also selbst arduino hat ne crc16 library, wenn das nicht klappt ist 
vielleicht der Datenbereich falsch oder die Erwartungshaltung.
Wenn es jetzt hex Datenblock statt Block heisst, könnte es ja sein, das 
da jemand ASCII einfüttert wo binary erwartet wird ...

Da musste wohl "an der Tafel vorrechnen" müßen, damit dir jemand sagen 
kann, wo falsch "abgebogen" wurde.

von Karl (karl110)


Lesenswert?

Falk B. schrieb:
> Karl schrieb:
>> Ich habe mich versucht ohnline einzulesen, auch einige Generatoren habe
>> ich ausprobiert, leider ohne Erfolg, wahrscheinlich haben diese
>> Generatoren nicht den Algorythmus der hier verwendet wurde.
>
> Unwahrscheinlich. Aber es gibt viele Optionen für CRC, Initialwert,
> reflektiert, invertiert.
>
> Zeig uns deinen Datenblock und die originale CRC, dann können wir das
> passende Polynom und Verfahren finden.

Das wäre ja ne Mega Hilfe !

Hier der Datenblock:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 88 6D 02 63 CD 00 00 00 00 88 6D 02 63 CD 00 00 00 00 84 CD 01 
CD 00 00 00 00 00 84 6D 01 63 00 00 00 00 00 88 CD 02 63 CD 00 00 00 00 
00 00 00 00 00 00 00 00 00 24 37 30 9D 92

9D 92 ist die Checksumme.

Als Info noch dazu, die 37 30 vor der Checksumme, es kann sein das das 
nicht mit in die Berechnung mit einbezogen wird.

von Gunnar F. (gufi36)


Lesenswert?

Peter schrieb:
> Wenn man bei Google "CRC Berechnung" eingibt, dann kommen eine Menge von
> Seiten raus. Wo ist das Problem sich dort einzulesen?

Genau so habe ich es gemacht und es hat auf Anhieb funktioniert. Klar 
ist das Generatorpolynom entscheidend und der Startwert  Aber ich hatte 
den Eindruck, die Implementierungen sind eh alle gleich oder sehr 
ähnlich.

von Karl (karl110)


Lesenswert?

Gunnar F. schrieb:
> Peter schrieb:
>> Wenn man bei Google "CRC Berechnung" eingibt, dann kommen eine Menge von
>> Seiten raus. Wo ist das Problem sich dort einzulesen?
>
> Genau so habe ich es gemacht und es hat auf Anhieb funktioniert. Klar
> ist das Generatorpolynom entscheidend und der Startwert  Aber ich hatte
> den Eindruck, die Implementierungen sind eh alle gleich oder sehr
> ähnlich.

wie gesagt, ich bin damit in diesem Fall leider nicht weiter gekommen

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Gunnar F. schrieb:

> Genau so habe ich es gemacht und es hat auf Anhieb funktioniert.

Was aht "funktioniert"?

> Klar
> ist das Generatorpolynom entscheidend und der Startwert

Es gibt da noch einiges mehr. Die bitorder z.B.

> Aber ich hatte
> den Eindruck, die Implementierungen sind eh alle gleich oder sehr
> ähnlich.

Ähem, nö. Es gibt stets mindestens zwei grundlegende Implementierungen: 
bit-wise und crcwidth-wise.

Und dann kann es noch besondere Spielarten geben, z.B. 
Implementierungen, die zwar nicht bitweise arbeiten, aber auch nicht in 
der Breite der CRC, sondern in der Verarbeitungsbreite einer bestimmten 
Maschine.

Und das alles (außer bitwise) kann dann auch noch tabellenbasiert oder 
als spezifischer Code implementiert sein.

Also nö: die Vielfalt möglicher Implementierungen ist definitiv 
überwältigend. Selbst wenn man nur ein einziges konkretes Polynom 
betrachtet. Das gilt natürlich insbesondere für häufig benutzte 
Polynome.

von Peter (pittyj)


Lesenswert?

Wulf D. schrieb:
> Jeder CRC Code wird mit einem Startwert initialisiert: den muss
> man auch
> kennen. Der kann 0x0000 sein, muss aber nicht. Ich denke das liegt eher
> daran, und nicht am Algorithmus.

Ich meine, dass bei Ethernet der Startwert von -1 bzw 0xffffffff 
genommen werden muss.

Details habe ich auf der Arbeit, da komme ich erst morgen ran.

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Ob S. schrieb:
> Ähem, nö. Es gibt stets mindestens zwei grundlegende Implementierungen

Richtig, ist aber voellig egal. Selbst wenn ich ein Tarotblatt habe, was 
mit die richtige CRC legt. Die Implementierung muss wurscht sein. Sonst 
taucht die nix.

reveng findet bei mir auf Anhieb nix mit den gegebenen Daten.
So'n bissl mehr Info woher das kommt, etc. koennte evtl. helfen...

Gruss
WK

von Stephan D. (50plus)


Lesenswert?

Karl schrieb:
> Hier der Datenblock:
> 9D 92 ist die Checksumme.

hast Du noch ein paar weitere unterschiedliche Datenblöcke?

: Bearbeitet durch User
von Karl (karl110)


Lesenswert?

Stephan D. schrieb:
> Karl schrieb:
>> Hier der Datenblock:
>> 9D 92 ist die Checksumme.
>
> hast Du noch ein paar weitere unterschiedliche Datenblöcke?

PN

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Dergute W. schrieb:

> Richtig, ist aber voellig egal. Selbst wenn ich ein Tarotblatt habe, was
> mit die richtige CRC legt. Die Implementierung muss wurscht sein. Sonst
> taucht die nix.

Das ist korrekt.

> reveng findet bei mir auf Anhieb nix mit den gegebenen Daten.

Das könnte dann z.B. daran liegen, dass es eigentlich keine CRC (im 
engeren Sinne) ist. Es kann übrigens trotzdem durchaus eine "Prüfsumme" 
sein...

von Dieter S. (ds1)


Lesenswert?

Häufig hilft es einfach mal die Doku zu lesen, bei CRC RevEng heißt es 
z.B. im Kapitel "SEARCHING FOR CRC MODELS":

"In general at least four data points are needed, either as known 
parameters or as message-CRC pairs."

von Stephan D. (50plus)


Lesenswert?

Du könntest die anderen Daten hier auch einstellen; das hilft sicherlich 
beim knobeln;)

p.s.
PN landet in Deiner eMail inbox.

von Cyblord -. (cyblord)


Lesenswert?

ChatGPT liefert was, aber ich denke das ist es nicht.
CRC würde ich fast ausschließen nach dieser Antwort.

Kurzfassung: Mit deinem Datenblock (84 Bytes, endet auf … 24 37 30) und 
der angegebenen CRC 9D 92 passt keine der üblichen CRC-16-Varianten 
(IBM/Modbus, CCITT-FALSE, X25, XMODEM, KERMIT, DNP, USB, GENIBUS, 
AUG-CCITT, …).

Was jedoch exakt passt (ohne Bit-Reflexion):

CRC-16 (breit=16, poly=0xFEAB, init=0xFFFF, refin=False, refout=False, 
xorout=0xFFFF) ⇒ Ergebnis 0x9D92 (entspricht Bytes 9D 92).

Alternativ (andere, ebenfalls ungewöhnliche Polynomwahl): CRC-16 
(poly=0xBA2F, init=0xFFFF, refin=False, refout=False, xorout=0x0000) ⇒ 
Ergebnis 0x929D (Bytes 92 9D, also vertauschte Reihenfolge).

: Bearbeitet durch User
von Patrick B. (pbeck)


Lesenswert?

Alles klar — mit CRC-16/CCITT-FALSE (Poly 0x1021, Init 0xFFFF, keine 
Bit-Reflektion, xorout 0x0000) passt deine Prüfsumme exakt.

Der CRC bezieht sich nicht auf den ganzen Block, sondern nur auf die 
3-Byte-Sequenz
CD 02 63 (im Datenblock bei Offset 64–66, 0-basiert).

CRC über CD 02 63 ergibt 0x929D → im Block als 9D 92 (little-endian) 
abgelegt

Sagt chatgpt. Habe genauso viel Ahnung wie Karl :)

von Cyblord -. (cyblord)


Lesenswert?

Andere, nicht CRC Prüsummen schließt chatgpt aus:

Kurz: Für nicht-CRC-Checksummen passt 0x9D92 nicht zu deinem 
84-Byte-Block.

Ich habe typische Varianten geprüft (jeweils über den kompletten Block 
gerechnet):

Byte-Summe mod 2¹⁶, 16-Bit-Wortsumme (LE/BE), 
1’s-complement/Internet-Checksumme (bytes & words), 2’s-complement → 
kein Treffer.

XOR (8-bit/16-bit), BSD/SysV-artige rotierende Summen → kein Treffer.

Fletcher-16, Adler-32 (Low/High-16) → kein Treffer.

Auch „Summe inkl. Checksumme ergibt 0/0xFFFF“ (LE/BE) trifft nicht.

von Cyblord -. (cyblord)


Lesenswert?

Das Problem ist, der TE weiß so wenig von der Sache dass die gegebenen 
Infos vermutlich falsch sind und damit alles für die Katz.

von Gunnar F. (gufi36)


Lesenswert?

Cyblord -. schrieb:
> Andere, nicht CRC Prüsummen schließt chatgpt aus:
>
> Kurz: Für nicht-CRC-Checksummen passt 0x9D92 nicht zu deinem
> 84-Byte-Block.
>
> Ich habe typische Varianten geprüft (jeweils über den kompletten Block
> gerechnet):
>
> Byte-Summe mod 2¹⁶, 16-Bit-Wortsumme (LE/BE),


Das klingt ja jetzt irre, was der Kollege inzwischen so kann! Angeblich 
ja immer nur das jetzt wahrscheinlichste Wort hinschreiben...

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Gunnar F. schrieb:

> Das klingt ja jetzt irre, was der Kollege inzwischen so kann! Angeblich
> ja immer nur das jetzt wahrscheinlichste Wort hinschreiben...

Genau das hat er doch getan?

Effektiv hat er genau garnix herausbekommen. Das aber in einen 
geschmeidigen Text verpackt.

Wie es halt Geschäftsführer, Markingleute und ähnliches Gelichter auch 
machen. Die könnte man also problemlos durch KI ersetzen.

von Karl K. (leluno)


Lesenswert?

Vielleicht solltest du mehr zur Aufgabenstellung sagen. Wofür brauchst 
du die crc? Modbus?

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

> Das Problem ist, der TE weiß so wenig von der Sache dass die gegebenen
> Infos vermutlich falsch sind und damit alles für die Katz.

Der Eindruck kann täuschen, sicher weiß der TO mehr als er schreiben 
will, bspw. zum Ursprung des Schnipsels.

Sieht etwas ungewöhnlich aus:
* "00 00 00 00 88 6D 02 63 CD" wird wiederholt
* und auch so ist "CD" recht häufig.
* Magic numbers für typische file-/packet- typen finden sich nicht,

Vielleicht ist es ein wireshark Mitschnitt, vielleicht ein save-file 
eines Baller-Games, Lizenz-key für Kaufsoftware ...

: Bearbeitet durch User
von Nemopuk (nemopuk)


Lesenswert?

Bradward B. schrieb:
> vielleicht ein ... Lizenz-key für Kaufsoftware

Ihr sollt eben nicht wissen, bei welchem Hack ihr dem TO helft. So könnt 
ihr später dem Richter sagen "ich wusste nichts".

von 🍅🍅 🍅. (tomate)


Lesenswert?

Kann jeder bessere Hex-Editor....

von Harald K. (kirnbichler)


Lesenswert?

Karl K. schrieb:
> Wofür brauchst
> du die crc? Modbus?

Das Beispiel da ist kein Modbus.

von Frank O. (frank_o)


Lesenswert?

Karl schrieb:
>> hast Du noch ein paar weitere unterschiedliche Datenblöcke?
>
> PN

Schade!
Ist ein Beitrag, den auch ich sehr interessant finde.
Ich habe nämlich auch keinen blassen Schimmer davon.

von Karl (karl110)


Lesenswert?

Stephan D. schrieb:
> Du könntest die anderen Daten hier auch einstellen; das hilft sicherlich
> beim knobeln;)
>
> p.s.
> PN landet in Deiner eMail inbox.


30 27 04 42 60 83 C9 00 00 30 47 04 22 60 83 C9 00 00 2C AB 03 60 83 C9
00 00 00 8C 61 03 63 84 CD 00 00 00 8C 61 03 63 84 CD 00 00 00 88 CD 02
CD 84 00 00 00 00 84 61 01 63 00 00 00 00 00 8C CD 03 63 84 CD 00 00 00
00 00 00 00 00 00 00 00 19 3F 36 37 B9 6D



30 27 04 42 60 83 C9 00 00 30 47 04 22 60 83 C9 00 00 2C AB 03 60 83 C9
00 00 00 8C 61 03 63 84 CD 00 00 00 8C 00 03 63 84 CD 00 00 00 00 00 00
00 00 00 00 00 00 84 61 01 63 00 00 00 00 00 8C 00 03 63 84 CD 00 00 00
00 00 00 00 00 00 00 00 19 3F 30 35 EB 07


Die 2 Bytes vor der Checksumme ( 36 37 und 30 35 ) werden nicht in die 
Berechnung mit einbezogen.

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

> Hier der Datenblock:
>
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> 00 00 00 88 6D 02 63 CD 00 00 00 00 88 6D 02 63 CD 00 00 00 00 84 CD 01
> CD 00 00 00 00 00 84 6D 01 63 00 00 00 00 00 88 CD 02 63 CD 00 00 00 00
> 00 00 00 00 00 00 00 00 00 24 37 30 9D 92

Schaut ähnlich einem Ethernet-Frame aus bei dem die Präambel und SFD 
ge-nullt sind.
"88 6D 02 63 CD 00 " würde dann die MAC-Addr o.ä. sein, da sendet also 
einer an sich selbst ein Paket. Anhand der oberen MAC, "88:6D:02", Kann 
man den Hersteller bestimmen, könnte hier intel sein.

Die CRC erstreckt sich lt. Ethernet Standard "the FCS value is computed 
as a function of the protected MAC frame fields: source and destination 
address, length/type field, MAC client data and padding (that is, all 
fields except the FCS). Die führenden Nullen gehören also nicht dazu 
und das könnte hier das Hauptrpoblem sein, das nicht bekannt ist, wo die 
Daten für die CRC beginnen.

https://en.wikipedia.org/wiki/Ethernet_frame
https://ipcisco.com/lesson/ethernet-basics/

> Ihr sollt eben nicht wissen, bei welchem Hack ihr dem TO helft. So könnt
> ihr später dem Richter sagen "ich wusste nichts".
Naja, Beihilfe ist auch strafbar, erst recht wenn der Staatsschutz 
ermittelnd involviert ist.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.