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í
--scramblezakóduje výsledný súbor, aby sa v ňom nedalo nič prečítať
--scramble-fx menoto isté, a kým sa program po nahratí dekóduje, na obrazovke beží efekt
--scramble-level čísloto isté, s úrovňou zakódovania: 1 (predvolená) alebo silnejšia 2
--scramble-key číslokľúč, od ktorého sa kóduje (napríklad $3A7F); s ním dá každý preklad rovnaký súbor
Basic26 program.abas --scramble

alebo rovno v programe, v hlavičke REM @COMPILE (kapitola 40):

Turbo Basic XL
1 REM @COMPILE --scramble-fx bars

Celý program

Súbor examples/secret.abas:

Turbo Basic XL
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.xex
secret.xex

findstr /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.xex

Tentoraz 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

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ódujeDekodér25 KB trvá
1každý bajt XOR bajt pred ním (predvolená, to isté ako --scramble)112 bajtov0,48 s
2každý bajt XOR číslo zo 16-bitového generátora pseudonáhodných čísel (LFSR)+12asi 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 -v
scrambled 1642 bytes (level 2, key $3A7F), decoder at $0600 (124 bytes), file 128 bytes longer

Kľúč 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 --run

Efekt 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 obrazovkeDekodér25 KB trvá
nonenič – to isté ako --scramble+0 bajtov0,48 s
barsfarebné pásy cez celú obrazovku+60,64 s
bars-borderfarebné pásy len na okrajoch+30,56 s
monočiernobiele pásy cez celú obrazovku+80,68 s
mono-borderčiernobiele pásy na okrajoch+50,60 s
rainbowpravidelná dúha cez celú obrazovku+60,64 s
rainbow-borderdúha na okrajoch+30,56 s
slowširoké pomalé pásy cez celú obrazovku+60,48 s
slow-borderširoké pomalé pásy na okrajoch+30,48 s
dotsbodky po celej obrazovke – znaky sa zmenia na zrnenie+30,56 s
dots-barsbodky a farebné pásy naraz+90,74 s
blankobrazovka zhasne, nič sa nekreslí+200,36 s
bars-blankobrazovka zhasne, farebné pásy cez celú plochu+230,42 s
incobrazovka zhasne, biele čiarky na tmavočervenej ploche+280,46 s
inc-borderbiele čiarky na tmavočervených okrajoch+80,64 s

Ako si vybrať:

Tri veci, ktoré je dobré vedieť:

Časté chyby

Čo sa staloČo povie prekladač
efekt s takým menom nie jeerror B26200: unknown effect for --scramble-fx: stars (none, bars, …) – v zátvorke sú všetky, ktoré prekladač pozná
za --scramble-fx chýba menoerror B26200: option --scramble-fx needs an effect (none, bars, …); bez efektu stačí --scramble
úroveň s takým číslom nie jeerror B26200: unknown level for --scramble-level: 3 (1, 2)
kľúč je väčší než $FFFFerror B26200: invalid value for --scramble-key: $1FFFF (a number up to $FFFF, e.g. $3A7F)
dvojbajtový kľúč bez úrovne 2error B26200: --scramble-key for --scramble-level 1 is a byte from $01 to $FF
kľúč 0 pri úrovni 2error 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 obrazovkuerror 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 6program 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

  1. Prelož secret.abas s --scramble-fx rainbow --run a potom s --scramble-fx inc --run. Efekt trvá len okamih – pridaj do programu sto riadkov DATA a pozri, ako sa predĺži.
  2. Pridaj na začiatok programu riadok 1 REM @COMPILE --scramble-fx bars a prelož ho bez volieb.
  3. Prelož secret.abas dvakrát s --scramble-level 2 -v a porovnaj kľúče, ktoré prekladač vypíše. Potom pridaj --scramble-key $1234 a porovnaj oba súbory príkazom fc /b.
  4. Prelož secret.abas s --scramble -v --embed secret.in@$0600. Stránka 6 je tým obsadená (voľbu --embed vysvetľuje kapitola 43) – kam prekladač uložil dekodér?

Zhrnutie

Späť: 47. Program bez čísel riadkov · Ďalej: 49. Hráči a strely