Einzelnen Beitrag anzeigen

Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#1

Kopierschutz einer Anwendung

  Alt 21. Nov 2006, 14:13
Hi;

Ich habe mir ein Kopierschutz / Passwortschutz ausgedacht, welchen ich euch kurz erklären möchte. Bitte nennt mir Schwachstellen und Verbesserungsvorschläge.

Folgendes soll der Schutz können
  • (a) Eine Programmlizenz darf nur einmal verwendet werden
  • (b) Eine Programmlizenz muss einer Firma zugeordnet werden können

Gegenbenheiten
  • Ex existiert ein einmaliger PC Key (Hardware, Windows Produkt ID, etc...) der nicht veränderbar und einmalig ist
  • Jede Firma bekommt eine (!) Seriennummer
  • Jede Firma bekommt einen Installationskey
  • Für jede Lizenz die erstellt wird wir eine einmalige Nummer angelegt

Beispiel: Kunde Müller bestellt 10 Lizenzen unseres Programmes
Also bekommt er von uns:
  • Eine (!) Seriennummer, z.B. Beispiel 001-SER-IEN-N00-000
  • 10 Lizenzdateien

Die Lizenzdateien haben den Inhalt
Zitat:
Lizenzdatei
Seriennummer=001-SER-IEN-N00-000
ClientID=000-000-000-001
HashSum=<<<Prüfsumme der oberen Werte zum Schutz vor Veränderungen>>>
Die CLientID wird je Lizenz vorlaufend hochgezählt, also:

Zitat:
Lizenz 1 :: ClientID=000-000-000-001
Lizenz 2 :: ClientID=000-000-000-002
Lizenz 3 :: ClientID=000-000-000-003
Lizenz 4 :: ClientID=000-000-000-004
Anschließend verkaufen wir das ganze und Tragen in unser Webdatenbank folgendes ein:

Delphi-Quellcode:
Tabelle HardwareKeys

Client ID Hardwarekey
----------------------- -----------------------
ClientID=000-000-000-001 <Liste> (noch leer)
ClientID=000-000-000-002 <Liste> (noch leer)
{...}
ClientID=000-000-000-010 <Liste> (noch leer)


Tabelle Installkeys

Seriennummer Installkey
----------------------- -----------------------
001-SER-IEN-N00-000 INS-TAL-L02-302

Wir schicken dem Kunden das Packet zu, und legen eine CD mit rein (Das Programm), sowie eine weitere CD mit den 10 Lizenzdateien. Auf einen Zettel schreiben wir den Installationskey (INS-TAL-L02-302). Auf dem Zettel mit dem Installationskey schreiben wir außerdem drauf, das der Installationskey VERTRAULICH zu behandelt ist.

... die post verschickt das Packet ...

... am Nächsten Morgen kommt es beim Kunden an, er packt es aus und Installiert auf PC1 die Software. Für die Installation ist kein Code erfoderlich. Beim ersten Start des Programmes erstellt das Programm den einmaligen PC Hardware Key.

Das Programm fragt nach einiger gültigen Lizenzdatei, welcher wir ihm geben. Er verbindet sich mit unserem Webserver und schaut, in der Tabelle "Installkeys" ob die Seriennummer aus der Lizenzdatei vorhanden ist.

Wenn die Seriennummer vorhanden ist, fragt er uns nach dem Installationskey. Wir geben ihn also ein (INS-TAL-L02-302). Er prüft ob mit Hilfe unserer Webdatenbank mit der Tabelle Installkeys, ob die Seriennummer + Installkey zusammengehören. Wenn ja, registriert sich das Programm in der Tabelle HardwareKeys mit seinem PC Hardwarekey. Wenn der Hardwarekey (1234-Hard-ware) lauten würde, würde unsere Webdatenbank danach so aussehen:

Delphi-Quellcode:
Tabelle HardwareKeys

Client ID Hardwarekey
----------------------- -----------------------
ClientID=000-000-000-001 1234-Hard-ware
ClientID=000-000-000-002 <Liste> (noch leer)
{...}
ClientID=000-000-000-010 <Liste> (noch leer)


Tabelle Installkeys

Seriennummer Installkey
----------------------- -----------------------
001-SER-IEN-N00-000 INS-TAL-L02-302
Eine ClientID ist also jetzt einem PC Hardware Key in unserer Datenbank zugeordnet.

Was passiert nun wenn wenn ein anderer PC (mit einem anderen Hardwarekey) ebenfalls versuchen würde, mit einer ClientID welche bereits auf einen andern PC registriert ist, das Programm zu starten?

Wenn er merken würde, das die ID bereits vergeben ist und den Start verweigern würden hätten wir ein Problem: Wenn die Hardware geändert wird, könnte der Kunde das Programm nicht mehr starten.

ALso registriert sich der PC ebenfalls mit seinem Hardwarekey (4567-Hard-ware) in der Liste. Dafür fragt er zuerst nach dem geheimen, zur Seriennummer gehörenden Installkey, erst dann lässt sich das Programm registrieren. Dann sieht unsere Webdatenbank so aus:

Delphi-Quellcode:
Tabelle HardwareKeys

Client ID Hardwarekey
----------------------- -----------------------
ClientID=000-000-000-001 1234-Hard-ware
                               4567-Hard-ware

ClientID=000-000-000-002 <Liste> (noch leer)
{...}
ClientID=000-000-000-010 <Liste> (noch leer)


Tabelle Installkeys

Seriennummer Installkey
----------------------- -----------------------
001-SER-IEN-N00-000 INS-TAL-L02-302

Oben in der Liste der HardwareKeys einer ClientID steht immer der zu letzt hinzugefügte / überprüfte Key!

Dieser Vorgang passiert nun bei jedem programmstart und zusätzlich noch mal alle 24 Stunden wenn das Programm dauerthaft läuft. Er prüft jedesmal, ob die Kombination von ClientID + seinem HardwareKey vorhanden ist. Des weiteren Überprüft er, ob Sein Hardwarekey auf Platz 1 der Liste steht. Wenn dies nicht der Fall ist, wird sein Key auf Platz 1 gesetzt.


--------------

Zusammenfassung der ganz oben genannten Punkte

(a) Eine Programmlizenz darf nur einmal verwendet werden

Bei jeder Änderung wird auf der Logdatei unseres Webservers ein Eintrag erstellt. Normalerweise sieht diese im Zeitraum vom 01 Januar bis 07 Januar so aus:

Zitat:
01-Jan-07 10:00 Uhr :: HardwareKey (1234-Hard-ware) wurde ClientID (000-000-000-001) hinzugefügt
Würden 2 Computer ein und die selbe Lizenz verwenden sieht die Log so aus:

Zitat:
01-Jan-07 10:00 Uhr :: HardwareKey (1234-Hard-ware) wurde ClientID (000-000-000-001) hinzugefügt
01-Jan-07 10:00 Uhr :: HardwareKey (5678-Hard-ware) wurde ClientID (000-000-000-001) hinzugefügt
01-Jan-07 10:23 Uhr :: HardwareKey (1234-Hard-ware) wurde ClientID (000-000-000-001) als Default Wert festgelegt
01-Jan-07 10:33 Uhr :: HardwareKey (5678-Hard-ware) wurde ClientID (000-000-000-001) als Default Wert festgelegt
01-Jan-07 10:55 Uhr :: HardwareKey (1234-Hard-ware) wurde ClientID (000-000-000-001) als Default Wert festgelegt
01-Jan-07 11:03 Uhr :: HardwareKey (5678-Hard-ware) wurde ClientID (000-000-000-001) als Default Wert festgelegt
01-Jan-07 11:04 Uhr :: HardwareKey (1234-Hard-ware) wurde ClientID (000-000-000-001) als Default Wert festgelegt
01-Jan-07 18:04 Uhr :: HardwareKey (5678-Hard-ware) wurde ClientID (000-000-000-001) als Default Wert festgelegt
Diese Log wäre für uns In der Form ein Idiz dafür, das eine Lizenz doppelt verwendet wird.


(b) Eine Programmlizenz muss einer Firma zugeordnet werden können

Ist dank der einmaligen Seriennummer je Firma ohne Probleme möglich. So kann geschaut werden, welche Firma illegalerweise eine Lizenz weitergegeben hat.


Gibt es in der denkweise Schwachstellen ? Was bitte erst mal außen vorbleibt, sind die Möglichkeit das Programm zu patchen und die Abfrage zu überbrücken.


Eine Frage bleibt offen: Wie erstelle ich einen einmaligen, unfälschbaren Hardwarekey... ?
  Mit Zitat antworten Zitat