VC 20-Programme schützen
Einige Gedanken zum Copyright-Schutz mit Break, Autostart und einigen nützlichen POKEs und PEEKs. Experimentieren ist gestattet.
Wer möchte schon, daß sein Copyright mißbraucht wird? Viele Programmierer trauen sich nicht, ihr Programm zu veröffentlichen oder zu tauschen, weil dieses ja dann von Raubkopierern vervielfältigt werden könnte. Für solch einen Fall habe ich eine fast narrensichere Hilfe geschaffen.
Zunächst wäre es möglich, daß man seine Programme mit einem LOAD-, SAVE-, LIST-Schutz gegen Kopieren sichert. Aber damit hat man die unbefugte Benutzung noch nicht ausgeschaltet. Die Lösung liegt da, daß man einen Code abfragt, wobei die Abfrage im Listing natürlich unsichtbar ist. Anschließend schalten wir noch die RUN/STOP-RESTORE-Funktion außer Betrieb und mit einem Datasetten-Autostart sind wir schon fast fertig. Werfen wir nun alles in einen Topf, so haben wir doch ein ziemlich sicheres Programm (Listing 1). Die benötigten PEEKs und POKEs sind in Tabelle 1 zu finden. Das Programm ist selbstverständlich nur eine Demo-Version, um das Prinzip zu zeigen. Bauen Sie die Routinen doch einmal in eines Ihrer Programme ein.
Das Prinzip des Datasetten-Autostarts wurde bereits im VC 20-Kurs ausführlich beschrieben. Eine sehr einfache Methode ist es beispielsweise, das Hauptprogramm von einem Ladeprogramm aus nachladen zu lassen. Den Nachlade-Befehl kann man dabei noch in einem Maschinenprogramm unauffällig verstecken (Listing 2).
Zumindest bei Spielen für den VC 20 wird in den meisten Fällen ein neuer Zeichensatz definiert, um die grafische Darstellung zu verbessern. Diese Zeichendefinition wird in der Regel über DATA-Zeilen durchgeführt. So fällt es kaum auf, wenn da eine zusätzliche DATA-Zeile eingebaut wird, die den Nachlade-Befehl in Maschinensprache enthält.
Zum Abschluß noch ein Tip:
POKEn Sie doch einmal verschiedene Werte in die Speicherstelle 808. Sie werden verblüffende Ergebnisse erzielen.
(Ralf Brinkmann/ev)PRINT PEEK(152) | gibt die Anzahl der offenen Files an |
PRINT PEEK(10) oder(147) | gibt die letzte Kassettenroutiine an Load =0 Verify=1 |
PRINT PEEK (43) + PEEK (44) * 256 | Zeiger für Beginn von Basic |
PRINT PEEK (45) + PEEK (46) * 256 | Zeiger für Beginn der Variablen |
PRINT PEEK (47) + PEEK (48) * 256 | Zeiger für Beginn der Arrays |
PRINT PEEK (49) + PEEK (50) * 256 | Zeiger für das Ende der Arrays |
PRINT PEEK (51) + PEEK (52) * 256 | Zeiger für Strings |
PRINT PEEK (57) + PEEK (58) * 256 | Momentane Zeilennummer in Basic |
PRINT PEEK (55) + PEEK (56) * 256 | Zeiger für die Grenze des Speicherplatzes |
POKE 657,128 | verhindert das Umschalten auf Kleinschrift, |
POKE 657,0 | wieder normal |
PRINT PEEK (648) | gibt die Bildschirm-Page an |
POKE 794,0: POKE 795,0 | Mit diesen POKEs wird der OPEN-Vektor ($f40a) geändert und der OPEN-Befehl kann nicht mehr ausgeführt werden |
POKE 804,0: POKE 805,0 | Ändert den INPUT-Vektor und ein INPUT wird unmöglich |
POKE 810,0: POKE 811,0 | Läßt kein GET mehr zu |
POKE 818,116: POKE 819,196 | Ein SAVE-Schutz |
POKE 816,0: POKE 817,0 | Ein LOAD-Schutz |
POKE 775,200 | Ein LIST-Schutz |
POKE 37150,2: POKE 788,192 | Setzt die RUN/STOP-RESTORE-Funktion außer Betrieb |
1 rem programmsicherung 2 rem ----------------- 3 rem 4 rem 10 gosub 90:rem erst schuetzen 15 rem 20 rem codeabfrage gegen unerlaubte benutzung 25 rem 30 print chr$(147) 40 input"programmcode";c$ 50 a$="ralph brinkmann" 60 if c$=a$ then print"programmcode ok":end 65 rem 70 rem programmzerstoerung 75 rem 80 print"falsches passwort !":poke 777,1 85 rem 90 rem save/load/list-schutz 95 rem 100 poke 818,116:poke 819,196 110 poke 816,0:poke 817,0 120 poke 775,200 125 rem 130 rem run/stop-restore ausschalten 135 rem 140 poke 37150,2:poke 788,192 150 return 155 rem 160 rem erst save, dann run !
10 rem autostart 20 rem --------- 30 rem 40 rem 50 for i=7660 to 7674:read v:poke i,v:next 60 sys 7660 70 poke 631,131:poke 198,1 80 end 90 data 162,7,169,126,56,253,79,29,157,79,29,202,208,244,96