Listschutz

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Ein Listschutz verhindert das Anzeigen von Teilen oder des gesamten Listings (sprich Befehlszeilen eines Programmes) einer Programmiersprache in der Regel mit einfachen Computerbefehlen, d.h. ohne Befehlserweiterung oder separaten Hilfsprogrammen. So gesehen soll ein Listschutz ein Programm das Ausspähen des Programmcodes durch Dritte verhindern, damit diese nicht entsprechende Programmteile verwenden. Weiterhin hindert es ggf. auch Anwendern mit weniger technischen Kenntnissen ein Listing entsprechend zu verändern, z.B. um in Computerspiele zu auszutricksen (mittels Cheats) oder sonst irgendwie zu manipulieren. Ein Listschutz ist eine Methode des Softwareschutzes.

Methoden[Bearbeiten | Quelltext bearbeiten]

Beim C64 und anderen Commodore Heimcomputern mit eingebauten BASIC wird der Listschutz durch die Einschränkung oder die Verhinderung der Benutzung des BASIC-Befehls LIST realisiert. Dieser Listschutz bezieht sich somit nur auf BASIC-Listings.

So können beim Benutzen von LIST beispielsweise folgende Tricks benutzt werden:

  • Durch Ausnutzen eines Fehlers in der LIST-Implementierung kann das Auflisten abgebrochen werden.
    Z.B. bricht LIST bei 10 REM Shift +L mit einem ?SYNTAX ERROR ab. Dieser Trick kann aber z.B. durch ein LIST 100- umgangen werden; auch diverse Steckmodule wie z.B. das Final Cartridge 3 beinhalten eine korrigierte LIST-Variante.
  • Zeilen oder Zeilenteile werden durch im Listing eingebettete Steuerzeichen "versteckt".
    Z.B. fügt das in der 64'er vorgestellte Programm "H.I.D.E." nach jeder Zeilennummer eine Marke ein, die von LIST als Zeilenende interpretiert, aber von RUN ignoriert wird; entsprechend werden von LIST dann nur die Zeilennummern angezeigt.
  • Der Befehl LIST wird verändert.
    Unter anderem kann dies durch die Veränderung der Aufrufvektoren für die LIST-Routine erreicht werden. Hierbei können dem Anwender interessante Effekte präsentiert werden, wie z.B. der Reset des Computers oder das Löschen des BASIC-Programms ausgelöst werden.
    Da das Verbiegen der Vektoren (z.B. mittels POKE) vor dem LIST-Aufruf erfolgen muss, ist die Nutzung eines Autostarts nötig.
  • Weiterhin kann das eigentliche BASIC-Programm auch in höhere Speicherbereiche hinterlegt werden, so dass hier auch nur eine BASIC-Zeile mit einem Startbefehl und einem REM-Kommentar steht; z.B.: 10 SYS 2058: REM *** (C) 2015 C64-WIKI ***. Siehe auch die Beispielmethode.

Die Erweiterung des einfachen Listschutzes ist das Verhindern der Nutzung der Taste RUN/STOP , der Tastenkombination RUN/STOP +RESTORE  oder der Durchführung eines Soft-Resets (mittels Reset-Taster) in laufenden BASIC-Programmen. Jede dieser Methoden könnte ein BASIC-Programm unterbrechen, so dass man anschließend im Direktmodus wiederum mit dem Befehl LIST das BASIC-Programm ansehen kann. Verhindert werden diese durch Abschalten der entsprechenden Tasten oder Verbiegen des Sprungvektors für die NMI-Behandlung bei Betätigung der RESTORE-Taste oder Vortäuschen eines Moduls, um beim Reset sofort wieder die Kontrolle zu erhalten (z.B. wird statt des Resets das Programm neu gestartet oder der BASIC-Speichers wie bei NEW zurückgesetzt oder sogar tatsächlich gelöscht und überschrieben).
In Verbindung mit dem Verbiegen des LIST-Vektors entsteht so ein noch effektiverer Listschutz.

Gegenmaßnahmen[Bearbeiten | Quelltext bearbeiten]

Da das BASIC-Programm trotz aller Verschleierung und Manipulation ablauffähig im Speicher stehen muss, liegt die Schwäche eines Listschutzes in der erzwungenen Unterbrechung des Programms. Hilfestellung erhält man hier durchwegs mit Hardware-Mitteln wie

Zusammen mit einem Reset-Taster und den dort vorzufindenden Funktionen wie

  • Unterdrücken eines Modulstartes
  • Unterdrücken der BASIC-Initialisierung (NEW)
  • Wiederherstellung eines Basic-Programms (UNNEW)

kann ein Programm, sofern es im üblichen Speicherbereich liegt, nicht selten wieder "sichtbar" gemacht werden.

Beispiel[Bearbeiten | Quelltext bearbeiten]

Ein Listschutz, der leicht zu realisieren ist, aber auch schwer zu durchschauen ist, wäre, wenn das BASIC-Programm nur eine BASIC-Zeile mit einem SYS-Befehl besitzt und damit dem Anwender vorgaukelt, es wäre ein Maschinenspracheprogramm.[1]

Hierzu gehen Sie wie folgt vor:

  1. Geben Sie eine BASIC-Zeile ein wie 100 SYS 2110 oder 2006 SYS (2110) BY NOSTALGIE
  2. Geben Sie anschließend POKE 43,80 : POKE 2127,0 : NEW ein
  3. Anschließend dieses Programm:
10 FOR I = 2110 TO 2126: READ A: POKE I,A: NEXT I
20 DATA 169, 80,133, 43,169, 52,141, 20,  3
30 DATA 169,193,141, 24,  3, 76,113,168
  1. Starten Sie das Programm und löschen sie es wieder mit NEW.
  2. Schreiben oder laden Sie nun ihr BASIC-Programm in den C64 hinein, dabei ist zu beachten, dass das BASIC-Programm die Zeilennummer 0 enthält!
  3. Anschließend geben Sie POKE 43,1 ein und speichern das Programm mit ab.
  4. Wenn Sie nun das so geschützte Programm wieder in den C64 laden, erscheint beim Auflisten nur eine SYS-Zeile. Das BASIC-Programm wird weiterhin mit RUN gestartet und führt dann das oben eingegebene Maschinenspracheprogramm aus, das die Tasten RUN/STOP  und RESTORE  blockiert und startet anschließend Ihr BASIC-Programm.

Literatur[Bearbeiten | Quelltext bearbeiten]

Quellen[Bearbeiten | Quelltext bearbeiten]

  1. Idee aufgegriffen und Programm aus dem Buch 64 noch mehr Tips & Tricks, Band 2, Seite 85-87