Protokoll visszafejtés (Legális fejtörő)

Fórumok

Üdv,

Lenne nekünk egy gépünk aminek van egy protokollja, aminek nincs meg a forráskódja,
és most kommunikálni kellene vele egy új szoftverből is, és a checksum-ot kellene
kiszámolnom.

Az alábbiak ismertek :

A checksum úgy keletkezik, hogy a karakterek értékét összeadom és hozzáadok 0xD-t.

pl.:
RDY -> R(0x52) + D(0x44) + Y(0x59) + 0xD = 0xFC ebből lesz 0xFC
SYN -> S(0x53) + Y(0x59) + N(0x4E) + 0xD = 0x107 ebből lesz 0x87
RTD -> R(0x52) + T(0x54) + D(0x44) + 0xD = 0xF7 ebből lesz 0x77
GTD -> G(0x47) + T(0x54) + D(0x44) + 0xD = 0xEC ebből lesz 0xEC
RTY1-> R(0x52) + T(0x54) + Y(0x59) + 1(0x31) + 0xD = 0x13D ebből lesz 0x3D

Ehhez vannak 8 bites regisztereink, meg carry meg overflow meg parity bitjeink.

Szóval aki kedvet érez egy kis fejtörő megoldására az írjon ide pár sort.

Előre is köszönöm mindenkinek.

Update:

Akkor a feladat pontosabb meghatározása.
Adott egy gép ami kommunikál, minden kommunikációs csomagot egy
checksum zár le, ennek a checksumnak a kiszámítása az örök bitmezőkre
távozott, és én azt a feladatot kaptam, hogy írjak egy progit
ami ezzel a géppel kommunikál, eddig minden megvan, csak az a fránya
checksum számító algoritmusom nincs meg. Ezt kell kitalálnom.
És adott az egyszerű összegzéssel kapott checksum pl. RDY esetén
0xFC, csakhogy a gép az RDY üzenet esetén checksumként a 0xFC bájtot
várja, a feladat egy olyan algoritmus amely a checksumból az 'ebből lesz'
értéket előállítja.

A 0xD valóban azért kell, mert ez a termináló karakter a protokollban.

Előre is köszi.

Update: 2 További példák

Ezek kicsit hosszúak, de az algoritmust jobban lehet rajta tesztelni.

SAT11 000007D00032000A00050014000A006400050000A0A0 00 -> 0xB4 kellene, hogy legyen
SAT139 000007D00032000A00050014000A006400050000A0A0 00 -> 0xCF kellene, hogy legyen
SAT135 000007D00032000A00050014000A006400050000A0A0 00 -> 0xCB kellene, hogy legyen

Előre is köszi.

Hozzászólások

Számomra nem igazán derült ki, hogy itt mi is a feladat de a 0xD a \n (sorvége, enter) kódja szokott lenni ...

én itt az "ebből lesz"-et nem értem, ha már tudjuk checksum keletkezését, akkor mi ez a másik szám.

modulo 0x100 után ha kapott & 0x10 = 0x10, akkor msb-t invertál

(ha az utolsó el van írva, és 0xBD, akkor ennél egyszerűbb)

igen ha az 0xBD lenne, annak én is nagyon örülnék :)
--
"Megtanultam a zenét, de nem csináltam, s azóta tudással, de irigység nélkül hallgatom.
Megtanultam egy sereg tudományt, mesterséget és művészetet, értek hozzájuk, de nem csinálom, s így érdektelenül tudom azokat élvezni. "
Hamvas Béla

Igen, csak nekem az 'ebből lesz' byte-ot kell elküldenem. Amit nem tudok, az az,
hogy milyen aritmetikai műveletek során jön ki az 'ebből lesz' érték.

--
"Megtanultam a zenét, de nem csináltam, s azóta tudással, de irigység nélkül hallgatom.
Megtanultam egy sereg tudományt, mesterséget és művészetet, értek hozzájuk, de nem csinálom, s így érdektelenül tudom azokat élvezni. "
Hamvas Béla

A srác úgy érti, hogy ki kell számolni az

RDY\r checksum-ját.
ami összegzés lenne, de neki 8bites chsum-ot kell számolnia.

R(0x52) + D(0x44) + Y(0x59) + 0xD = ???
A gép szerint ennek a chsum-ja 0xFC és az a kérdés, hogy ez hogyan jön ki neki.

A gép szerint a következő üzenetek chsum-ja

SYN\r = 0x87
RTD\r = 0x77
GTD\r = 0xEC
RTY1\r = 0x3D

A kérdés, hogy ezek az értékek, hogyan jönnek ki a gépnek?

Ha kommunikálni akarsz vele, akkor nem értem miért neked az "ebből lesz". Te akarsz üzenetet küldeni vagy ellenőrizni, ahhoz ki kell számítani a checksumot, de minek az inverz?

Egyértelmű inverz függvény erre nincs. Mivel egy tetszőleges X értéket úgy is kaphatod, hogy X + 0x00 + 0x00 + 0xFF de úgy is, hogy X + 0xFF + 0x00 + 0xFF stb. Bármelyik checksumra végtelen sok jó megoldás van, amiből lehetett. (Ha korlátos hosszúak az üzenetek, akkor a lehetőségek száma itt is korlátos.)

Legegyszerűbb megoldás a brute force: 8 bites értékekből kipróbálni mind a 255-t nem túl megterhelő. Ennél gyorsabb, ha visszafelé számolsz a checksumból. Az össszeadás inverz művelete a kivonás. Vond ki a checksumból amit biztosan tudsz, hogy benne volt (pl. a \n-t). Ami megmarad, az tetszőleges olyan számok összeadásából keletkezhetett, ami ezt az összeget adja.

--
The Net is indeed vast and infinite...
http://gablog.eu

A gép szerint ezek a checksum-ok

RDY -> R(0x52) + D(0x44) + Y(0x59) + 0xD = 0xFC
SYN -> S(0x53) + Y(0x59) + N(0x4E) + 0xD = 0x87
RTD -> R(0x52) + T(0x54) + D(0x44) + 0xD = 0x77
GTD -> G(0x47) + T(0x54) + D(0x44) + 0xD = 0xEC
RTY1-> R(0x52) + T(0x54) + Y(0x59) + 1(0x31) + 0xD = 0x3D

Ezek 8 bitesek. A kérdés, hogyan jönnek ki ezek az értékek?

Mintha a carry alapján addig vonna ki 0x80 -at (128), hogy 8 bites maradjon az összeg.
try it.

Ez milyen device-hoz van amugy?
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

ha az összegnél (a 0xd-vel együtt) van átvitel másik bájtra, akkor kivonunk 0x80-at, valamint ha az alsó bitje 1, akkor szintén kivonunk 0x80-at?
vagy túl fáradt vagyok.

szerk: ja, ez nem jó :) akkor fáradt vagyok.

----------------------------------
feel the beat - it's everywhere!

írtam még egy kettőt, de az hosszú.

tesztelek még egy két rövidet.

köszi.

--
"Megtanultam a zenét, de nem csináltam, s azóta tudással, de irigység nélkül hallgatom.
Megtanultam egy sereg tudományt, mesterséget és művészetet, értek hozzájuk, de nem csinálom, s így érdektelenül tudom azokat élvezni. "
Hamvas Béla

SYN //87
RDY //FC
RTD //77
RTY1 //3D
GTD //EC

RST // 86
EOD // 65
SAT01 000007D00032000A00050014000A006400050000A0A0 00 // 33
SAT11 000007D00032000A00050014000A006400050000A0A0 00 // B4
SAT139 000007D00032000A00050014000A006400050000A0A0 00 // CF
SAT135 000007D00032000A00050014000A006400050000A0A0 00 // CB

Plusz minden sor végén a 0x0D amit még hozzá kell adni.

Az nem lehet, hogy hibás kommunikációt figyeltél meg? Ez egy sima modulo 256 checksumnak néz ki, a legtöbb csomagnál stimmel, néha van egy bit eltérés. Leht, hogy ezeknél kommunikációs hiba van.

--
Soli Deo Gloria