METHOD FOR THE PROTECTION OF MACHINE READABLE PROGRAMMES AGAINST READING AND COPYING

Abstract: 1. Method for protecting programs recorded on machine-readable data carriers from unauthorized inspection and unauthorized copying, in which method enciphering is performed, characterized by the following steps : - the program to be protected is combined with a protection program consisting of an encipher/decipher part and an erase part ; - the program to be protected and the encipher part of the protection program are enciphered ; - after enciphering, the length of the area to be deciphered is shortened in the encipher/decipher part of the protection program to such an extent that information specific for the corresponding user remains enciphered ; - before execution of the program the encipher/decipher part of the protection program is executed for deciphering.

Description: Verfahren zum Schutz von auf maschinenlesbaren Daten trägern aufgezeichneten Programmen vor unerlaubter Einsichtnahme und unerlaubtem Kopieren Die Erfindung betrifft ein Verfahren zum Schutz von Programmen vor.unerlaubter Einsichtnahme und unerlaubtem Kopieren nach dem Oberbegriff des Hauptanspruchs. Programme für Datenverarbeitungsanlagen (die sogenannte Software) werden auf machinenlesbaren Trägern vertrieben, beispielsweise Bändern oder Disketten, die leicht durch Unbefugte zu kopieren sind. Der dadurch entstehende wirtschaftliche Schaden, der durch die hohen Herstellkosten von Programmen bedingt ist, zwingt dazu, neben dem rechtlichen Schutz von Programmen aucb technische Vorkehrungen zu ergreifen, die es verhindern, dass Programme auf einfache Weise durch die sogenannten Software-Piraten kopiert werden können. Zu diesem Zweck sind Zusatzeinrichtungen für Datenverarbeitungsanlagen bekannt geworden, mit denen die vom Hersteller verschlüsselten Programme für die Ausführung wieder entschlüsselt werden. Dieses Vorgehen erfordert jedoch einen verhältnismässig grossen Schaltungsaufwand und ist insbesondere für kleine Datenverarbeitungsanlagen, die sog. Mikrocomputersysteme, nicht ohne weiteres tragbar. Zum Schutz von Programmen gegen unerlaubtes Kopieren wurden bisher auch schon Identifikationen des jeweiligen Programmkäufers {z. B. die Kunden-Nummer) in die Pro gramme eingebaut, um bei auftauchenden Raubkopien deren Quelle feststellen zu können. Solange diese Identifikationen aber erkennbar sind, können sie vor einem unerlaubten Kopiervorgang gelöscht oder geändert werden. Die vorliegende Erfindung stellt sich daher die Aufgabe, ein Verfahren zum Schutz von Programmen vor unerlaubter Einsichtnahme und unerlaubtem Kopieren anzugeben, das bei geringem Aufwand beim Hersteller und ohne Eingriff in bestehende Datefnverarbeitungsanlagen für alle Programme anwendbar ist, eine Dechiffrierung der geschützten Programme möglichst zuverlässig verhindert, eine sichere Identifikation von trotzdem vorkommenden Raubkopien ermöglicht, vom Anwender keinen Aufwand erfordert und die normale Programmausführung in keiner Weise stört. Diese Aufgabe wird durch die im Anspruch 1 gekennzeichnete Erfindung gelöst; Ausgestaltungen der Erfindung sind in den abhängigen Ansprüchen gekennzeichnet. Die nach dem hier vorgeschlagenen Verfahren geschützten Programme werden um ein Chiffrier- und Dechiffrierprogramm ergänzt und in chiffrierter Form vertrieben. Beim Anwender erfolgt vor jeder Programmausführung die Dechiffrierung des in den Computer geladenen Programms, ohne dass dazu der sonst übliche Programmablauf abgeändert wird; der Anwender merkt nicht einmal, ob er ein Programm im Klartext oder in chiffrierter Form geladen hat. Ein Teil des chiffrierten Adressgebiets bleibt bei einer derartigen Programmausführung unverändert, so dass dort Geheiminformation untergebracht werden kann. Nach der Dechiffrierung und vor der eigentlichen Programmausführung wird der gesamte an das Programm angehängte Dechiffrierzusatz inklusive dem Gebiet mit der Geheiminformation gelöscht, so dass nurmehr das nicht chiffrierte Programm vorhanden ist. Die Geheiminformation ist also in doppelter Weise geschützt: sie bleibt beim Dechiffrierprozess weiterhin chiffriert und wird ausserdem vor Programmausführung gelöscht. Zum Zugriff oder zum Löschen dieser Geheiminformation müssten also beide Sperrmechanismen überwunden werden. Zur Chiffrierung und Dechiffrierung werden spezielle Maschinenbefehle des jeweiligen Prozessors mitverwendet, die im Repertoire des Assemblerprogramms fehlen, das für die Programmumwandlung herangezogen wird. Auf diese Weise ist es Dienstprogrammen, die aus einem Maschinenprogramm das ursprüngliche Assemblerprogramm wiederherstellen können (sog. Disassembler oder Debugger), nicht möglich, auf den jeweils verwendeten Chiffrieralgorithmus zu schliessen. Die in dem nicht dechiffrierten und vor Programmausführung gelöschten Teil des Chiffrierprogramms enthaltene Information dient zur Identifikation der Herkunft einer nicht autorisierten Programmkopie. Die vom Hersteller des Programms in das Geheimfeld, den sog. Tresor, eingegebene Information kennzeichnet den Abnehmer oder Käufer jeder einzelnen autorisierten Programmkopie. Werden von dieser Kopie unerlaubterweise weitere Kopien angefertigt, so kann deren Herkunft ohne weiteres identifiziert werden, indem vor der Dechiffrierung die Grenzen des zu dechiffrierenden Adressgebiets entsprechend geändert werden. Danach erscheint die im Tresor enthaltene Geheiminformation für kurze Zeit bis zur anschliessenden Selbstlöschung in Klarschrift und dient als unwiderlegbarer Nachweis für die Herkunft der unerlaubten Kopie. Der Eingriff in den Dechiffrierprozess verlangt dabei Kenntnisse, über die nur der Hersteller des Programms verfügt. Mit dem hier vorgeschlagenen Verfahren erfolgt also ein zweifacher Schutz gegen unerwünschten Zugriff zum Klartext des Programms (die Chiffrierung und die Verhinderung der Adressverfolgung während der Dechiffrierung) und es steht eine sichere Identifizierung für die Quelle unerlaubter Kopien zur Verfügung. Die zu schützenden Programme erfahren keinerlei Änderung und werden mit einfachem Aufwand codiert und decodiert. Ausführungsbeispiele der Erfindung werden nun anhand von Zeichnungen näher erläutert. Es zeigen: Fig. lA, Ablaufdiagramme des vorgeschlagenen Verfahrens Fig. 1B zum Schutz von Programmen gegen unerlaubtes Kopieren; Fig. 2A das Ablaufprotokoll der Chiffrierung eines Pro gramms, das als .COM-Datei im CP/N-Betriebssystem eines Mikrocomputers des Typs Z80 abgespeichert ist; Fig. 2B das Ablaufprotokoll der Dechiffrierung des Pro gramms nach Fig. 2A; Fig. 2C das Ablaufprotokoll der Identifizierung uner laubter Programmkopien des Programms nach Fig. 2A; Fig. 3 das Ablaufprotokoll der Chiffrierung eines Pro gramms, das als .REL-Datei im CP/M-Betriebs system eines Mikrocomputers abgespeichert ist. Fig. lA zeigt in schematischer Weise die einzelnen Schritte, die bei der Chiffrierung und Dechiffrierung eines Programms nach dem hier vorgeschlagenen Verfahren durchlaufen werden. Bei Bezugszeichen 1 wird der Klartext des zu schützenden Programms durch ein Chiffrier-/Dechiffrierprogramm CRYPTO ergänzt, das beispielsweise an das Ende des zu schützenden Programms angehängt wird. Dies kann durch Anbindung der beiden Programmodule aneinander (in einem sog. Binder) geschehen oder indem das Programm CRYPTO am Ende des zu schützenden Programms in den Speicher geladen wird; Einzelheiten dazu werden später erläutert. Anschliessend wird bei Bezugszeichen 2 das Programm CRYPTO aufgerufen und in seinem ersten Teil durchgeführt, der die Chiffrierung erledigt. Der zweite Teil von CRYPTO, der aus Löschroutinen besteht, wird in diesem Verfahrensschritt nicht durch geführt, sondern durch einen Adressstop auf das Ende des ersten Teils unterdrückt. Die Einzelheiten des Chiffrierprogramms werden später anhand von Fig. lB näher erläutert. Nach der Chiffrierung des zu schützenden Programms und des Löschteils von CRYPTO werden bei Bezugszeichen 3 die Grenzen des Adressbereichs geändert, der beim Dechiffriervorgang erfasst werden soll. Auf diese Weise wird der sog. Tresor definiert, ein Adressbereich, der geheimzuhaltende Informationen enthält, die zwar chiffriert werden, bei der Dechiffrierung jedoch nicht erscheinen sollen. Der Tresor liegt also am Ende des chiffrierten Bereichs. Mit der Vorverlegung der Dechiffriergrenze im Vergleich zur Chiffrieradresse ist die Chiffrierung des Programms abgeschlossen und es kann bei Bezugszeichen 4 auf einen geeigneten Programmträger, z. B. ein Magnetband oder eine Diskette abgespeichert und vertrieben werden. Zur Ausführung des so chiffrierten Programms beim Anwender wird das chiffrierte Programm bei Bezugszeichen 5 in den Arbeitsspeicher eines Prozessors geladen und anschliessend sofort der erste Teil des Programms CRYPTO ausgeführt, der die Dechiffrierung besorgt. Die Aktivierung des Dechiffrierteils von CRYPTO erfolgt durch einen Befehl CALL, der dem chiffrierten Programm vorgeschaltet ist und die Dechiffrierroutine als Unterprogramm aufruft. Die Chiffrier-/Dechiffrierroutine von CRYPTO kann aber auch dem eigentlichen Programm insgesamt vorgeschaltet sein, wenn bindefähige, verschiebbare Programm-Moduln zur Verfügung stehen, die in sog. '.REL-Dateien' gespeichert sind. Die Dechiffrierung erfolgt bei Bezugszeichen 7 innerhalb der oben beschriebenen geänderten Adressgrenzen, so dass der Tresor weiterhin chiffriert bleibt. Nach Abschluss des Dechiffriervorgangs werden die Löschroutinen von CRYPTO angesprungen, die dessen Selbstzerstörung (Bezugszeichen 9 ) bewirken (mit Einschluss des Tresors). Anschliessend kann das nunmehr im Klartext vorhandene Programm wie üblich ausgeführt werden. Dem Anwender selbst bleibt die Dechiffrierung völlig verborgen, sein Programm läuft in genau der gleichen Weise ab wie ein im Klartext geliefertes Programm mit Ausnahme einer kurzen Zeitverzögerung (in der Grössenordnung einer Sekunde). Besteht bei einer besti-mmten Programmkopie der Verdacht auf eine Raubkopie, so wird bei Bezugszeichen 6 die bei Bezugszeichen 3 durchgeführte Adressänderung des zu dechiffrierenden Bereichs rückgängig gemacht, so dass der gesamte chiffrierte Bereich wieder im Klartext erscheint. Ausserdem wird in diesem Fall am Ende der Dechiffrierroutine ein Adressstop (8 ) aufgesetzt, der die sonst automatische Selbstzerstörung von CRYPTO und dem Tresor verhindert. Fig. lB zeigt ein schematisches Ablaufdiagramm des Programms CRYPTO selbst mit dem schon erwähnten Chiffrier-/ Dechiffrierteil 11 und 12 und den Löschroutinen 13. Das Programm CRYPTO beginnt im Block 11 mit der Feststellung der Adressgrenzen des zu chiffrierenden oder zu dechiffrie- renden Teils. Die Bestimmung dieser Adressgrenzen ist erforderlich, da CRYPTO für beliebige Programme anwendbar ist und somit an beliebigen Stellen des Adressraums geladen werden kann. Die Adressgrenzen werden jeweils so bestimmt, dass das zu schützende Programm und die Löschroutinen 13 von CRYPTO chiffriert werden. Die Programmteile ll und 12 von CRYPTO bleiben dagegen unchiffriert. Der Adressstop 14 wird bei der Chiffrierung aktiviert. Für die Chiffrierung selbst können die im Stand der Technik bekannten Verfahren und Algorithmen verwendet werden. Ein Beispiel für eine derartige Codierung, die als wechselnden Codierschlüssel die Speicheradresse des jeweils zu chiffrierenden Speicherwortes verwendet, ist in dem Programm enthalten, das im Anhang wiedergegeben ist und aus Befehlen besteht, die der Maschinensprache des bekannten Mikroprozessors Z80 entsprechen. Die Codierung und die Decodierung werden dort gleichermassen durch Exklusiv-Oder-Verknüpfungen (XOR) durchgeführt (Programmzeilen 80 bis 82). Ausserdem erfolgt in Programmzeile 83 eine weitere X0R-Verknüpfung des jeweiligen Speicherworts mit einem Festwert (8 Bits), so dass der Hersteller 255 verschiedene Chiffriermöglichkeiten zur Auswahl hat. Fig. 2A zeigt ein Ablaufprotokoll für die Chiffrierung eines Programms mit dem Z80 Chiffrierprogramm des Anhangs, wenn das zu schützende Programm als sogenannte .COM-Datei innerhalb des Betriebssystems CP/M vorliegt. Derartige Dateien enthalten Programme in Maschinencode, die unter ihrem Namen durch Kommandos des Betriebssystems aufgerufen und dann ausgeführt werden können. Diese Dateien werden immer auf eine feste Adresse des Arbeitsspeichers geladen, z. B. die Adresse 100 (in Hexadezimaldarstellung). Zur Untersuchung des Programmablaufs während der Chiffrierung, Dechiffrierung und zur Ausführung können diese Programme durch ein besonderes Programm des Betriebssystems geladen werden, das die Bezeichnung DDTZ (Dynamic Debug Tool for Z80) trägt. Mit diesem Hilfsprogramm können verschiedene Funktionen aufgerufen werden, beispielsweise die Änderung von Speicherworten oder die Anzeige von Arbeitsspeicherbereichen. Entsprechend der Darstellung in Fig. lA wird in Fig. 2A bei Bezugszeichen 20 das zu chiffrierende Programm mit dem Namen TASTTEST.COM in den Arbeitsspeicher geladen. Ein hexadezimaler Auszug des Arbeitsspeichers von der Adresse 100 bis zur Adresse 27F ist in dem Block mit Bezugszeichen 26 wiedergegeben. Die durch die Hexadezimalcodes im Block 26 dargestellten Zeichen sind in Block 26 a gezeigt. Aufgrund der Chiffrierung ergibt sich in Block 26 a kein lesbarer Text. Bei Bezugszeichen 21 wird durch einen Befehl F (= File) des Hilfsprogramms DDTZ das Chiffrierprogramm mit dem Namen CRYPTO.HEX ab Adresse 200 an das Programm TASTTEST angehängt, so dass insgesamt die Speicherplätze 100 bis 27F (hexadezimal) des Speichers mit beiden Programmen belegt sind. Auf Adresse 100 wird bei Bezugszeichen 22 ein Sprungbefehl (CALL) zum Chiffrier-/ Dechiffrierteil des Programms CRYPTO eingefügt, der auf der Adresse 244 beginnt. Anschliessend wird bei Bezugszeichen 23 am Ende des Chiffrier-/Dechiffrierteils von CRYPTO (bei Adresse 27E) ein Adressstop vorprogrammiert (mit dem DDTZ-Befehl B = Breakpoint), so dass die Ausführung der Löschroutinen von CRYPTO (die in diesem Beispiel bei der Hexadezimaladresse 200 beginnen und sich bis 223 erstrekken) unterdrückt wird. Mit dem DDTZ-Befehl G (= GO) wird anschliessend die Chiffrierung durchgeführt und zwar von der Speicheradresse 103 bis zur Speicheradresse 243 (schraffiert dargestellt). Der Chiffrier-/Dechiffrierteil von CRYPTO beginnend auf der Adresse 244 wird nicht chiffriert. Nach Abschluss der Chiffrierung werden bei Bezugszeichen 24 die Ladebefehle für die Register HL abgeändert; die Register HL bestimmen, bis zu welcher Adresse eine Chiffrierung bzw. Dechiffrierung erfolgen soll. Um einen Bereich von Arbeitsspeicheradressen zu definieren, der bei der nachfolgenden Dechiffrierung nicht mehr ver ändert wird und somit einen Tresor 27 bildet, wird die Adressgrenze, bis zu der eine Dechiffrierung erfolgen soll, kürzer gewählt als die Adressgrenze, bis zu der die Chiffrierung durchgeführt wurde. Die Länge dieses Tresors ist durch entsprechende Definition im Programm CRYPTO frei wählbar. Im vorliegenden Beispiel erstreckt sich der Tresor von hexadezimal 224 bis 243. Nach der Änderung der Adressgrenzen wird bei Bezugszeichen 28 der chiffrierte Code als Datei CHIFFRAT.COM abgespeichert und steht zum Vertrieb zur Verfügung. Der jeweilige Programmname ist dabei frei wählbar. Das Ergebnis der oben beschriebenen Schritte bei der Chiffrierung lässt sich mit dem DDTZ-Befehl D (= Display; Bezugszeichen 25) darstellen, der einen Speicherauszug erstellt. Der Speicherbereich von der Adresse 103 bis 243 ist chiffriert und schraffiert dargestellt. Der durch die Adressänderung definierte Tresor 27 ist doppelt schraffiert gekennzeichnet. Fig. 2B zeigt die Schritte, die bei der Dechiffrierung und bei der Ausführung eines Programms durchlaufen werden, das in chiffrierter Form an einen Anwender geliefert wurde. Die Speicherinhalte nach dem Dechiffrieren und nach dem Löschen des Programms CRYPTO sind wieder durch entsprechende Adressstops sichtbar gemacht, die mit dem Programm DDTZ aufgesetzt werden können, sofern die entsprechenden Endadressen bekannt sind. Dies ist beim Anwender nicht der Fall, so dass dort die Dechiffrierung und die Löschung von CRYPTO automatisch durchgeführt wird. Wenn bei bekannter Endadresse nach dem Laden (Bezugszeichen 30) des chiffrierten Programms CHIFFRAT.COM bei Bezugszeichen 31 mit dem Befehl B 27E ein Adressstop am Ende des Chiffrier-/Dechiffrierteils von CRYPTO aufgesetzt wird, zeigt der Auszug des Arbeitsspeichers 32 zu diesem Zeitpunkt das dechiffrierte, ablauffähige Programm TAST TEST und die dechiffrierten beiden Teile von CRYPTO sowie den immer noch nicht dechiffrierten Tresor innerhalb des Programms CRYPTO. Selbst wenn es einem Anwender also bekannt wäre, an welcher Adresse der erste Teil von CRYPTO endet, wäre ein Zugriff zum Tresor immer noch gesperrt. Den Zustand des Arbeitsspeichers nach der Ausführung des zweiten Teils von CRYPTO mit den Löschroutinen (Eingabe eines Adressstops auf Adresse 103 bei Bezugszeichen 33) zeigt der Speicherauszug 34, in dem alle Teile von CRYPTO mit Einschluss des Tresors überschrieben wurden, und zwar durch den Operationscode C9 des Mikroprozessors Z80, der dem Return-Befehl entspricht. Dadurch werden alle Sprünge in den gelöschten Teil automatisch zum Absprung zurückgeführt. Störungen des auszuführenden Programms sind also selbst dann ausgeschlossen, wenn das geschützte Programm durch eigene Fehler in den gelöschten Bereich gelangt. Nach dem Starten des dechiffrierten Programms TASTTEST (mit dem Befehl G bei Bezugszeichen 35) erfolgt die ungestörte Programmausführung, bei der die Codes der jeweils gedrückten Eingabetaste ausgegeben werden (Bezugszeichen 36). Fig. 2C zeigt in einem Auflaufprotokoll die Schritte, die durchgeführt werden müssen, um das nach Fig. 2A chiffrierte Programm vollständig zu dechiffrieren und so die Herkunft unerlaubt hergestellter Kopien festzustellen. Dazu wird bei Bezugszeichen 41 wiederum das chiffrierte Programm CHIFFRAT.COM in den Arbeitsspeicher geladen. Bei Bezugszeichen 42 werden mit dem Befehl L (= List) die Maschinenbefehle inspiziert, die auf den Adressen 259 und 25C gespeichert sind; es handelt sich dabei um die beiden Ladebefehle für die Register HL, in denen die Adressgrenzen für die Dechiffrierung enthalten sind. Der erste Ladebefehl LD lädt das Register HL mit der weiteren Adressgrenze, der zweite Ladebefehl überschreibt dann diesen ersten Wert mit einer kürzeren Grenze (bei der Chiffrierung wurde wie oben beschrieben gerade umgekehrt verfahren). Mit dem DDTZ-Befehl S (= Substitute) werden bei Bezugszeichen 43 die verkürzten Adresslängen aufgehoben und so die volle Dechiffrierung von CRYPTO mit Einschluss des Tresors vorbereitet. Dazu wird der zweite Ladebefehl einfach mit hexadezimalen Nullen überschrieben, die dem 'NOP'-Befehl entsprechen, der keine Operation ausführt. Die für die Ausführung der Befehle L und S erforderlichen Adressen sind nur dem Hersteller des chiffrierten Programms bekannt; sie ändern sich entsprechend der Länge des jeweils chiffrierten Programms. Bei Bezugszeichen 44 wird wiederum ein Adressstop auf das Ende des Chiffrier-/Dechiffrierteils von CRYPTO gesetzt (bei Adresse 27E, Bezugszeichen 44) und der Dechiffriervorgang gestartet. Nach dem Adressstop wird mit dem DDTZ Befehl D bei Bezugszeichen 45 der Speicherinhalt von Adresse 100 bis 27F angezeigt, so dass der jetzt dechiffrierte Inhalt des Tresors 27 sichtbar wird. Zur Dechiffrierung des Tresors muss also sowohl bekannt sein, an wel chen Adressen des Programms CRYPTO die Dechiffriergrenzen enthalten sind, als auch wo der Adressstop nach dem Ende der Dechiffrierung anzubringen ist; wird die Adressgrenze zu gross gewählt, zerstört die Dechiffrierlogik sich selbst; ist sie zu klein, so wird der Tresor nicht oder nicht voll entschlüsselt. Da beide Informationen einem unerlaubt Kopierenden nicht bekannt sind, besteht für ihn auch keine Möglichkeit, die im Tresor enthaltenen -Identifizierungen zu beseitigen. Nach der Sichtbarmachung des Tresors wird der Löschteil von CRYPTO ausgeführt und nach einem Adretstop 46 bei 103 der Speicherinhalt angezeigt, in dem der dechiffrierte Tresor ebenfalls mit Return-Codes überschrieben ist. Anschliessend wird das Programm TASTTEST wie oben beschrieben ausgeführt. Ein weiterer Schutz des Tresors ist durch dessen Selbstzerstörung bei befugter Durchführung des Programms durch die Löschroutinen von CRYPTO zu sehen. Da ausserdem, wie schon erwähnt, die Ablaufverfolgung des Programms (der sog. Programmtrace) durch Verwendung von Maschinenbefehlen verhindert wird, die dem Assembler und dem Hilfsprogramm DDTZ nicht bekannt sind, besteht für Unbefugte keine Möglichkeit, das Programm im Klartext kennenzulernen. Fig. 3 zeigt eine zweite Möglichkeit, wie die beiden Teile des Programms CRYPTO an ein zu schützendes Programm angefügt werden können. In diesem Fall sind die zu schützenden Programme in sogenannten .REL-Dateien abgelegt, die ebenfalls vom Betriebssystem CP/M in den Arbeitsspeicher geladen werden können. Im Gegensatz zu den .COM-Dateien sind REL-Dateien aber nicht an feste Ladeadressen gebunden, sondern können überall im Arbeitsspeicher einge setzt werden. Bei derartigen Dateien wird der Chiffrier-/ Dechiffrierteil des Programms CRYPTO als Vorspann 62 und sein Löschteil zusammen mit dem Tresor (schraffiert) als Nachspann 63 angefügt. Alle drei Programmteile werden wie üblich durch einen sogenannten Binder miteinander verbunden und in den Arbeitsspeicher geladen (Bezugszeichen 61). Wieder wird, wie im Beispiel von -Fig. 2A, beim Hersteller ein Adressstop am Ende des Chriffrierteils aufgesetzt (hier bei Adresse 129 Bezugszeichen 63) und anschliessend bei Bezugszeichen 64 die Dechiffrierlänge um die Länge des Tresors verkürzt (also statt bis zum Chiffrierende bei 23F nur bis zum Beginn des Tresors bei 220). Anschliessend wird das chiffrierte Programm abgespeichert (Bezugszeichen 65) und kann analog zum Vorgehen nach Fig. 2B und 2C behandelt werden. Bezugszeichen 66 und 66 zeigen den Arbeitsspeicherinhalt nach der Selbstlöschung des zweiteiligen Schutzprogramms. Die Ausführung des Anwendungsprogramms (hier wieder TASTTEST) erfolgt dann ungestört. Für die beiden Versionen des Schutzprogramms CRYPTO, die als Hexadezimaldarstellung in Fig. 2 und 3 wiedergegeben sind, zeigen Anlage 1 bzw. Anlage 2 die ausführlichen Assembler-Listen; die Chiffrier-/Dechiffrierteile und die Löschteile sind durch entsprechende Kommentierung hervorgehoben. Die genaue Beschreibung der aufgeführten Assembler-Befehle ist z. B. in dem Benutzerhandbuch für die z80 Assemblersprache enthalten, das von der Firma Zilog herausgegeben wird. Das Chiffrieren und das Dechiffrieren erfolgt mit denselben Instruktionen (Programmzeilen 79 bis 83 in Anhang 1 und Programmzeilen 24 bis 28 in Anhang 2) durch Exklusiv-Oder-Verknüpfung eines zu chiffrierenden/dechiffrierenden Speicherworts mit seiner Eigenadresse und einem Festwert (hier 5A). Die Programmzeilen 79, 80 und 81, 82 (Anhang 1) sowie 24, 25 und 26, 27 (Anhang 2) z. B. stellen jeweils zusammen eine XOR-Maschineninstruktion des Mikroprozessors dar, die dem Assembler nicht bekannt ist und die er nicht verarbeiten kann; der erste Teil dieses "unbekannten" Operationscodes (z. B. DDAC) wurde deshalb als Konstante im Assemblerprogramm definiert (mit DB). Eine entsprechende Technik ist auch in den Programmzeilen 19 und 33 von Anhang l bzw. 14 des Kopfteils CRYRKOPF und 17 des Fussteils CRYRFUSS von Anhang 2 angewandt. Da diese Operationscodes auch dem Dienstprogramm unbekannt sind, können diese nicht zur Programmablaufverfolgung (TRACE) bei der Chiffrierung/ Dechiffrierung eingesetzt werden, die sonst möglicherweise zur Aufdeckung des Chiffrierverfahrens führen könnte. In ähnlicher Weise versagen sog. Disassembler bei der Aufgabe, aus der Hexadezimaldarstellung des Speicherinhalts wieder eine leicht lesbare Assemblerliste herzustellen; die "unbekannten" Operationscodes werden nicht angezeigt. Anhang 1 - Blatt 1 0001 ; 0002 ; CRYPTO - COM (C) 24.07.1983 0003 ; JOSEF SEIERT, BER-HAUPT-RING 11/6 0004 ; 8000 MUENCHEN 83 WEST GERMANY 0005 ; 0006 0007 ; DIESER MODUL SCHUETZIT ALLE PROGRAMME VOR IHM 0008 ; UND TEILLE VON SICH SELBST VOR SOFTWARE-PIRAT 0009 0010 ; ER LEISTET IM EINZELNEN : 0011 ; 1) VERSCHLUESSELUNG DER BEREICHE VON 103H BI 0012 ; CRYCHI 1 MIT ENTSCHLUESSELUNG ZUR ARBEIT, 0013 ; 2) DIE STRAENDIGE GEHEIMHALTUNG DES TRESORS, 0014 ; 3) DIE SELBSTZERSTOERUNG NACH GETANER ARBEIT 0015 ; 0016 ; DIESE ROUTINE LOESCHT DEN CHIFFRIER-CODE 0017 ; NACH GETANER ARBEIT 0018 ; FDAC 0019 CRYLOE1 DB 0FDH,0ACH ; TRACE BLOCKIEREN 015B00 0020 LD BC,CRYCH13-TRESOR ; BC = CODIER-LAEN 3EC9 0021 LD A,0C9H ; ACCU = 'RETURN' 21CEFF 0022 LD HL,TRESOR-PEGEL D1 0023 POP DE 19 0024 ADD HL,DE ; HL - > CRYCH1: 77 0025 LD (HL),A ; LOESCHE 1. BYTE 54 0026 LD D,H 5D 0027 LD E,L ; DE - > w. BYTE 13 0028 INC DE ED30 0029 LDIR ; BANG !!! 0030 ; 0031 ; LOESCHE CRYLOE1 BIS TRESOR 0032 ; FDAC 0033 CRYKLOE2 DB 0FDH,0ACH ; TRACE BLOCKIEREN 01FFFF 0034 LD BC,-1 ; LAENGE = MAX 3EC9 0035 LD A,0C9H ; ACCU = 'RETURN' 21A9FF 0036 LD HL,CRYLOE1-PEGEL ; HL - > CRYLOE1-BEG D1 0037 POP DE 19 0038 ADD HL,DE 77 00'9 LD (HL),A ; LOESCHE 1. BYTE 54 0040 LD D,H 5D 0041 LD E,L 13 0042 INC DE ED80 0043 LDIR ;BANG !!! C9 0044 RET ;GELDESCHT 0045 ; 34324333 0046 TRESOR DB 'TRESOR - JOSEF SEIFERT - TRESOR' Anhang 1 - Blatt 2 0048 0049 ; DIESER ENTRY WIRD ALS ERSTER ANGESPRUNGEN 0050 ; UM DEN EIGENEN ADRESS-FEGEL ZU ERMITTELN. 0051 ; FDAC 0052 CRYCHI1 DB 0FDH,0ACH ; TRACE BLOCKIEREN 218000 0053 LD HL,00080H ; HL - > EIN FREIES B 3ED1 0054 LD A,0D1H ; ERZEUGEN 'POP DE' 77 0055 LD (HL),A 23 0056 INC HL 3ED5 0057 LD A,0D5H ; ERZEUGEN 'PUSH DE' 77 0058 LD (HL),A 23 0059 INC HL GEC9 0060 LD A,0C9H ; ERZEUGEN 'RETURN' 77 0061 LD CD8000 0062 CALL 00080H ; A(PEGEL) IST IM ST D5 0063 PEGEL PUSH DE D5 0064 PUSH DE 0065 0066 ; DIESE ROUTINE CHIFFRIERT ALLES AB 102H BIS 0067 TRESOR-ANFANG ODER TRESOR-ENDE 0069 21CEFF 0069 LD HL,TRESOR-PEGEL ; KURZE LAENI 21EDFF 0070 LD HL,CRYCHI1-PEGEL ; LANGE LAENI 19 0071 ADD HL,DE 010201 0072 LD BC,0102H ; BC - > CODIER-START ED42 0073 SBC HL,BC ; HL = CODIER-LAENGE 44 0074 LD B,H 4D 0075 LD C,L ; BC = CODIER-LAENGE FD210201 0076 CRYCHI2 LD IY,0102H ; IY - > CODIER-START FD09 0077 ADD IY,BC ; IY ¯ > LAUF. BYTE ED7E00 0078 LD A,(IY) ; ACCU = BYTE FD 0079 DB 0FDH ; NIMM'DEMNAECHST IY 0080 XOR H ; XOR MIT EIGEN FD 0081 DB 0FDH ; NIMM DEMNAECHST IY AD 0082 XOR L ; ADRESSE EE5A 0083 XOR 05AH ; XOR MIT FESTWERT FD7700 0084 LD (IY),A ; BYTE ABLEGEN 03 00B5 DEC BC ; REST - 1 78 0086 LD A,B ; ACCU = B UND C B1 0087 OR A,C ; FERTIG ? 20E9 0088 JR NZ,CRYCHI2 ; NEIN 1880 0089 CRYCHI3 END CRYLDE1 ; LOESCHEN CRYP-CODE (0000) 0090 Anhang 2 - Blatt 1 0001 ; 0002 ; C R Y R K O P F 24.07.83 0003 ; 0004 ; (C) JOSEF SEIFERT GER-HAUPT-RING 11/6 0005 ; 8000 MUENCHEN 83 WEST GERMANY 0006 ; 0007 ; DIES IST DER KOPF-MODUL DES SOFTWARE-SCHUTZ 0008 ; VERFAHRENS CRYPTO-REL 0009 ; 0010 ; 0011 ENTRY CRYRKO1, CRYRKO3 0012 EXTRN CRYRFU1, CRYRFU3, CRYRFUT 0013 ; FDAC 0014 CRYRKO1 DB 0FDH,0ACH ; TRACE BLOCKIEREN 21FFFF&num; 0015 LD HL,CRYRFUT-1 ; HL - > TRESOR-ANFANG 21FFFF&num; 0016 LD HL,CRYRFU3-1 ; HL - > TOTALES ENDE 012800 0017 LD BC,CRYRKO3-1 ; BC - > EIGENES ENDE ED42 0018 SBC HL,BC ; HL = UMCODIER-MENGE 44 0019 LD B,H 4D 0020 LD C,H ; BC = UMCODIER-MENGE DD212800 0021 CRYRKO2 LD IX,CRYRKO3-1 ; IX - > AKTIV-ANFANG DD09 0022 ADD IX,BC ; IX - > LAUF.BYTE DD7E00 0023 LD A,(IX) ; ACCU = BYTE DD 0024 DB 0DDH AD 0025 XOR H ; MIT EIGENDADRESSE DD 0026 DB 0DDH AD 0027 XOR L ; EXKLUSIV ODERN EEA5 0028 XOR 0A5H ; XOR MIT FESTWERT DD7700 0029 LD (IX),A ; CHIFFRAT ABLEGEN 0B 0030 DEC BC ; RESTMENGE - 1 78 0031 LD A,B ; ACCU = B UND C B1 0032 OR A,C ; FERTIG ? 20E9 0033 JR NZ,CRYRKO2 ; NEIN 0034 ; 0035 ; SELBSTZERSTOERUNG DES CHIFFRIER-CODES 0036 ; NACH GETANER ARBEIT 0037 ; CD0000&num; 0038 CALL CRYRFU1 ; EIGENLOESCHUNG 0039 ; (0000) 0040 CRYRKO3 END Anhang 2 - Blatt 2 0001 ; 0002 ; C S 24.07.83 0003 ; 0004 ; (C) JOSEF SEIFERT GER-HAUPT-RING 11/6 0005 ; 8000 MUENCHEN 83 WEST GERMANY 0006 ; 0007 ; DIES IST DER FUSS-MOSUL DES SOFWARE-SCHUTZ 0008 ; VERFAHRENS CRYPTO-REL 0009 ; 0010 ; 0011 ENTRY CRYRFU1, CRYRFU3, CRYRFUT 0012 EXTRN CRYRKO1, CRYRKO3 0013 ; 0014 ; ZERSTCERN DES CHIFFRIER-KOPFES 0015 ; MIT 'RETURN'-BEFEHLEN 0016 FDAC 0017 CRYRFU1 DB 0FDH,0ACH ; TRACE BLOCHIEREN 21FFFF&num; 0018 LD HL, CRYRKO3-1 ; HL - > CHIFKOPF-ENDE 010000&num; 0019 LD BC, CRYRKO1 ; BC -&num; CHIFKOPF-ANFAN ED42 0020 SBC HL,BC ; HL = LOESCH-LAENGE 44 0021 LD B,H 4D 0022 LD C,L ; BC 0023 3EC9 0024 ; LD A,0C9H ; ACCU = 'RETURN' 210000&num; 0025 LD HL,CRYRKO1 ; HL - > CHIFKOPF-ANFAN 77 0026 Lt (HL),A 3 1. BYTE LOESCHEN 110100&num; 0027 LD DE, CRYRKO1+1 ; DE - > 2. BYTE EDB0 0028 LDIR ; CHIF-KOPF LOESCHEN 0029 ; 0030 ; ZERSTOEREN DES TRESORS 0031 ; MIT 'RETURN'-BEFEHLEN 0032 ; 011F00 0033 LD BC, CRYRFU3-CRYRFUT ; TRESOR-LAENGE CEC9 0034 LD A,0C9H ; ACCU = 'RETURN' 213400 0035 LD HL, CRYRFUT ; HL - > TRESOR-ANFANG 77 0036 LD (HL),A ; 1. BYTE LOESCHEN 113500 0037 LD DE, CRYRFUT+1 ; DE - > 2. LOESCHEN EDB0 0038 LDIR ; TRESOR LOESCHEN 0039 ; ZERSTOEREN DES CHIFFRIER-FUSSES 0040 ; MIT 'RETURN'-BEFEHLEN 0042 ; 01FFFF 0043 CRYRFU2 LD BC,-1 ; LAENGE UNENDLICH DEC9 0044 LD A,0C9H ; ACCU = 'RETURN' 210000 0045 LD HL, CRYRFU1 ; HL - > CRYRFU1-ANFANG 77 0046 LD (HL),A ; 1. BYTE LOESCHEN 110100 0047 LD DE, CRYRFU1+1 ; DE - > 2. BYTE EDB0 0048 LDIR ; CHIF-FUSS LOESCHEN C9 0049 RET ; FERTIG 0050 ; 34324553 0051 CRYRFUT DB 'TRESOR - JOSEF SEIFERT - TRESOR 0052 ; (0300) 0053 CRYRFU3 END

Claims: Verfahren zum Schutz von auf maschinenlesbaren Daten trägern aufgezeichneten Programmen vor unerlaubter Einsichtnahme und unerlaubtem Kopieren Patentansprüche 1. Verfahren zum Schutz von auf maschinenlesbaren Datenträgern aufgezeichneten Programmen vor unerlaubter Einsichtnahme und unerlaubtem Kopieren, bei dem eine Chiffrierung durchgeführt wird, gekennzeichnet durch die folgenden Verfahrensschritte: - das zu schützende Programm wird mit einem aus einem Chiffrier-/Dechiffrier- und einem Löschteil bestehenden Schutzprogramm verbunden; - das zu schützende Programm und der Löschteil des Schutzprogramms werden chiffriert; - nach dem Chiffrieren wird im Chiffrier-/Dechiffrierteil des Schutzprogramms die Länge des zu dechiffrierenden Bereichs verkürzt; und - vor der Ausführung des Programms wird der Chiffrier-/ Dechiffrierteil des Schutzprogramms zur Dechiffrierung ausgeführt. 2. Verfahren nach Anspruch 1, dadurch gekennzeichnet, dass im nicht zu dechiffrierenden Teil Informationenen abgelegt werden, die für den jeweiligen Anwender spezifisch sind. 3. Verfahren nach Anspruch 1 oder 2, dadurch gekennzeichnet, dass nach dem Dechiffrieren der Chiffrier-/Dechiffrierteil und der Löschteil des Schutzprogramms gelöscht werden. 4. Verfahren nach Anspruch 3, dadurch gekennzeichnet, dass die zu löschenden Speicherbereiche mit Operationscodes belegt werden, die zum aufrufenden Programm zurückführen. 5. Verfahren nach einem der Ansprüche 1 bis 4, dadurch gekennzeichnet, dass die Chiffrierung und Dechiffrierung durch Exklusiv-Oder-Verknüpfung (XOR) der gespeicherten Information mit der Adresse der Speicherstelle erfolgt. 6. Verfahren nach einem der Ansprüche 1 bis 5, dadurch gekennzeichnet, dass die Chiffrierung und Dechiffrierung durch Exklusiv-Oder-Verknüpfung (xQR) der gespeicherten Information mit einem frei wählbaren binären Festwert erfolgt. 7. Verfahren nach einem der Ansprüche 1 bis 6, dadurch gekennzeichnet, dass das Schutzprogramm so an das zu schützende Programm angefügt wird, dass zuerst der Löschteil des Schutzprogramms und anschliessend der Chiffrier/Dechiffrierteil folgt. 8. Verfahren nach einem der Ansprüche 1 bis 6, dadurch gekennzeichnet, dass der Chiffrier-/Dechiffrierteil des Schutzprogramms vor dem Beginn eines zu schützenden verschiebbaren Programms angefügt wird und der Löschteil an dessen Ende. 9. Verfahren nach einem der Ansprüche 1 bis 8, dadurch gekennzeichnet, dass beim Chiffrieren ein Adressstop auf das Ende des Chiffrier-/Dechiffrierteils des Schutzprogramms aufgesetzt wird. 10. Verfahren nach einem der Ansprüche 1 bis 9, dadurch gekennzeichnet, dass der Chiffrier-/Dechiffrierteil des Schutzprogramms Maschinenbefehle enthält, die weder vom Assemblerprogramm noch von den Dienstprogrammen (z. B. Disassembler oder Debugger) für den benutzten Prozessor (z. B. Z80) verarbeitet werden können.

Inventors: SEIFERT, JOSEF
Applicants: SEIFERT, JOSEF
Application year: 1983
Main classification: G06F13
IPC codes: G06F1, G06F21