Eindeutige Identifikation einer Win-Installation?

Hallo,

ich habe eine Anwendung mit Windows-Forms erstellt und arbeite gerade an der Frage, wie ich das mit der Lizensierung am besten anstelle, um Raubkopien möglichst zu unterbinden.

Dazu möchte ich Daten auslesen, die einen Rechner hardwaremäßig oder eine Windows-Installation eindeutig identifiziert.

Das Auslesen von MAC-Adressen wäre eine Möglichkeit, obwohl man diese manipulieren kann. Ein weiteres Problem wäre, dass jemand mehrere Netzwerkkarten installiert haben könnte und dann stände ich vor dem Problem, an welche ich die Lizenz binde…

Ich habe gehört, dass auch die Möglichkeit existiert, die Prozessor-ID hinzuzuziehen, aber ich habe keine Idee, wie ich daran komme.

Gibt es bei einer Windows-Installation vielleicht einen GUID oder so, auf den ich zugreifen kann?

Hat jemand Vorschläge oder selbst schon einmal an so etwas gearbeitet? Bin für jede Anregung und jeden Hinweis dankbar!

Viele Grüße,
Alexander

Hallo Alex!

Wenn Du solche Merkmale heranziehen willst, um Deine SW zu schützen, dann musst Du aber auch bedenken, dass bei den rechtmäßigen Benutzern praktisch jedes Teil der Hardware ausgetauscht werden kann. Wenn man dann für die Software bezahlt hat und sie plötzlich nicht mehr nutzen kann, dann würde ich zumindest zu Recht stinkesauer werden.

Wie wär’s z.B., wenn Du den Rechnernamen zur Identifikation verwendest?
Dann kann der Anwender beliebige Komponenten austauschen, solange der Rechner nach wie vor so heisst, läuft Dein Programm. Klar, man kann den Rechner umbenennen, aber sobald schon zwei gleichnamige Rechner im selben Netz hängen, bekommt man Probleme, die Mißbrauchsmöglichkeiten durch Manipulation der Umgebung sind also relativ gering.

Unabhängig davon musst Du Dir bewusst sein, dass alles, was Du Dir als Lizenzierung überlegst, mit mehr oder weniger (bei .NET weniger) Aufwand umgangen werden kann, wenn es jemand wirklich darauf anlegt.

Daher würde ich nicht wochen- oder monatelang an einer Lizenzierung programmieren, sondern die Zeit lieber in das eigentliche Programm stecken.
Rechne Dir nur mal aus, welcher finanzielle Verlust Dir durch eine Kopie entsteht. Und dann überleg’ Dir, wieviele Kopien zu erwarten sind. Und daraus rechnest Du mal aus, wie lange Du an so einem Kopierschutz arbeiten dürftest, um auf +/- 0 zu kommen (Entwicklungszeit, die Du da reinsteckst, ist letztlich verloren - kein Kunde zahlt für einen Kopierschutz!).

Wenn Du die Installation jeweils rechnerspezifisch schützen willst, dann musst Du irgendwelche Eigenschaften des Systems hernehmen, auf dem installiert wird.
Diese Info hat man ja normalerweise vor der Installation nicht.
Wenn man dann ins Programm (oder in den Installer) eine Routine einbaut, die diese Information irgendwo auf dem Rechner speichert (Registry, versteckte Dateien, …), dann hast Du einerseits in Deinem Programm den Algorithmus, nach dem Du lizensierst, enthalten und damit offengelegt (die Decompiler sind wirklich gut…) und andererseits ist es ein Leichtes, Änderungen an der Registry oder am Dateisystem zu überwachen und herauszubekommen, wo was geändert wurde.

Ein anderer Weg (den auch wir in der Firma gewählt haben), ist, dass der Kunde den oder die Rechnernamen angeben muss, auf denen die SW betrieben werden soll und wir dann eine Lizenzdatei erstellen, die die zulässigen Rechner enthält und die nach der Installation eingespielt werden muss. Diese Lizenzdatei ist mit einem asymmetrischen Schlüssel signiert, kann also nicht ohne weiteres geändert werden.
In der SW ist der public key enthalten, um die Gültigkeit der Signatur überprüfen zu können, den private key zum Erstellen der Signatur haben nur wir.

Funktioniert gut und war mit vertretbarem Aufwand zu realisieren.

Natürlich kann man immer noch hergehen, die Anwendungen decompilieren, die Aufrufe an die Lizenzüberprüfung rausnehmen und wieder compilieren, aber für die allermeisten Kunden reicht diese Art der Lizenzierung dicke…

Gruß,
Martin

Hallo Martin,

Wenn Du solche Merkmale heranziehen willst, um Deine SW zu
schützen, dann musst Du aber auch bedenken, dass bei den
rechtmäßigen Benutzern praktisch jedes Teil der Hardware
ausgetauscht werden kann. Wenn man dann für die Software
bezahlt hat und sie plötzlich nicht mehr nutzen kann, dann
würde ich zumindest zu Recht stinkesauer werden.

Würde ich auch - daher läuft alles noch mit neuer Hardware - lediglich wird mein Server von dieser Änderung unterrichtet. Zwischendurch nimmt das Programm Kontakt zum Server auf, und wenn dann festgestellt wird, dass offenbar die gleiche Lizenz auf vielen verschiedenen Hardwarekonfigurationen „parallel“ läuft, dann bekomme ich eine Mail und kann selbst entscheiden…

Im Zweifel für den Kunden (oder leider den Raubkopierer), das ist klar, aber einen geringen Schutz will ich, damit wenigstens nicht jeder ohne Probleme kopieren kann, denn, auch, wenn ich das selbst nicht mehr mache, weiß ich, wie das läuft (der „Normaluser“ hat kaum ein Bewusstsein für die Unrechtmäßigkeit des Kopierens). Auf diese Weise habe ich meiner Meinung nach das optimalste Verhältnis von Aufwand und Nutzen.

Wie wär’s z.B., wenn Du den Rechnernamen zur Identifikation
verwendest?
Dann kann der Anwender beliebige Komponenten austauschen,
solange der Rechner nach wie vor so heisst, läuft Dein
Programm. Klar, man kann den Rechner umbenennen, aber sobald
schon zwei gleichnamige Rechner im selben Netz hängen, bekommt
man Probleme, die Mißbrauchsmöglichkeiten durch Manipulation
der Umgebung sind also relativ gering.

Ich nehme jetzt doch die MAC-Adressen.

Unabhängig davon musst Du Dir bewusst sein, dass alles, was Du
Dir als Lizenzierung überlegst, mit mehr oder weniger (bei
.NET weniger) Aufwand umgangen werden kann, wenn es jemand
wirklich darauf anlegt.

Daher würde ich nicht wochen- oder monatelang an einer
Lizenzierung programmieren, sondern die Zeit lieber in das
eigentliche Programm stecken.
Rechne Dir nur mal aus, welcher finanzielle Verlust Dir durch
eine Kopie entsteht. Und dann überleg’ Dir, wieviele Kopien zu
erwarten sind. Und daraus rechnest Du mal aus, wie lange Du an
so einem Kopierschutz arbeiten dürftest, um auf +/- 0 zu
kommen (Entwicklungszeit, die Du da reinsteckst, ist letztlich
verloren - kein Kunde zahlt für einen Kopierschutz!).

S.o. :wink:

Ein anderer Weg (den auch wir in der Firma gewählt haben),
ist, dass der Kunde den oder die Rechnernamen angeben muss,
auf denen die SW betrieben werden soll und wir dann eine
Lizenzdatei erstellen, die die zulässigen Rechner enthält und
die nach der Installation eingespielt werden muss. Diese
Lizenzdatei ist mit einem asymmetrischen Schlüssel signiert,
kann also nicht ohne weiteres geändert werden.
In der SW ist der public key enthalten, um die Gültigkeit der
Signatur überprüfen zu können, den private key zum Erstellen
der Signatur haben nur wir.

Klingt gut, dazu habe ich aber noch eine Frage: Ihr erstellt also eine Datei, in der die Konfiguration (oder der Rechnername) gespeichert ist, und übergebt diese asymmetrisch verschlüsselt an den Kunden. Mit einem Public Key kann dann eure Software die Gültigkeit des Schlüssels überprüfen - aber doch nicht, welche Konfigurationsinformationen in der Datei enthalten sind (denn zum Entschlüsseln braucht man den Private Key). Dann kann doch die Lizenzdatei ohne Probleme auch in „falschen Systemen“ verwendet werden, oder??

Danke und viele Grüße
Alexander

Hallo Martin,

Wenn Du solche Merkmale heranziehen willst, um Deine SW zu
schützen, dann musst Du aber auch bedenken, dass bei den
rechtmäßigen Benutzern praktisch jedes Teil der Hardware
ausgetauscht werden kann. Wenn man dann für die Software
bezahlt hat und sie plötzlich nicht mehr nutzen kann, dann
würde ich zumindest zu Recht stinkesauer werden.

Würde ich auch - daher läuft alles noch mit neuer Hardware -
lediglich wird mein Server von dieser Änderung unterrichtet.
Zwischendurch nimmt das Programm Kontakt zum Server auf, und
wenn dann festgestellt wird, dass offenbar die gleiche Lizenz
auf vielen verschiedenen Hardwarekonfigurationen „parallel“
läuft, dann bekomme ich eine Mail und kann selbst
entscheiden…

Ich weiss nicht, welche Zielgruppe Du hast, aber bei uns ist der direkte Internetzugang der Ausnahmefall (Ärzte, Krankenhäuser), darum ging so eine Lizenzierung übers Netz nicht.

Im Zweifel für den Kunden (oder leider den Raubkopierer), das
ist klar, aber einen geringen Schutz will ich, damit
wenigstens nicht jeder ohne Probleme kopieren kann, denn,
auch, wenn ich das selbst nicht mehr mache, weiß ich, wie das
läuft (der „Normaluser“ hat kaum ein Bewusstsein für die
Unrechtmäßigkeit des Kopierens). Auf diese Weise habe ich
meiner Meinung nach das optimalste Verhältnis von Aufwand und
Nutzen.

Wie wär’s z.B., wenn Du den Rechnernamen zur Identifikation
verwendest?
Dann kann der Anwender beliebige Komponenten austauschen,
solange der Rechner nach wie vor so heisst, läuft Dein
Programm. Klar, man kann den Rechner umbenennen, aber sobald
schon zwei gleichnamige Rechner im selben Netz hängen, bekommt
man Probleme, die Mißbrauchsmöglichkeiten durch Manipulation
der Umgebung sind also relativ gering.

Ich nehme jetzt doch die MAC-Adressen.

Unabhängig davon musst Du Dir bewusst sein, dass alles, was Du
Dir als Lizenzierung überlegst, mit mehr oder weniger (bei
.NET weniger) Aufwand umgangen werden kann, wenn es jemand
wirklich darauf anlegt.

Daher würde ich nicht wochen- oder monatelang an einer
Lizenzierung programmieren, sondern die Zeit lieber in das
eigentliche Programm stecken.
Rechne Dir nur mal aus, welcher finanzielle Verlust Dir durch
eine Kopie entsteht. Und dann überleg’ Dir, wieviele Kopien zu
erwarten sind. Und daraus rechnest Du mal aus, wie lange Du an
so einem Kopierschutz arbeiten dürftest, um auf +/- 0 zu
kommen (Entwicklungszeit, die Du da reinsteckst, ist letztlich
verloren - kein Kunde zahlt für einen Kopierschutz!).

S.o. :wink:

Ein anderer Weg (den auch wir in der Firma gewählt haben),
ist, dass der Kunde den oder die Rechnernamen angeben muss,
auf denen die SW betrieben werden soll und wir dann eine
Lizenzdatei erstellen, die die zulässigen Rechner enthält und
die nach der Installation eingespielt werden muss. Diese
Lizenzdatei ist mit einem asymmetrischen Schlüssel signiert,
kann also nicht ohne weiteres geändert werden.
In der SW ist der public key enthalten, um die Gültigkeit der
Signatur überprüfen zu können, den private key zum Erstellen
der Signatur haben nur wir.

Klingt gut, dazu habe ich aber noch eine Frage: Ihr erstellt
also eine Datei, in der die Konfiguration (oder der
Rechnername) gespeichert ist, und übergebt diese asymmetrisch
verschlüsselt an den Kunden. Mit einem Public Key kann dann
eure Software die Gültigkeit des Schlüssels überprüfen - aber
doch nicht, welche Konfigurationsinformationen in der Datei
enthalten sind (denn zum Entschlüsseln braucht man den Private
Key). Dann kann doch die Lizenzdatei ohne Probleme auch in
„falschen Systemen“ verwendet werden, oder??

Ja, das war ein Punkt, über den ich anfangs auch gestolpert bin.
Im Netz fanden sich widersprüchliche Aussagen, sogar in eigentlich renomierten Zeitschriften (ich glaube im dot.net Magazin) stand Blödsinn, Fakt ist aber, dass man tatsächlich nur mit dem Public Key verschlüsseln und dem Private entschlüsseln kann (der umgekehrte Weg funktioniert nicht!)

Somit kann die Konfigurationsinfo nicht in der Lizenzdatei verschlüsselt sein, weil sonst das Programm selbst irgendwie Zugriff auf den Private Key bräuchte, und das will man natürlich vermeiden.

Was man aber machen kann, ist, die Lizenzdatei (die bei uns die Konfiguration frei lesbar enthält) zu signieren.
Ob die Signatur noch zum Inhalt passt lässt sich sehr leicht mit dem Public Key entscheiden.

Damit wird die Lizenzdatei gegen Manipulationen gesichert (wenn z.B. jemand versucht, den Rechnernamen zu ändern oder einen neuen Rechnernamen anzuhängen, dann stimmt die Signatur nicht mehr und die Lizenzdatei ist ungültig) und ich muss nur den Public Key in der SW mitgeben.

Danke und viele Grüße
Alexander

Grüße,
Martin