Programozástechnika: A ZotyoCopy lelki világa

4 csillagos Cikk értékelése: 4,90 (31 szavazatból)

Egy napon Bali felcsigázott a kérdéssel, miszerint mi lehet a különbség a ZotyoCopy+ és a Zotyo 3.1 között. Gräff Zoltán (Zotyó) az interjúban ugyan utalt az eltérésekre, de érdekesnek ígérkezett a feladat a programok összehasonlítására, így elvállaltam a munkát (persze előbb kialkudtam érte egy kevés pontocskát).

Első dolgom volt a szemrevételezés. Ugyanis ha két program nagyon különbözik megjelenésében, akkor számíthatunk arra, hogy teljesen újraírt kódról van szó, vagyis mindkét programot teljesen vissza kell fejteni.

Szerencsére ennél a másolóprogramnál nem látszott sok különbség, leszámítva, hogy a "forget" menüpont "init" nevet kapott. Bíztató kezdet volt. Aztán a próbálgatás közben kiderült, hogy apróbb módosítások mégis vannak, de nem tűntek jelentősnek.

Ezt követően megkezdtem az igazi hack-elést, vagyis a program visszafejtését. Ilyenkor egy csöndes, kis magánháború kezdődik, mivel a programozó se szereti könnyen adni munkáját és a visszafejtőnek rengeteg fejfájást okoz minden apró részlet megértése. Így aztán egy sikeresen megértett rész örömittas, ujjongó állapotot idéz elő munka közben.

A ZotyoCopy+ egy BASIC részbe rejtett másoló program, így nem több részből töltődik be, hanem egyből a BASIC program helyezi üzembe. Itt aztán sikerült is jópár védelembe botlani, ugyanis ez az első bástyája a program készítőknek. Alaptudással már nem is lehet átjutni rajta.

Nézzük, milyen védelmeket tartalmaz a BASIC rész:

  • MERGE - automatikus betöltés utáni indítás kikapcsolása
  • Előre definiált változókkal mentés (RUN így nem használható)
  • Trükkös POKE használat
  • Kód elrejtése

A BASIC sorok színnel is védve voltak, amelyek levételével elcsúszott a memóriában a másolóprogram és működésképtelenné vált. Szín nélkül a program a következő:

Szépen lassan kibogozhatók az utasítások és el lehet jutni a másoló programhoz. A BASIC rész kiírja a másoló program menüjét (legalább nem pazarolja a helyet ott) és elindítja.

Talán leggonoszabb trükkje a RANDOMIZE USR (prog+b+2), mivel a +2 csak a listán jelent hozzáadást, a 2 valós értéke 0. Ennek módja, hogy a Spectrum BASIC rendszere a számok kiírt (listán megjelenő) és valós értékét külön tárolja. Vagyis a hozzáadás a programfeltörő szemét zavarja meg. A valóságban az a 2-es egy nagy nulla.

Ezek alapvédelmek. Szinte minden forgalmazott programnak a védelménél alkalmazták őket. Itt még szerény mennyiségű trükk lapult egy Speedlock-hoz képest, de épp elegendő a nehezítéshez.

Mikor előállt a kód, megindult a visszafejtés. Ennek során először a byte-okból értelmes utasításokat kell előállítani, majd számok, memóriacímek értékét kell értelmes szöveggel helyettesíteni. Így lesz értelmesen olvasható úgynevezett forráskódú program. Lássunk egy egyszerűbb példát:

$3A $00 $80 $3D $32 $00 $80 $CA $00 $A0 hexadecimális számsor ránézésre megfejthetetlen, de utasításonként leírva a kövekezőt jelenti:

LDA, ($8000)$3A $00 $80az A regiszterbe betölt egy értéket a $8000 memóriacímről
DECA$3Dcsökkenti 1-el
LD($8000), A$32 $00 $80visszaírja a csökkentett értéket a memóriába
JPZ, $A000$CA $00 $A0ha értéke 0, ugrás a $A000 címre

Ha egy játékban mondjuk örökélet keresgélés közben ezt találjuk és valóban az életek számát csökkenti, akkor helyette ezt írjuk:

LDA, (LIVES)
DECA
LD(LIVES), A
JPZ, GAME_OVER

és jelezzük a programban, hogy LIVES egyenlő $8000-el. Máris olvashatóbb a kód. Sikerült jól elkalandozni, sajnos egy másolóprogramban életek nincsenek.

Hosszú, türelmes munka után előáll egy értelmes forrásszöveg, amiből már látni, hogyan működik a ZotyoCopy+ másoló program. Még akkor is érdemes nézegetni, ha valaki nem jártas a programozásban, hiszen képet kaphat arról, hogyan készül egy menü, milyen bonyolult lehet egy hibakezelés, stb.

A ZotyoCopy+ visszafejtett forráskódja


(a teljes forráskód a képre kattintva érhető el)

Elég szépen szervezett 2048 byte hosszú program, nagyrészt jól áttekinthető, struktúrált kód. A képernyő alsó 1/3-ad részében fut, ahol nincs is több hely 2048 byte-nál hosszabb programnak, vagyis elmondható, hogy a maximumot kihozta a rendelkezésre álló helyből (az utolsó byte-ocska nem használt). Az apróbb következetlenségeknek nincs jelentősége, a programfejlesztés során sokszor maradnak olyan részek, amelyek egyszerűsíthetők lennének, de utólag már ritkán kerül rájuk sor. Itt erre nem volt szükség, belefért a keretbe.

Memória használata alapműködése során:

16384 ($4000)képernyő memória kezdeteFelső 2/3-ad részét használja a kiírásokhoz.
20480 ($5000)alsó 1/3 képernyő memóriaItt fut a másoló program.
22528 ($5800)képernyő memória szín részeEhhez nem lehet nyúlni, különben a kép áttekinthetetlen.
23296 ($5B00)printer puffer memóriaItt tárolja a változóit, a betöltött adatblokkok adatait.
23552 ($5C00)rendszerváltozókEzekhez nem nyúl, így biztosítva az interface, főleg az Interface I kompatibilitást.
23755 ($5CCB)BASIC terület kezdeteInnetől szabad a memória végig, Interface I-nél ez később kezdődik.
65535 ($FFFF)memória végeEddig lehet használni a memóriát.

Memória használata MAXI üzemmódban:

16384 ($4000)másoló program 49 byte-ban megírva.Képernyő elmákosodik, információk megjelenítésére nincs lehetőség.
16459 ($404B)szabad memória kezdeteInnentől lehet másolni a memória végéig. Betöltéskor a képernyő megtelik látszólag zavaros adatokkal, a színek össze-vissza villódznak, de ez a normális működés. Adatblokk betöltése után gombnyomásra indul a mentés.
65535 ($FFFF)memória végeEddig lehet használni a memóriát.

Zotyocopy#

Tulajdonképpen csak apró módosításokat tartalmaz a + jelölésű programhoz képest, de egyértelműen bizonyítja, hogy a + jelölésű másolóprogram is kiadásra került program volt, nem csak egy "véletlenül" kikerült munkaváltozat.

Különbségek a + változathoz képest

Javításra került a Verify menüpont háttérszíne a helyes értékre kiválasztása esetén, mert alapkoncepcióban minden menüpontnak kék háttérrel kellett volna villognia, de ez egy véletlen elütés miatt fekete hátterű volt.
A MAXI üzemmód +1 byte-al, 49077 hosszú másolásra lett alkalmas, mivel egy utasítás lecserélésével sikerült ezt az 1 byte-ot megspórolni.
A többi programkód teljesen megegyező a korábbi + jelölésű változattal.

Zotyo 3.1

Következhetett a Zotyo 3.1 visszafejtése és elemzése. Szerencsére a kód nagy része jelentős hasonlóságot mutatott az előző változattal, így bár nem volt gyerekjáték, de előállt annak is a forráskódja. Ennek részletezésére nincs szükség, mivel a kód jelentős része (95 %-a) azonos.

És ilyenkor hull le a lepel ...

... a Zotyo 3.1 csak javított változata a ZotyoCopy# programnak. Számos hibát kellett javítani benne és pár egyszerűbb ésszerűsítés is történt. Lássuk részletesebben a különbségeket:

ZotyoCopy+Zotyo 3.1Eredmény
A "forget" menüpontban lehetőség van a törlendő adatblokk kiválasztására.Az "init" menüpont mindig az összes adatblokkot törli.Ez sajnos visszalépés, kényelmetlenebb a használat során, de valószínűleg a 2048 byte szűkös keretébe nem fért be a korábbi megoldás vagy hiba miatt kellett módosítani.
Kiírja a betöltött program nevét, ha azonosítható.Felkészülve minden trükkös névre írja ki a betöltött program nevétHibajavítás, biztosabb működés.
Számok kiírása 00000 formában.Számok kiírása 0 formában.Olvashatóbb számok.
Szövegek kiírása a képernyőre.Szövegek egységes kiírása a képernyőre.Szükséges egyszerűsítés, mivel a hibajavítások miatt kifutott a 2048 byte-os határból.
Adatblokk kiválasztása U (up - fel) vagy D (down - le) gombokkal.Adatblokk kiválasztása U és 7 (up - fel) vagy D és 6 (down - le) gombokkal.Kényelmi szolgáltatás, kezelésnél gondolt a fel-le vezérlőnyilak megnyomására is.
MAXI üzemmódban a leghosszabb másolható adatblokk 49076 byte hosszú.MAXI üzemmódban a leghosszabb másolható adatblokk 49073 byte hosszú.Utóbbi a jól működő kód, a másik sajnos hibásan mentett.

Összefoglalva a ZotyoCopy egy jól megírt másolóprogram, ami nagyszerűen betöltötte feladatát. Kezelése felhasználóbarát, nem igényelt semmilyen leírást, valószínűleg ez is segítette elterjedését. Mivel a BASIC területtől az utolsó működő byte-ig használja a memóriát, így minden hardver interface-től függetlenül képes volt működni. Ez egyben egy pici hátránya is, mivel így kb. 1 Kbyte memóriát kihasználatlanul hagy, de lényegesebb a hibátlan, biztos működés. A MAXI üzemmód jelentős segítséget nyújtott használóinak a másolások során (bár a Perils of Bear George programot nem lehetett lemásolni vele). Igazán szép program mind megjelenésében, mind programozásában. Gratuláció a készítőjének, Gräff Zolinak. Már csak egy kérdés maradt nyitva:

Alapszintű Spectrum ismeretekkel ilyen program nem írható, Zotyó nagyon alaposan tisztában volt a Spectrum működésével. Vajon miért nem írt más programokat is, hiszen tudása, szakértelme, tehetsége megvolt hozzá? ...

Zotyó kommentárja

"Csomót tanultam a saját programomról, merthogy időközben persze jól elfelejtettem... Tényleg alig emlékszem már valamire akkoriból. Sajnos. Nem emlékszem pl., hogy direkt építettem-e bele védelmeket vagy az csak mellékhatása volt annak, hogy minden jól elférjen. De lehet, hogy azért tényleg védeni is akartam. Kár, hogy nincs meg a forrása, odaadnám, hátha a kommentekből kiderülne még valami érdekes... Az sem igazán rémlik, honnan szedtem az infokat a Spectrum belső világáról. A ZotyoCopy+ jó volt arra, hogy az assemblert megtanuljam. Szerintem ez nagyjából sikerült is :-) Mire befejeztem, épp végeztem az ELTE-n, mint programtervező matematikus és elkezdtem dolgozni, akkor még IBM XT meg IBM/AT gépeken. Prolog nyelven. Időm is sokkal kevesebb lett, mint egyetemista koromban és nem is volt nagyon indíttatás, hogy írjak még valamit. Mire lett volna még akkora szükség, mint egy másolóprogramra ?" (szerk.: www.zotyo.hu/zcopy.htm)

Küldetés teljesítve.