48. Nečitateľný súbor: --scramble
Na čo to je
Texty, ktoré program vypisuje alebo s ktorými porovnáva, ležia v súbore .xex tak, ako si ich napísal. Kto súbor otvorí v editore, prečíta si ich – pri textovej hre aj celé riešenie, pri programe s heslom heslo.
Voľba --scramble urobí zo súboru taký, v ktorom sa nedá prečítať nič: ani texty, ani DATA, ani kód. Program pritom robí presne to isté a v zdrojáku nemeníš nič. Je to rozšírenie prekladača – robí sa až s hotovým súborom, takže platí pre Atari BASIC aj pre Turbo-BASIC XL.
Ako sa to píše
| Voľba | Čo robí |
|---|---|
--scramble | zakóduje výsledný súbor, aby sa v ňom nedalo nič prečítať |
--scramble-fx meno | to isté, a kým sa program po nahratí dekóduje, na obrazovke beží efekt |
--scramble-level číslo | to isté, s úrovňou zakódovania: 1 (predvolená) alebo silnejšia 2 |
--scramble-key číslo | kľúč, od ktorého sa kóduje (napríklad $3A7F); s ním dá každý preklad rovnaký súbor |
Basic26 program.abas --scramblealebo rovno v programe, v hlavičke REM @COMPILE (kapitola 40):
1 REM @COMPILE --scramble-fx bars
Celý program
Súbor examples/secret.abas:
10 REM A file nobody can read: Basic26 secret.abas --scramble
20 DIM A$(20)
30 PRINT "What is the password";:INPUT A$
40 IF A$="SESAME" THEN PRINT "The door opens.":END
50 PRINT "Nothing happens."Heslo SESAME je v programe napísané ako text, s ktorým sa porovnáva odpoveď.
Preklad a spustenie
Prelož program najprv obyčajne a nechaj Windows pohľadať v súbore slovo SESAME:
Basic26 secret.abas
findstr /m SESAME secret.xexsecret.xexfindstr /m vypíše meno súboru, v ktorom slovo našiel – heslo je v súbore čitateľné. Teraz to isté s --scramble:
Basic26 secret.abas --scramble
findstr /m SESAME secret.xexTentoraz nevypíše nič: slovo v súbore nie je. Program pritom beží ako predtým – v simulátore s odpoveďou zo súboru examples/secret.in:
Basic26 secret.abas --scramble --sim --sim-input secret.inČo uvidíš
What is the password?SESAME
The door opens.Ako to funguje
Prekladač hotový program prekódoval bajt po bajte a pridal k nemu krátky dekodér. Ten sa po nahratí súboru spustí ako prvý, vráti pamäť do pôvodného stavu a až potom spustí tvoj program. Program o dekodéri nevie.
Čo to stojí, povie -v:
wrote secret.xex (1849 bytes, 4 segment(s), 1709 bytes of program)
scrambled 1642 bytes (level 1, key $A7), decoder at $0600 (112 bytes), file 116 bytes longer- Súbor je dlhší asi o sto bajtov – tu 1 849 namiesto 1 733.
- Pamäť programu sa nezmenšila. Dekodér leží mimo neho, na adrese
$0600(stránka 6). Keď tam niečo nahráva sám program – napríklad strojový kód pribalený cez--embed–, dekodér sa uloží hneď za program. V oboch prípadoch ho program po štarte môže pokojne prepísať:POKE 1536,…ajDIMfungujú ako vždy. - Štart trvá o chvíľu dlhšie. Program s 25 kilobajtmi sa dekóduje asi pol sekundy.
Jediné, čo ostáva čitateľné, je krátky úsek na začiatku súboru, ktorý vypína zabudovaný BASIC (65 bajtov, rovnakých v každom preloženom programe). Musí bežať ako prvý, ešte pred dekodérom.
Zakódujú sa aj dáta, ktoré idú so súborom: pribalené súbory (--embed, --file), texty pod ROM a v bankách (--text-under-rom, --text-in-banks) a oba súbory z --data-only a --code-only. Program sa dá uložiť aj na disketu (--atr), s ktorýmkoľvek DOS-om.
Zakódovaný je aj samotný dekodér. Pred ním leží krátky prvý stupeň (24 bajtov), ktorý ho pri prvom spustení vráti a potom už len pustí ďalej. V súbore sa tak nedá prečítať ani to, ako dekodér pracuje, ani jeho kľúč.
Nie je to ochrana. Kto program spustí v emulátore, vidí v jeho pamäti všetko už dekódované. Zakódovanie bráni len tomu, aby si texty niekto prečítal priamo zo súboru.
Silnejšie zakódovanie: --scramble-level 2
Bežné --scramble kóduje každý bajt pomocou bajtu pred ním. Je to rýchle a dekodér je krátky, no kto ten postup pozná, napíše si program, ktorý súbor rozkóduje bez spúšťania. Voľba --scramble-level vyberá úroveň zakódovania:
| Úroveň | Ako kóduje | Dekodér | 25 KB trvá |
|---|---|---|---|
1 | každý bajt XOR bajt pred ním (predvolená, to isté ako --scramble) | 112 bajtov | 0,48 s |
2 | každý bajt XOR číslo zo 16-bitového generátora pseudonáhodných čísel (LFSR) | +12 | asi 0,9 s |
Basic26 secret.abas --scramble-level 2--scramble-level už znamená --scramble, oboje písať netreba. Efekty fungujú rovnako, napríklad --scramble-level 2 --scramble-fx bars.
Pri úrovni 2 čísla, ktorými sa bajty kódujú, vôbec nezávisia od programu a generátor beží bez prerušenia cez celý súbor – v súbore do 64 KB sa teda nikde neopakujú. Kto ich chce odstrániť, musí generátor napodobniť a poznať číslo, od ktorého začína – kľúč. Bez voľby --scramble-key si prekladač pri každom preklade vyberie nový náhodný kľúč, takže ten istý program dá zakaždým iný súbor. Ak chceš, aby bol súbor pri každom preklade rovnaký (napríklad na porovnanie dvoch verzií), kľúč zadaj sám:
Basic26 secret.abas --scramble-level 2 --scramble-key $3A7F -vscrambled 1642 bytes (level 2, key $3A7F), decoder at $0600 (124 bytes), file 128 bytes longerKľúč je číslo od $0001 do $FFFF; nula nejde, generátor by z nej vyrábal len nuly. Pri úrovni 1 je kľúč jeden bajt od $01 do $FF, bez voľby platí $A7.
Ani úroveň 2 nie je ochrana: emulátor ukáže pamäť už dekódovanú a kto prvý stupeň pochopí, dostane sa ďalej. Len to dá podstatne viac práce.
Celý program so zakódovaním úrovne 2 – trezor, ktorý sa pýta na kód – je medzi príkladmi prekladača v examples/scramble/trezor.abas.
Efekty: --scramble-fx
Pol sekundy, počas ktorej sa na obrazovke nič nedeje, vyzerá ako zaseknutý počítač. Staré programy na Atari preto pri rozbaľovaní kreslili pruhy. --scramble-fx meno zakóduje súbor rovnako ako --scramble a pridá do dekodéra efekt:
Basic26 secret.abas --scramble-fx bars --runEfekt uvidíš len v emulátore (--run) alebo na skutočnom Atari – simulátor (--sim) obrazovku nekreslí. Pri takom malom programe iba preblikne; poriadne ho vidno pri programe s desiatkami kilobajtov.
| Meno | Čo je na obrazovke | Dekodér | 25 KB trvá |
|---|---|---|---|
none | nič – to isté ako --scramble | +0 bajtov | 0,48 s |
bars | farebné pásy cez celú obrazovku | +6 | 0,64 s |
bars-border | farebné pásy len na okrajoch | +3 | 0,56 s |
mono | čiernobiele pásy cez celú obrazovku | +8 | 0,68 s |
mono-border | čiernobiele pásy na okrajoch | +5 | 0,60 s |
rainbow | pravidelná dúha cez celú obrazovku | +6 | 0,64 s |
rainbow-border | dúha na okrajoch | +3 | 0,56 s |
slow | široké pomalé pásy cez celú obrazovku | +6 | 0,48 s |
slow-border | široké pomalé pásy na okrajoch | +3 | 0,48 s |
dots | bodky po celej obrazovke – znaky sa zmenia na zrnenie | +3 | 0,56 s |
dots-bars | bodky a farebné pásy naraz | +9 | 0,74 s |
blank | obrazovka zhasne, nič sa nekreslí | +20 | 0,36 s |
bars-blank | obrazovka zhasne, farebné pásy cez celú plochu | +23 | 0,42 s |
inc | obrazovka zhasne, biele čiarky na tmavočervenej ploche | +28 | 0,46 s |
inc-border | biele čiarky na tmavočervených okrajoch | +8 | 0,64 s |
Ako si vybrať:
- Čo najrýchlejší štart:
blank. Zhasnutá obrazovka neberie procesoru čas, preto je dekódovanie rýchlejšie než úplne bez efektu. - Efekt zadarmo:
slowaslow-border. Farbu menia len raz za 256 bajtov, takže nič nespomalia. - Nech obrazovka ostane čitateľná: varianty
-borderkreslia len do okrajov; text v strede ostane, ako bol. - Ako za starých čias:
barsaleboinc– ten kreslí to, čo rozbaľovač Super Packer.
Tri veci, ktoré je dobré vedieť:
- „Celá obrazovka“ platí pre bežnú textovú obrazovku, na ktorej sa program nahráva.
dotsje vidno len v textových režimoch. - Farby aj znaky sa po dekódovaní vrátia samy, program nemusí nič upratovať.
- Pri programe s dátami v skrytej pamäti (kapitoly 44 až 46) beží dekodér po kúskoch počas celého nahrávania. Efekty so zhasnutou obrazovkou (
blank,bars-blank,inc) vtedy blikajú.
Časté chyby
| Čo sa stalo | Čo povie prekladač |
|---|---|
| efekt s takým menom nie je | error B26200: unknown effect for --scramble-fx: stars (none, bars, …) – v zátvorke sú všetky, ktoré prekladač pozná |
za --scramble-fx chýba meno | error B26200: option --scramble-fx needs an effect (none, bars, …); bez efektu stačí --scramble |
| úroveň s takým číslom nie je | error B26200: unknown level for --scramble-level: 3 (1, 2) |
kľúč je väčší než $FFFF | error B26200: invalid value for --scramble-key: $1FFFF (a number up to $FFFF, e.g. $3A7F) |
| dvojbajtový kľúč bez úrovne 2 | error B26200: --scramble-key for --scramble-level 1 is a byte from $01 to $FF |
| kľúč 0 pri úrovni 2 | error B26200: --scramble-key must not be 0 with --scramble-level 2 |
| program si pýta jeden efekt a príkazový riadok iný | warning B26232: the command line's --scramble-fx goes before the one in the program's REM @COMPILE – platí príkazový riadok |
| stránka 6 je obsadená a program siaha až po obrazovku | error B26200: --scramble: no room for the decoder: page 6 is taken and so is the memory after the program up to $BC00 |
pribalený program (--embed iný.xex) si počas nahrávania prepíše stránku 6 | program sa po nahratí zasekne – dekodér tam musí vydržať, kým sa súbor nenahrá celý |
Zakódovaný súbor sa nedá vrátiť späť voľbou prekladača. Zdroják si preto nechaj; .xex z neho vyrobíš kedykoľvek znova.
Vyskúšaj si
- Prelož
secret.abass--scramble-fx rainbow --runa potom s--scramble-fx inc --run. Efekt trvá len okamih – pridaj do programu sto riadkovDATAa pozri, ako sa predĺži. - Pridaj na začiatok programu riadok
1 REM @COMPILE --scramble-fx barsa prelož ho bez volieb. - Prelož
secret.abasdvakrát s--scramble-level 2 -va porovnaj kľúče, ktoré prekladač vypíše. Potom pridaj--scramble-key $1234a porovnaj oba súbory príkazomfc /b. - Prelož
secret.abass--scramble -v --embed secret.in@$0600. Stránka 6 je tým obsadená (voľbu--embedvysvetľuje kapitola 43) – kam prekladač uložil dekodér?
Zhrnutie
--scrambleurobí súbor nečitateľným za cenu asi sto bajtov a pol sekundy pri štarte.--scramble-fx menok tomu pridá efekt na obrazovke; najrýchlejší jeblank, zadarmoslow.--scramble-level 2kóduje prúdom z generátora; bez--scramble-keyje kľúč pri každom preklade iný.- Program sa nemení a o dekodéri nevie; pamäť mu neubudne.
- Nie je to ochrana – v pamäti emulátora je program dekódovaný.
Späť: 47. Program bez čísel riadkov · Ďalej: 49. Hráči a strely