Spørsmål:
Bestemme CRC-algoritme (16 bit?) Over RS-232
Enrico Biscotti
2014-11-17 06:06:44 UTC
view on stackexchange narkive permalink

Jeg gir opp .... Jeg har prøvd i to år å finne ut hvilken CRC-algoritme som brukes over en RS-232 seriell forbindelse mellom to utstyr. Utstyret dateres fra ca 2002. Jeg antar bare at det er CRC-beskyttet, men jeg kan ta feil.

Jeg har bygget en RS-232-skjerm som jeg har koblet til datalinjen.

Jeg kan tydelig se på oskopet mitt at det er standard RS-232 med startbit, 8 databiter og stoppbit. Jeg kan fortelle at det sendes LSbit først. Dens 9600 baud.

Jeg kan kontrollere deler av dataene i meldingen, men ikke alt fra overføringsutstyret. Jeg har klart å bestemme hva hvert byte i meldingen betyr. Ved å dreie knottene på senderen, kan jeg se bestemte byte økes med en. Så jeg er ganske sikker på at jeg vet hva hvert av databytes i meldingen betyr. De er alle en enkel binær koding av knottposisjoner og noen ganger en ASCII-tegnkoding av bryterposisjoner. Databytene i meldingen gir alle mening i sammenheng med hva utstyret gjør. meldinger over seriellinjen. Jeg har klart å lage den fjerde bytesekvensen gjennom alle 256 verdiene. Sendeutstyret konstruerer disse meldingene, jeg har nettopp fanget dem. De første 6 bytene er meldingen.

De to siste bytene ser ut til å være en CRC i stedet for en kontrollsum. Fra denne listen er det mulig å samle opp mange meldingspar som avviker med en bit i den fjerde byten. Jeg vet at det kan være nyttig.


  0x00 0x09 0x69 0x31 0x97 0x03 0x54 0x67 0x00 0x09 0x69 0x31 0x98 0x03 0xAD 0xD5 0x00 0x09 0x69 0x31 0x99 0x0x 0x0x 0x0x 0x0x 0x0x 0x0 0xDB 0xEC 0x00 0x09 0x69 0x31 0x9B 0x03 0x60 0xF0 0x00 0x09 0x69 0x31 0x9C 0x03 0x41 0xA7 0x00 0x09 0x69 0x31 0x9D 0x03 0xFA 0xBB 0x00 0x09 0x69 0x31 0x9E 0x03 0x37 0x9E 0x00 0x09 0x69 0x31 0x9F 0x03 0x8C 0x82 0x00 0x09 0x69 0x31 0xA0 0x03 0x87 0x7c 0x00 0x09 0x69 0x31 0xA1 0x03 0x3C 0x60
0x00 0x09 0x69 0x31 0xA2 0x03 0xF1 0x45 0x00 0x09 0x69 0x31 0xA3 0x03 0x4A 0x59 0x00 0x09 0x69 0x31 0xA4 0x03 0x6B 0x0E 0x00 0x09 0x69 0x31 0xA5 0x03 0xD0 0x12 0x00 0x09 0x69 0x31 0xA6 0x03 0x1D 0x37 0x00 0x09 0x69 0x31 0xA7 0x03 0xA6 0x2B 0x00 0x09 0x69 0x31 0xA8 0x03 0x5F 0x99 0x00 0x09 0x69 0x31 0xA9 0x03 0xE4 0x85 0x00 0x09 0x69 0x31 0xAA 0x03 0x29 0xA0 0x00 0x09 0x69 0x31 0xAB 0x03 0x92 0xBC 0x00 0x09 0x69 0x31 0xAC 0x03 0xB3 0xEB 0x00 0x09 0x69 0x31 0xAD 0x03 0x08 0xF7 0x00 0x09 0x69 0x31 0xAE 0x03 0xC5 0xD2 0x00 0x09 0x69 0x31 0xAF 0x03 0x7E 0xCE 0x00 0x09 0x69 0x31 0xB0 0x03 0x26 0xBF 0x00 0x09 0x69 0x31 0xB1 0x03 0x9D 0xA3 0x00 0x09 0x69 0x31 0xB2 0x03 0x50 0x86 0x00 0x09 0x69 0x31 0xB3 0x03 0xEB 0x9A 0x00 0x09 0x69 0x31 0xB4 0x03 0xCA 0xCD 0x00 0x09 0x69 0x31 0xB5 0x03 0x71 0xD1 0x00 0x09 0x69 0x31 0xB6 0x03 0xBC 0xF4 0x00 0x09 0x69 0x31 0xB7 0x03 0x07 0xEx 0x0 0x0 0x0 0x46 0x00 0x09 0x69 0x31 0xBA 0x03 0x88 0x63 0x00 0x09 0x69 0x31 0xBB 0x03 0x33 0x7F 0x00 0x09 0x69 0x31 0xBC 0x03 0x12 0x28 0x00 0x09 0x69 0x31 0xBD 0x03 0xA9 0x34 0x00 0x09 0x69 0x31 0xBE 0x03 0x64 0x11 0x00 0x09 0x69 0x31 0xBF 0x03 0xDF 0x0D 0x00 0x09 0x69 0x31 0xC0 0x03 0x63 0xE5 0x00 0x09 0x69 0x31 0xC1 0x03 0xD8 0xF9 0x00 0x09 0x69 0x31 0xC2 0x03 0x15 0xDC 0x00 0x09 0x69 0x31 0xC3 0x03 0xAE 0xC0 0x00 0x09 0x69 0x31 0xC4 0x03 0x8F 0x97 0x00 0x09 0x69 0x31 0xC5 0x03 0x34 0x8B 0x00 0x09 0x69 0x31 0xC6 0x03 0xF9 0xAE 0x00 0x09 0x69 0x31 0xC7 0x03 0x42 0xB2 0x00 0x09 0x69 0x31 0xC8 0x03 0xBB 0x00 0x00 0x09 0x69 0x31 0xC9 0x03 0x00 0x1C 0x00 0x09 0x69 0x31 0xCA 0x03 0xCD 0x39 0x00 0x09 0x69 0x31 0xCB 0x03 0x76 0x25 0x00 0x09 0x69 0x31 0xCC 0x03 0x57 0x72 0x00 0x09 0x69 0x31 0xCD 0x03 0xEC 0x6E 0x00 0x09 0x69 0x31 0xCE 0x03 0x21 0x4B 0x00 0x09 0x69 0x31 0xCF 0x03 0x9A 0x57 0x0 0x0 0x0
0x00 0x09 0x69 0x31 0xD1 0x03 0x79 0x3A 0x00 0x09 0x69 0x31 0xD2 0x03 0xB4 0x1F 0x00 0x09 0x69 0x31 0xD3 0x03 0x0F 0x03 0x00 0x09 0x69 0x31 0xD4 0x03 0x2E 0x54 0x00 0x09 0x69 0x31 0xD5 0x03 0x95 0x48 0x00 0x09 0x69 0x31 0xD6 0x03 0x58 0x6D 0x00 0x09 0x69 0x31 0xD7 0x03 0xE3 0x71 0x00 0x09 0x69 0x31 0xD8 0x03 0x1a 0xC3 0x00 0x09 0x69 0x31 0xD9 0x03 0xA1 0xDF 0x00 0x09 0x69 0x31 0xDA 0x03 0x6C 0xFA 0x00 0x09 0x69 0x31 0xDB 0x03 0xD7 0xE6 0x00 0x09 0x69 0x31 0xDC 0x03 0xF6 0xB1 0x00 0x09 0x69 0x31 0xDD 0x03 0x4D 0xAD 0x00 0x09 0x69 0x31 0xDE 0x03 0x80 0x88 0x00 0x09 0x69 0x31 0xDF 0x03 0x3B 0x94 0x00 0x09 0x69 0x31 0xE0 0x03 0x30 0x6A 0x00 0x09 0x69 0x31 0xE1 0x03 0x8B 0x76 0x00 0x09 0x69 0x31 0xE2 0x03 0x46 0x53 0x00 0x09 0x69 0x31 0xE3 0x03 0xFD 0x4F 0x00 0x09 0x69 0x31 0xE4 0x03 0xDC 0x18 0x00 0x09 0x69 0x31 0xE5 0x03 0x67 0x04 0x00 0x09 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x8F 0x00 0x09 0x69 0x31 0xE9 0x03 0x53 0x93 0x00 0x09 0x69 0x31 0xEA 0x03 0x9E 0xB6 0x00 0x09 0x69 0x31 0xEB 0x03 0x25 0xAA 0x00 0x09 0x69 0x31 0xEC 0x03 0x04 0xFD 0x00 0x09 0x69 0x31 0xED 0x03 0xBF 0xE1 0x00 0x09 0x69 0x31 0xEE 0x03 0x72 0xC4 0x00 0x09 0x69 0x31 0xEF 0x03 0xC9 0xD8 0x00 0x09 0x69 0x31 0xF0 0x03 0x91 0xA9 0x00 0x09 0x69 0x31 0xF1 0x03 0x2A 0xB5 0x00 0x09 0x69 0x31 0xF2 0x03 0xE7 0x90 0x00 0x09 0x69 0x31 0xF3 0x03 0x5C 0x8C 0x00 0x09 0x69 0x31 0xF4 0x03 0x7D 0xDB 0x00 0x09 0x69 0x31 0xF5 0x03 0xC6 0xC7 0x00 0x09 0x69 0x31 0xF6 0x03 0x0B 0xE2 0x00 0x09 0x69 0x31 0xF7 0x03 0xB0 0xFE 0x00 0x09 0x69 0x31 0xF8 0x03 0x49 0x4C 0x00 0x09 0x69 0x31 0xF9 0x03 0xF2 0x50 0x00 0x09 0x69 0x31 0xFA 0x03 0x3F 0x75 0x00 0x09 0x69 0x31 0xFB 0x03 0x84 0x69 0x00 0x09 0x69 0x31 0xFC 0x03 0xA5 0x3E 0x00 0x09 0x69 0x31 0xFD 0x03 0x1E 0x22 0x00 0x09 0x69 0x31 0xFE 0x03 0xD3 0x09 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x
0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDE 0x00 0x09 0x69 0x31 0x01 0x03 0x01 0xC2 0x00 0x09 0x69 0x31 0x02 0x03 0xCC 0xE7 0x00 0x09 0x69 0x31 0x03 0x03 0x77 0xFB 0x00 0x09 0x69 0x31 0x04 0x03 0x56 0xAC 0x00 0x09 0x69 0x31 0x05 0x03 0xED 0xB0 0x00 0x09 0x69 0x31 0x06 0x03 0x20 0x95 0x00 0x09 0x69 0x31 0x07 0x03 0x9B 0x89 0x00 0x09 0x69 0x31 0x08 0x03 0x62 0x3B 0x00 0x09 0x69 0x31 0x09 0x03 0xD9 0x27 0x00 0x09 0x69 0x31 0x0A 0x03 0x14 0x02 0x00 0x09 0x69 0x31 0x0B 0x03 0xAF 0x1E 0x00 0x09 0x69 0x31 0x0C 0x03 0x8E 0x49 0x00 0x09 0x69 0x31 0x0D 0x03 0x35 0x55 0x00 0x09 0x69 0x31 0x0E 0x03 0xF8 0x70 0x00 0x09 0x69 0x31 0x0F 0x03 0x43 0x6C 0x00 0x09 0x69 0x31 0x10 0x03 0x1B 0x1D 0x00 0x09 0x69 0x31 0x11 0x03 0xA0 0x01 0x00 0x09 0x69 0x31 0x12 0x03 0x6D 0x24 0x00 0x09 0x69 0x31 0x13 0x03 0xD6 0x38 0x00 0x09 0x69 0x31 0x14 0x03 0xF7 0x6F 0x00 0x09 0x0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x0x 0x 0x 0x 0x 0x 0x4A 0x00 0x09 0x69 0x31 0x18 0x03 0xC3 0xF8 0x00 0x09 0x69 0x31 0x19 0x03 0x78 0xE4 0x00 0x09 0x69 0x31 0x1a 0x03 0xB5 0xC1 0x00 0x09 0x69 0x31 0x1B 0x03 0x0E 0xDD 0x00 0x09 0x69 0x31 0x1C 0x03 0x2F 0x8A 0x00 0x09 0x69 0x31 0x1D 0x03 0x94 0x96 0x00 0x09 0x69 0x31 0x1E 0x03 0x59 0xB3 0x00 0x09 0x69 0x31 0x1F 0x03 0xE2 0xAF 0x00 0x09 0x69 0x31 0x20 0x03 0xE9 0x51 0x00 0x09 0x69 0x31 0x21 0x03 0x52 0x4D 0x00 0x09 0x69 0x31 0x22 0x03 0x9F 0x68 0x00 0x09 0x69 0x31 0x23 0x03 0x24 0x74 0x00 0x09 0x69 0x31 0x24 0x03 0x05 0x23 0x00 0x09 0x69 0x31 0x25 0x03 0xBE 0x3F 0x00 0x09 0x69 0x31 0x26 0x03 0x73 0x1a 0x00 0x09 0x69 0x31 0x27 0x03 0xC8 0x06 0x00 0x09 0x69 0x31 0x28 0x03 0x31 0xB4 0x00 0x09 0x69 0x31 0x29 0x03 0x8A 0xA8 0x00 0x09 0x69 0x31 0x2A 0x03 0x47 0x8D 0x00 0x09 0x69 0x31 0x2B 0x03 0xFC 0x91 0x00 0x09 0x69 0x31 0x2C 0x03 0xDD 0xC6 0x00 0x09 0x69 0x31 0x2D 0x03 0x66 0x0 0x0 0x 0 0 0
0x00 0x09 0x69 0x31 0x2F 0x03 0x10 0xE3 0x00 0x09 0x69 0x31 0x30 0x03 0x48 0x92 0x00 0x09 0x69 0x31 0x31 0x03 0xF3 0x8E 0x00 0x09 0x69 0x31 0x32 0x03 0x3E 0xAB 0x00 0x09 0x69 0x31 0x33 0x03 0x85 0xB7 0x00 0x09 0x69 0x31 0x34 0x03 0xA4 0xE0 0x00 0x09 0x69 0x31 0x35 0x03 0x1F 0xFC 0x00 0x09 0x69 0x31 0x36 0x03 0xD2 0xD9 0x00 0x09 0x69 0x31 0x37 0x03 0x69 0xC5 0x00 0x09 0x69 0x31 0x38 0x03 0x90 0x77 0x00 0x09 0x69 0x31 0x39 0x03 0x2B 0x6B 0x00 0x09 0x69 0x31 0x3A 0x03 0xE6 0x4E 0x00 0x09 0x69 0x31 0x3B 0x03 0x5D 0x52 0x00 0x09 0x69 0x31 0x3C 0x03 0x7c 0x05 0x00 0x09 0x69 0x31 0x3D 0x03 0xC7 0x19 0x00 0x09 0x69 0x31 0x3E 0x03 0x0A 0x3C 0x00 0x09 0x69 0x31 0x3F 0x03 0xB1 0x20 0x00 0x09 0x69 0x31 0x40 0x03 0x0D 0xC8 0x00 0x09 0x69 0x31 0x41 0x03 0xB6 0xD4 0x00 0x09 0x69 0x31 0x42 0x03 0x7B 0xF1 0x00 0x09 0x69 0x31 0x43 0x03 0xC0 0xED 0x00 0x0x 0x 0x 0x 0x0x 0x0x 0x0x 0x0x 0x 0 0x83 0x00 0x09 0x69 0x31 0x47 0x03 0x2C 0x9F 0x00 0x09 0x69 0x31 0x48 0x03 0xD5 0x2D 0x00 0x09 0x69 0x31 0x49 0x03 0x6E 0x31 0x00 0x09 0x69 0x31 0x4A 0x03 0xA3 0x14 0x00 0x09 0x69 0x31 0x4B 0x03 0x18 0x08 0x00 0x09 0x69 0x31 0x4C 0x03 0x39 0x5F 0x00 0x09 0x69 0x31 0x4D 0x03 0x82 0x43 0x00 0x09 0x69 0x31 0x4E 0x03 0x4F 0x66 0x00 0x09 0x69 0x31 0x4F 0x03 0xF4 0x7A 0x00 0x09 0x69 0x31 0x50 0x03 0xAC 0x0B 0x00 0x09 0x69 0x31 0x51 0x03 0x17 0x17 0x00 0x09 0x69 0x31 0x52 0x03 0xDA 0x32 0x00 0x09 0x69 0x31 0x53 0x03 0x61 0x2E 0x00 0x09 0x69 0x31 0x54 0x03 0x40 0x79 0x00 0x09 0x69 0x31 0x55 0x03 0xFB 0x65 0x00 0x09 0x69 0x31 0x56 0x03 0x36 0x40 0x00 0x09 0x69 0x31 0x57 0x03 0x8D 0x5C 0x00 0x09 0x69 0x31 0x58 0x03 0x74 0xEE 0x00 0x09 0x69 0x31 0x59 0x03 0xCF 0xF2 0x00 0x09 0x69 0x31 0x5A 0x03 0x02 0xD7 0x00 0x09 0x69 0x31 0x5B 0x03 0xB9 0xCB 0x00 0x09 0x69 0x31 0x5C 0x03 0x0 0x0 0x0 0x0 0x0
0x00 0x09 0x69 0x31 0x5E 0x03 0xEE 0xA5 0x00 0x09 0x69 0x31 0x5F 0x03 0x55 0xB9 0x00 0x09 0x69 0x31 0x60 0x03 0x5E 0x47 0x00 0x09 0x69 0x31 0x61 0x03 0xE5 0x5B 0x00 0x09 0x69 0x31 0x62 0x03 0x28 0x7E 0x00 0x09 0x69 0x31 0x63 0x03 0x93 0x62 0x00 0x09 0x69 0x31 0x64 0x03 0xB2 0x35 0x00 0x09 0x69 0x31 0x65 0x03 0x09 0x29 0x00 0x09 0x69 0x31 0x66 0x03 0xC4 0x0C 0x00 0x09 0x69 0x31 0x67 0x03 0x7F 0x10 0x00 0x09 0x69 0x31 0x68 0x03 0x86 0xA2 0x00 0x09 0x69 0x31 0x69 0x03 0x3D 0xBE 0x00 0x09 0x69 0x31 0x6A 0x03 0xF0 0x9B 0x00 0x09 0x69 0x31 0x6B 0x03 0x4B 0x87 0x00 0x09 0x69 0x31 0x6C 0x03 0x6A 0xD0 0x00 0x09 0x69 0x31 0x6D 0x03 0xD1 0xCC 0x00 0x09 0x69 0x31 0x6E 0x03 0x1C 0xE9 0x00 0x09 0x69 0x31 0x6F 0x03 0xA7 0xF5 0x00 0x09 0x69 0x31 0x70 0x03 0xFF 0x84 0x00 0x09 0x69 0x31 0x71 0x03 0x44 0x98 0x00 0x09 0x69 0x31 0x72 0x03 0x89 0xBD 0x00 0x09 0x69 0x0 0x0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0xEA 0x00 0x09 0x69 0x31 0x76 0x03 0x65 0xCF 0x00 0x09 0x69 0x31 0x76 0x03 0x65 0xCF 0x00 0x09 0x69 0x31 0x77 0x03 0xDE 0xD3 0x00 0x09 0x69 0x31 0x78 0x03 0x27 0x61 0x00 0x09 0x69 0x31 0x79 0x03 0x9C 0x7D 0x00 0x09 0x69 0x31 0x7A 0x03 0x51 0x58 0x00 0x09 0x69 0x31 0x7B 0x03 0xEA 0x44 0x00 0x09 0x69 0x31 0x7c 0x03 0xCB 0x13 0x00 0x09 0x69 0x31 0x7D 0x03 0x70 0x0F 0x00 0x09 0x69 0x31 0x7E 0x03 0xBD 0x2A 0x00 0x09 0x69 0x31 0x7F 0x03 0x06 0x36 0x00 0x09 0x69 0x31 0x80 0x03 0xD4 0xF3 0x00 0x09 0x69 0x31 0x81 0x03 0x6F 0xEF 0x00 0x09 0x69 0x31 0x82 0x03 0xA2 0xCA 0x00 0x09 0x69 0x31 0x83 0x03 0x19 0xD6 0x00 0x09 0x69 0x31 0x84 0x03 0x38 0x81 0x00 0x09 0x69 0x31 0x85 0x03 0x83 0x9D 0x00 0x09 0x69 0x31 0x86 0x03 0x4E 0xB8 0x00 0x09 0x69 0x31 0x87 0x03 0xF5 0xA4 0x00 0x09 0x69 0x31 0x88 0x03 0x0C 0x16 0x00 0x09 0x69 0x31 0x89 0x03 0xB7 0x0A 0x00 0x09 0x69 0x31 0x8A 0x03 0x7 0xx 0x0x 0x0x 0x0
0x00 0x09 0x69 0x31 0x8C 0x03 0xE0 0x64 0x00 0x09 0x69 0x31 0x8D 0x03 0x5B 0x78 0x00 0x09 0x69 0x31 0x8E 0x03 0x96 0x5D 0x00 0x09 0x69 0x31 0x8F 0x03 0x2D 0x41 0x00 0x09 0x69 0x31 0x90 0x03 0x75 0x30 0x00 0x09 0x69 0x31 0x91 0x03 0xCE 0x2C 0x00 0x09 0x69 0x31 0x92 0x03 0x03 0x09 0x00 0x09 0x69 0x31 0x93 0x03 0xB8 0x15 0x00 0x09 0x69 0x31 0x94 0x03 0x99 0x42 0x00 0x09 0x69 0x31 0x95 0x03 0x22 0x5E 0x00 0x09 0x69 0x31 0x96 0x03 0xEF 0x7B 0x00 0x09 0x69 0x31 0x97 0x03 0x54 0x67 0x00 0x09 0x69 0x31 0x98 0x03 0xAD 0xD5 0x00 0x09 0x69 0x31 0x99 0x03 0x16 0xC9 0x00 0x09 0x69 0x31 0x9A 0x03 0xDB 0xEC 0x00 0x09 0x69 0x31 0x9B 0x03 0x60 0xF0 0x00 0x09 0x69 0x31 0x9C 0x03 0x41 0xA7 0x00 0x09 0x69 0x31 0x9D 0x03 0xFA 0xBB 0x00 0x09 0x69 0x31 0x9E 0x03 0x37 0x9E 0x00 0x09 0x69 0x31 0x9F 0x03 0x8C 0x82 0x00 0x09 0x69 0x31 0xA0 0x03 0x87 0x7C 0x00 0x09 0x0 0x0 0x0 0x0 0x0 0x0 0x59 0x00 0x09 0x69 0x31 0xA4 0x03 0x6B 0x0E 0x00 0x09 0x69 0x31 0xA5 0x03 0xD0 0x12 0x00 0x09 0x69 0x31 0xA6 0x03 0x1D 0x37 0x00 0x09 0x69 0x31 0xA7 0x03 0xA6 0x2B 0x00 0x09 0x69 0x31 0xA8 0x03 0x5F 0x99 0x00 0x09 0x69 0x31 0xA9 0x03 0xE4 0x85 0x00 0x09 0x69 0x31 0xAA 0x03 0x29 0xA0 0x00 0x09 0x69 0x31 0xAB 0x03 0x92 0xBC 0x00 0x09 0x69 0x31 0xAC 0x03 0xB3 0xEB 0x00 0x09 0x69 0x31 0xAD 0x03 0x08 0xF7 0x00 0x09 0x69 0x31 0xAE 0x03 0xC5 0xD2 0x00 0x09 0x69 0x31 0xAF 0x03 0x7E 0xCE  

Jeg har prøvd "hevn" på disse meldingene uten hell. Dette utstyret ble designet for å fungere med en PC, så jeg tror vi jobber med små endianbytes.

På PC-en min kan jeg duplisere disse meldingene for å etterligne senderutstyret og mottaksutstyret godtar dem. Jeg kan prefikse meldingene med et antall 0x00 byte, og mottaksutstyret godtar dem. Hvis jeg endrer litt i meldingen, inkludert mulige CRC-byte, mottaker utstyr avviser dem (mottakeren sender en enkel OK-melding hvis den godtar meldingen, ellers svarer den ikke i det hele tatt.)

På PC-en har jeg tatt en av meldingene og sendt den til mottakeren med hver mulige to byte på slutten. Mottakeren avviser alle meldinger unntatt meldingen med de to siste byte som er den samme som den opprinnelige meldingen.

Disse to bytene er viktige. Kanskje de er en slags kontrollsum, snarere en CRC.

Jeg har brukt to år på å gå gjennom det omvendte engineringsdokumentet skrevet av Greg Ewing http://www.cosc.canterbury.ac.nz/ greg.ewing / essays / CRC-Reverse-Engineering.html og jeg kan gjøre noen fremskritt etter hans metode, men fremgangen min blir til slutt.

Jeg vil ikke si noe om hva Gregs metode hjalp meg med å finne fordi jeg gjorde det galt. Hvis noen mener at det kan være nyttig, vil jeg legge det ut her.

Hvis jeg slår av utstyret og så slår det på igjen og får den samme beskjeden igjen, er de to siste byte like hver gang Jeg gjør dette.

Så jeg håper at jeg kan få flere tips her på Reverse Engineering Stack Exchange.

Enrico

Er det noen form for dokumentasjon for senderen din? Har den oppgraderbar firmware, eller en eprom-brikke som kan tas ut og leses? Å reversere fastvaren til senderen kan være vanskelig, men ikke så vanskelig i forhold til de to årene dine (selv om jeg antar at det ikke var to år med en jobb på 8 timer per dag ...)
To svar:
Enrico Biscotti
2014-11-25 08:28:07 UTC
view on stackexchange narkive permalink

Jeg skjønte det! Noen av kommentarene på dette nettstedet fikk meg til å tenke hardere - faktisk å tenke annerledes.

Jeg tenkte at jeg skulle legge ut analysen jeg gjorde på disse meldingene for å prøve å bestemme CRC-algoritmen.

Analysen min er basert på et papir skrevet av Greg Ewing http://www.cosc.canterbury.ac.nz/greg.ewing/essays/CRC-Reverse-Engineering.html. Han presenterte mye innsikt i papiret. Jeg vil ikke gjenta det han skrev, bortsett fra å oppsummere og forklare resultatene mine ved hjelp av hans metode. Så følg med papiret hans mens jeg presenterer dataene mine.

Han viste at CRCs "adlyder et slags superposisjonsprinsipp. Du kan tenke på CRC som består av det eksklusive eller et sett med komponent CRC-er, som hver avhenger av bare en bit i meldingen.

Han viste hvor, for XorIn = XorOut = 0x0000, at:

C1 xor C2 = M1 xor M2where: Cx = CRC Mx = meldinger av samme lengde

Han kalte "M1 xor M2" en forskjellmelding.

Greg skrev: "Så kom jeg inn i en samtale med Patrick Maupin, som foreslo en test som kan bidra til å avklare om det var en ekte CRC eller ikke. På grunn av superposisjonsprinsippet, hvis endring av en melding ved å xore den med et bitmønster B1 får CRC til å endre seg med C1, og et annet bitmønster B2 får CRC til å endre seg med C2, bør xoring av meldingen med (B1 xeller B2) endre CRC med (C1 xeller C2). Hvis dette ikke skjer, kan ikke algoritmen være en vanlig CRC-algoritme. "

Ved å bruke disse 4-meldingene fra sender til mottakerbitstrøm:

  CRC LSB MSB ---- ---- ---- ---- ---- ---- ---- ---- M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDEM1 0x00 0x09 0x69 0x31 0x01 0x03 0x01 0xC2M2 0x00 0x09 0x69 0x31 0x02 0x03 0xCC 0xE7M3 0x00 0x09 0x69 0x31 0x03 0x03 0x77 0xFB ---- ---- ---- ---- ---- ---- ---- ---- ----  kode> 

Deretter,

  CRC
LSB MSB ---- ---- ---- ---- ---- ---- ---- M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDEB1 0x00 0x00 0x00 0x00 0x01 0x00 - ----------- XOR ------------ M1 0x00 0x09 0x69 0x31 0x01 0x03 0x01 0xC2 C1 = 0xDEBA xor 0xC201 = 0x1CBB  

og et annet bitmønster B2 får CRC til å endres med C2,

  CRC LSB MSB ---- ---- ---- ---- ---- --- --- - ---- ---- M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDEB2 0x00 0x00 0x00 0x00 0x02 0x00 ------------ XOR ------------ M2 0x00 0x09 0x69 0x31 0x02 0x03 0xCC 0xE7C2 = 0xDEBA xor 0xE7CC = 0x3976C1 xor C2 = 0x1CBB xor 0x3976 = 0x25CD  

deretter xoring pakken med B3 = (B1 x C3 = (C1 xor C2). Hvis det ikke skjer, kan ikke algoritmen være en vanlig CRC-algoritme.

  CRC LSB MSB ---- ---- --- - ---- ---- ---- ---- ---- B1 0x00 0x00 0x00 0x00 0x 01 0x00B2 0x00 0x00 0x00 0x00 0x02 0x00 ------------ XOR ------------ B3 0x00 0x00 0x00 0x00 0x03 0x00M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDEB3 0x00 0x00 0x00 0x00 0x03 0x00 ------------ XOR ------------ M3 0x00 0x09 0x69 0x31 0x03 0x03 0x77 0xFBC3 = 0xDEBA xor 0xFB77 = 0x25CD Gjør C3 = 0x25CD == C1 XOR C2 = 0x25CD? Ja  

Når det gjelder denne serielle strømmen, skjer det så det må være en vanlig CRC-algoritme.

Greg skrev: "Vurder nå to CRC-verdier hentet fra to 1-bit-meldinger, der de 1 bitene er i tilstøtende posisjoner. De resulterende CRC-ene vil variere med bare en skift-xor-syklus. For å være presis, hvis C1 tilsvarer meldingen med en 1 i posisjon i, og C2 tilsvarer melding med en 1 i posisjon i + 1, da er C1 avledet fra å bruke en shift-xor-syklus på C2. (Hvis dette virker bakover, er det fordi jo lenger 1-biten er fra slutten av meldingen, jo mer shift-xor sykluser blir brukt på CRC.)

Det er to muligheter. Hvis den fremre biten av C2 (den som skal skiftes ut) er 0, vil C1 være lik C2 forskjøvet med ett sted. Hvis det er 1, vil C2 være lik C1 forskjøvet ett sted og xored med polynomet. "

Jeg konstruerte flere forskjellmeldinger som bare skilte seg fra en bit ved hjelp av dataene fra mitt første innlegg her.

  CRC LSB MSB ---- ---- ---- ---- ---- ---- ---- ---- M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDEM1 0x00 0x09 0x69 0x31 0x01 0x03 0x01 0xC2 ---- ---- ---- ---- ---- ---- ---- ---- D01 0 0 0 0 0x01 0 0xBB 0x1C ---- ---- ---- ---- ---- ---- ---- ---- M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDEM2 0x00 0x09 0x69 0x31 0x02 0x03 0xCC 0xE7 ---- ---- ---- ---- ---- ---- ---- ---- D02 0 0 0 0 0x02 0 0x76 0x39 ---- ---- ---- ---- ---- ---- ---- ---- M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDEM3 0x00 0x09 0x69 0x31 0x04 0x03 0x56 0xAC ---- ---- - --- ---- ---- ---- ---- ---- D04 0 0 0 0 0x04 0 0xEC 0x72 ---- ---- ---- ---- - - ---- ---- --- -M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDEm8 0x00 0x09 0x69 0x31 0x08 0x03 0x62 0x3B ---- ---- ---- ---- ---- ---- ---- ---- ---- D08 0 0 0 0 0x08 0 0xD8 0xE5 ---- ---- ---- ---- ---- ---- ---- ---- M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDEM10 0x00 0x09 0x69 0x31 0x10 0x03 0x1B 0x1D ---- ---- ---- ---- ---- ---- ---- ---- D10 0 0 0 0 0x10 0 0xA1 0xC3 - --- ---- ---- ---- ---- ---- ---- ---- M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDEM20 0x00 0x09 0x69 0x31 0x20 0x03 0xE9 0x51 - - ---- ---- ---- ---- ---- ---- ---- D20 0 0 0 0 0x20 0 0x53 0x8f ---- ---- --- - ---- ---- ---- ---- ---- M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDEM40 0x00 0x09 0x69 0x31 0x40 0x03 0x0D 0xC8 ---- ---- ---- ---- ---- ---- ---- ---- ---- D40 0 0 0 0 0x40 0 0xB7 0x16
---- ---- ---- ---- ---- ---- ---- ---- M0 0x00 0x09 0x69 0x31 0x00 0x03 0xBA 0xDEM80 0x00 0x09 0x69 0x31 0x80 0x03 0xD4 0xF3 - --- ---- ---- ---- ---- ---- ---- ---- D80 0 0 0 0 0x80 0 0x6e 0x2d  

Jeg kom opp med disse CRC-verdiene for differansemeldingene med vist byte:

  Byte CRC (med bytebytte til MSB-LSB-rekkefølge) ----- ---- 01 1CBB 02 3976 LSB av CRC = 004 72EC LSB av CRC = 008 E5D8 LSB av CRC = 010 C3A1 LSB av CRC = 120 8F53 LSB av CRC = 140 16b7 LSB av CRC = 180 2d6e Lsb av CRC = 0  

Greg forklarte at når LSB er en 0, er den foregående CRC en bit riktig forskyvning av denne CRC. Hvis LSB er en 1, er den forrige CRC den gjeldende CRC xor'ed med polynomet og deretter skiftet til høyre.

  Byte CRC shift xor Previous CRC ----- ---- ---- ---- ---- 01 1CBB 02 3976 1CBB 0000 1CBB04 72EC 3976 0000 397608 E5D8 72EC 0000 72EC10 C3A1 61D0 8408 E5D820 8F53 47A9 8408 C3A140 16b7 0B5B 8408 8F5380 2d6e 16B7 0000 16b7  

Dette fortalte meg at polynomet var 0x8408.

Neste setning omskriver det Greg skrev: "Skiftende retning indikerer at ReflectOut-parameteren skal være sann, siden skifting til høyre tilsvarer bruk av den kanoniske venstreskiftende versjonen av algoritmen med polynomet 0x1021 og deretter reflekterer den resulterende CRC. Det er bemerkelsesverdig at 0x1021 er en av standard 16-biters polynomene - den som kalte "CRC-16-CCITT" og også kjent som "KERMIT". "

Så Greg har hjulpet meg å komme ganske langt sammen med anaen min lysis. Det ser sikkert ut som om det er en CRC og den mest sannsynlige CRC-16-CCITT eller Kermit (i det minste hvis init = XorOut = 0x0000).

Men selvfølgelig, da jeg prøvde å kjøre meldingene mine gjennom RevEng og ba den bruke KERMIT-algoritmen, stemte ikke de faktiske CRC-ene fra meldingene med det RevEng genererte.

For eksempel ved bruk av D01 melding:

d:> reveng -c -m kermit 000000000100 returnerer d819

Gregs analyse av problemet hans indikerte at det kan være noen byte inkludert i CRC-beregningen som ikke er synlige. I Gregs tilfelle skrev han: "Jeg kom på følgende ide. Begynn med å initialisere registeret med polynomet - dette tilsvarer tilstanden like etter å ha møtt 1 i en 1-bit forskjellsmelding. Kjør deretter algoritmen og tell antall trinn som kreves før den kjente CRC-verdien er nådd. Forutsatt at den til slutt ble nådd, ville det fortalt meg hvor mange 0 bits som fulgte 1 var inkludert i CRC. "

Så jeg sa kanskje dette ville fungere for meg. Så jeg la til 00 byte på slutten av meldingen D01:

d:> reveng -c -m kermit 00000000010000 returnerer dc5a

d:> reveng -c -m kermit 0000000001000000 returnerer bb1c

WOW, 0xbb1c er CRC-verdien som jeg får når jeg xeller de to faktiske CRC-ene fra M0 og M1. (Jeg kan legge til 0x00 byte i differansemeldingen hvis de faktiske bytene i de faktiske meldingene er de samme og er 0x00 etter at de er xorert i differansemeldingen. Og jeg må huske at denne analysen fortsatt krever at init og XorOut er null, og det er kanskje ikke tilfelle i den faktiske algoritmen.

Så jeg brukte omtrent et år (nei, ikke heltid) på å finne verdien av ekstra byte. Jeg skrev et program som prøvde alle kombinasjoner av ekstra byte men jeg verdiene deres hoppet over alt. Jeg kommer til å utelate alt jeg gjorde for å finne de ekstra byte. Det var en blindvei.

** Dette var jeg var da jeg la min problembeskrivelse på denne nettsiden. **

Kanskje jeg fremdeles ikke hadde de riktige databytes i riktig posisjon eller kanskje antagelsen om at init = XorOut = 0x0000 ikke var sant.

Så jeg bestemte meg for å prøve flere meldinger. Jeg laget en haug med meldinger der jeg kunne kontrollere verdien av 2. byte. Her er meldingene jeg klarte å generere:

  CRC LSB MSB ---- ---- ---- ---- ---- ---- ---- - - ---- ---- ---- ---- 0x00 0x02 0x77 0x32 0x97 0x13 0x22 0x8D 0x00 0x04 0x77 0x32 0x97 0x13 0x14 0xE8 0x00 0x08 0x77 0x32 0x97 0x13 0x78 0x22 0x00 0x10 0x77 0x32 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x00 0x20 0x77 0x32 0x97 0x13 0x32 0x8F 0x00 0x40 0x77 0x32 0x97 0x13 0x34 0xEC 0x00 0x06 0x77 0x32 0x97 0x13 0x06 0xCB 0x00 0x0A 0x77 0x32 0x97 0x13 0x6A 0x01 0x00 0x12 0x77 0x32 0x97 0x13 0xA3 0x9D 0x00 0x22 0x77 0x32 0x97 0x13 0x20 0xAC 0x00 0x42 0x77 0x32 0x97 0x13 0x26 0xCF  

Og her er forskjellsmeldingene:

  CRC LSB MSB ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- M02a 0x00 0x02 0x77 0x32 0x97 0x13 0x22 0x8DM03a 0x00 0x03 0x77 0x32 0x97 0x13 0xAB 0x9C ---- ---- ---- ---- ---- ---- ---- ---- ---- - --- ---- D01a 0x00 0x01 0x00 0x00 0x00 0x00 0x89 0x11 LSB MSB ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 0x00 0x04 0x77 0x32 0x97 0x13 0x14 0xE8 0x00 0x06 0x77 0x32 0x97 0x13 0x06 0xCB ---- ---- ---- ---- ---- - - ---- ---- ---- ---- ---- 0x00 0x02 0x00 0x00 0x00 0x00 0x12 0x23 LSB MSB ---- ---- ---- ---- - - ---- ---- ---- ---- ---- ---- 0x00 0x02 0x77 0x32 0x97 0x13 0x22 0x8D
0x00 0x06 0x77 0x32 0x97 0x13 0x06 0xCB ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- - - 0x00 0x04 0x00 0x00 0x00 0x00 0x24 0x46 LSB MSB ---- ---- ---- ---- ---- ---- ---- ---- ---- - - ---- 0x00 0x02 0x77 0x32 0x97 0x13 0x22 0x8D 0x00 0x0A 0x77 0x32 0x97 0x13 0x6A 0x01 ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 0x00 0x08 0x00 0x00 0x00 0x00 0x48 0x8C LSB MSB ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 0x00 0x02 0x77 0x32 0x97 0x13 0x22 0x8D 0x00 0x12 0x77 0x32 0x97 0x13 0xA3 0x9D ---- ---- ---- - - ---- ---- ---- ---- ---- ---- ---- 0x00 0x10 0x00 0x00 0x00 0x00 0x81 0x10 LSB MSB ---- ---- - - ---- ---- ---- ---- ---- ---- ---- ---- 0x00 0x02 0x77 0x32 0x97 0x13 0x22 0x8D 0x00 0x22 0x77 0x32 0x97 0x13 0x20 0xAC ---- ---- ---- ---- ---- ---- ---- ---- ---- - - ---- 0x00 0x20 0x00 0x00 0x00 0x00 0x02 0x21 LSB MSB ---- ---- ---- ---- ---- ---- ---- ---- - - ---- ---- 0x00 0x02 0x77 0x32 0x97 0x13 0x22 0x8D 0x00 0x42 0x77 0x32 0x97 0x13 0x26 0xCF ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 0x00 0x40 0x00 0x00 0x00 0x00 0x04 0x42  

Så gjorde jeg den samme analysen på CRC-ordene og kom opp med samme polynominal som før: 0x8408 eller når forskjøvet den andre retningen, 0x1021

  Byte CRC (med bytebytte til MSB-LSB-rekkefølge) ----- ---- 0x01 11890x02 2312 LSB av CRC = 00x04 4624 LSB av CRC = 00x08 8C48 LSB av CRC = 00x10 1081 LSB av CRC = 10x20 2102 LSB av CRC = 00x40 4204 LSB av CRC = 0Byte CRC skift xeller tidligere CRC
----- ---- ---- ---- ---- 0x01 11890x02 2312 1189 0000 11890x04 4624 2312 0000 23120x08 8C48 4624 0000 46240x10 1081 0840 8408 8C48 0x20 2102 1081 0000 10810x40 4204 2102 0000 2102  kode> 

Her er alle RockSoft CRC-modellene med denne polyen, jeg må tenke forbi Kermit:

  width = 16 poly = 0x1021 init = 0x0000 refin = false refout = false xorout = 0x0000 check = 0x31c3 name = "XMODEM" width = 16 poly = 0x1021 init = 0x0000 refin = true refout = true xorout = 0x0000 check = 0x2189 name = "KERMIT" width = 16 poly = 0x1021 init = 0x1d0f refin = false refout = false xorout = 0x0000 check = 0xe5cc name = "CRC-16 / AUG-CCITT" width = 16 poly = 0x1021 init = 0x89ec refin = true refout = true xorout = 0x0000 check = 0x26b1 name = "CRC-16 / TMS37157 "width = 16 poly = 0x1021 init = 0xb2aa refin = true refout = true xorout = 0x0000 check = 0x63d0 name =" CRC-16 / RIELLO "width = 16 poly = 0x1021 init = 0xc6c6 refin = true refout = true xorout = 0x00 00 check = 0xbf05 name = "CRC-A" width = 16 poly = 0x1021 init = 0xffff refin = false refout = false xorout = 0x0000 check = 0x29b1 name = "CRC-16 / CCITT-FALSE" width = 16 poly = 0x1021 init = 0xffff refin = false refout = false xorout = 0xffff check = 0xd64e name = "CRC-16 / GENIBUS" width = 16 poly = 0x1021 init = 0xffff refin = true refout = true xorout = 0x0000 check = 0x6f91 name = "CRC-16 / MCRF4XX "width = 16 poly = 0x1021 init = 0xffff refin = true refout = true xorout = 0xffff check = 0x906e name =" X-25 " 

Jeg la merke til noe med dette nyeste settet med meldinger. De to ekstra bytene var ikke nødvendig for å få riktig CRC for differansemeldingene hvis jeg bare brukte den første byten og slapp de andre 0x00 byte. Bruker RevEng på melding D01a:

D:> reveng -s -w 16 018911width = 16 poly = 0x1021 init = 0x0000 refin = true refout = true xorout = 0x0000 check = 0x2189 name = "KERMIT"

Da skjønte jeg at hvis jeg mater meldingen inn i CRC-generatoren i omvendt byte-rekkefølge, min opprinnelige D01-melding genererte riktig CRC.

D:> reveng -c -m kermit 01000000bb1c

Så disse bytene som jeg trodde var ekstra byte var egentlig bare byte av meldingen, men meldingen var å behandles i omvendt byte-rekkefølge.

Kan dette være sant?

Jeg tok M02a og M03a, og matet dem inn i RevEng i omvendt byte-rekkefølge:

D :> reveng -s -w 16 1397327702228dwidth = 16 poly = 0x1021 init = 0xffff refin = true refout = true xorout = 0x0000 check = 0x6f91 name = "CRC-16 / MCRF4XX"

D:> reveng - s -w 16 1397327703ab9cwidth = 16 poly = 0x1021 init = 0xffff refin = true refout = true xorout = 0x0000 check = 0x6f91 name = "CRC-16 / MCRF4XX"

Og det som falt ut overrasket meg, init var alle og algoritmen hadde den samme polyen som jeg tidligere fant. Algoritmen var fra MCRF4xx-kommunikasjon (som nå ser jeg fornuftig fordi RS-232-linjen som jeg sporer erstattet en RF-forbindelse).

MCRF4xx er en RFID-protokoll.

Meldingen blir tatt som et langt sett med bits slik at den siste byten behandles først og den første byten behandles sist. 0x00 byte i begynnelsen av meldingen brukes ikke. Med init = 0xffff vil MCRF4xx-algoritmen oppdage ekstra eller manglende ledende nuller.

Jeg prøvde denne algoritmen på et par dusin av meldingene, og den får riktig CRC hver gang.

Her er en kodebit som jeg fant på http://www.snip2code.com/Snippet/86260/Simple-CRC-16-MCRF4XX-C-implementation-

  #include #include uint16_t crc16_mcrf4xx (uint16_t crc, uint8_t * data, size_t len) {if (! data || len> 1) ^ 0x8408; annet crc = (crc >> 1); }} returner crc; }  

En webside på RevEng-nettstedet, peker på noen dokumenter om MCRF4xx: http://reveng.sourceforge.net/crc-catalogue/16.htm.

Takk til alle som sendte positiv energi min vei.

Godt jobbet. Jeg har alltid sagt at utholdenhet er en av de viktigste egenskapene til enhver omvendt ingeniør. For mange gir opp når de er mye nærmere løsningen enn de tror.
Eric Smith
2014-11-19 18:07:31 UTC
view on stackexchange narkive permalink

Jeg skrev mitt eget CRC brute-forcing-program i 2004, men det er ganske spesialisert for et bestemt problem. Det er en mye bedre generell bruk tilgjengelig som åpen kildekode på https://github.com/sitsec/bruteforce-crc

Du bør kunne samle noen forskjellige eksempler overførte pakker og mate dem gjennom dette programmet. For en 16-biters CRC er det ganske raskt. Jeg har ikke prøvd det på lengre CRC-er.

Jeg har sett på det programmet, men jeg har ikke boost-bibliotekene installert, og jeg har ikke en C-kompilator for å kompilere dem.
Jeg har utført det jeg tror er den samme funksjonen ved hjelp av RevEng. Jeg fant ut at det ikke er noen vanlig algoritme blant disse og andre meldinger. Det vil si at for en melding får jeg en algoritme som: poly = 0x440b init = 0xf14a refin = false refout = false xorout = 0x0000 mens jeg med en annen melding får: poly = 0x17d3 init = 0x2aa1 refin = true refout = true xorout = 0x0000
Prøver RevEng forskjellige initialiseringer og endelige XOR-verdier, normal og reflektert struktur, etc.? Hvis det gjør det, og det ikke var noen fellestrekk, ville det antyde at sjekken deres ikke er en sann CRC.
Ja, RevEng vil prøve alle init- og XorOut-verdier i søket.


Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...