# Java Programm mit Freischalt code entwickeln



## GAST__ (23. Okt 2009)

Hallo,

Ich wollte mal fragen ob es eine bestimmte vorgehensweise gibt um seine software mit einem key zu schützen ? 
Der User soll die möglichkeit haben ein programm herunterzuladen und zu benutzen, wenn es ihm gefällt muss er sich regestrieren und bekommt den key. 

Ich hab bloß gerade gar keine idee wie ich sowas umsetzten könnte deswegen wäre ich für denkanstöße dankbar.

oder kennt jemand dazu villeicht sogar ein kleines tutorial ?  

Vielen dank für tipps


----------



## Sonecc (23. Okt 2009)

Programm schreiben.
Beim Programmstart ein Fenster öffnen, in dem nach dem Key gefragt wird.
Den Key prüfen (über einen entsprechenden Algorithmus)
Wenn key in ordnung, dann weiter, wenn nicht, dann nicht...


Der Algorithmus könnte zum beispiel bestimmte daten (wie email addresse) in einen ASCII Code umwandeln, diesen Code dann in bestimmter form verarbeiten (einfaches beispiel wäre die Zeichen um X nach rechts zu verschieben) und das wird dann der Key...

Gibt viele Möglichkeiten das zu bewerkstelligen. Wie man das dann genau macht, musst du dir überlegen, das waren grade nur so gedanken die mir kamen und dir helfen sollen.
Bedenke auch, dass mein vorgeschlagenes Beispiel nicht sonderlich sicher ist und schnell geknackt werden kann.


----------



## bygones (23. Okt 2009)

oder Server haben den das Programm kontaktieren muss und dann ueber normales User / Password prinzip sich legitimieren.

ist halt die frage ob du den User "zwingen" willst online zu sein bzw ob du dafuer einen server hast


----------



## GAST__ (23. Okt 2009)

Das es schnell gegnackt werden kann ist erstmal nicht so schlimm, erstmal halt die grundsachen entwickeln ;-)

Die idee mit der mail adresse finde ich gut .... 

Also ich klicke im Programm auf Aktivieren / regestrieren und geb meine email adresse, namen und pwd ein, dann sendet er die daten zu einem servlet was auf einem server liegt und in die datenbank speichert, dann wird der code generiert und zurück ans programm gesendet / oder online angezeigt. 


Und wenn man nur ein paar funktionen benutzen kann, bevor es aktiviert ist, könnte man ja einfach die sachen, die nicht verwendet werden sollen vor der aktivierung, deaktiviert werden, oder einfach nicht mit auf den Frame.
Oder gibts da andere vorschläge ? 
Eine Klasse die Aufgerufen wird wenn das programm nicht aktiviert wird und eine wenn es aktiviert ist. 

Danke für die tipps =)


----------



## Sonecc (23. Okt 2009)

Man könnte es so machen.
Man könnte aber auch einfach vordefinierte Keys in der Datenbank speichern, dann braucht man auch keine besonderen Daten.
Oder man definiert eben "nur" einen Algo der definiert und nichts ins Internet schickt.
Ist halt wie man will.
In der heutigen zeit, sollte es kein Problem sein, wenn die User im Netz sein müssen, um ein Programm zu aktivieren.
Beachte aber, dass die Daten, die du sammeln willst, unter das Datenschutzgesetz fallen.


----------



## GAST__ (23. Okt 2009)

Es sollen aber auch Nur ein NickName pwd und email Adresse gespeichert werden. 
Also ansonsten moechte ich nix speichern.

Und ich denke auch das ich internet voraussetzen kann, alleine schon weil das programm auch nur aus dem Internet herunter geladen werden kann. 
Und die Sicherheit des Keys liegt an zweiter stelle weil die programme eh kostenlos seien sollen. 
Das ist mehr für mich zum lernen gedacht und weil ich zu soetwas lust habe =)
Ich finde es ist ein Interesantes Thema, da soetwas bei den meisten anwendungen die man kaufen kann verwendet wird.

An die Idee vordefinierte Keys in der datenbank zu definieren hab ich auch schon gedacht....
und beim aktivieren wird hinter den verwendeten code einfach ein Flag gesetzt das dieser Key registriert ist. 
Aber dann muss man diesen Key ja bei jedem Download erzeugen, anzeigen und in der DB speichern und als unregistriert makieren. Bloß hier würde mir ebenfalls eine Idee zur erzeugung des Keys fehlen, hast du da noch eine Idee ?
vielleicht software name und die anzahl wie oft die software gedownloaded ist, man braucht ja i-ein variablen wert.


----------



## Sonecc (23. Okt 2009)

Stichwort Zeitpunkt.
Lass dir die Zeit in millisekunden ausgeben und spiel etwas mit der Zahl rum, bis du einen key daraus hast...


----------



## GAST__ (23. Okt 2009)

Das ist eine gute idee =)
Ich Danke dir für die Tips.

Damit werde ich mal ein wenig rumspielen.


----------



## MrWhite (23. Okt 2009)

Ich würde einfach persönliche Informationen mit einer Bitmaske xoren und das Ganze dann als base64 codieren. Dann haste nen schönen Key.

Ob es geknackt werden kann, ist eh egal. Der einfachste Schutz stellt schon eine unüberwindbare Hürde für 99% der User dar und der Rest wird eine clientseitige Validierung sowieso knacken, für die ist das nur eine Frage der Zeit.


----------



## GAST__ (23. Okt 2009)

Also ich hab mir jetzt überlegt (da ich noch nich weiß ob ich "persönliche daten" speichere), das ich den namen des Programms und einen zeitstempel nehme -> mir dann das byte array vom String nehme -> die elemente ein wenig verschiebe oder/und  verändere. Dann generiere ich aus dem erzeugten byte array ein Hex String. Den benutze ich dann als Key. 
Beim download wird der code generiert und angezeigt. und als unregistriert in die Datenbank eingetragen. Wenn der User das Programm startet muss er den Key eingeben -> das programm verbindet sich zur website und fragt nach ob der code exestiert und noch nicht registriert ist. Ist er nicht registriert, wird er registriert und das programm ist aktiviert. Wenn der key schon registriert ist, schlägt der versuch der aktivierung fehl. Ebenfalls wenn kein Eintrag mit diesem Key in der Datenbank ist. Solange das programm nicht aktiviert ist, soll ja die "demo-" version ausgeführt werden. 

Wie merke ich mir nun ob das programm aktiviert ist oder nicht ? 
-> XML Datei - kann jeder lesen und einfach ändern...dann wäre die ganze aktivierung ja witzlos xD
-> Datei mit beliebiger Endung und den eintrag als Hex speichern das normal anwender das nicht lesen können. 
-> hab auch a einen registry eintrag gedacht, aber das funktioniert nur unter windows, unter linux würde dann eine xml datei angelegt werden. 

Wie würdet ihr das realisieren?


----------



## bygones (23. Okt 2009)

a) bei programmstart immer den server anfragen ob programm registriert ist
c) den key bei registrierung als binaer wild in eine datei speichern und beim starten immer abgleichen


----------



## GAST__ (23. Okt 2009)

In dem Fall gäbe es doch nur 2 möglichkeiten das programm zu knacken:

 -> webserver hacken und manuell ein key in die Datenbank eintragen und als unregstriert makieren. Und dann mit diesem Key die software aktivieren.

-> "Crack" ... Die Main Klasse neu implementieren, in der ja alles geprüft wird und dann die demo version oder Original version gestartet wird xD

[x] so genannte "KeyGens" wären ja nicht möglich da der generierte Key zwar vom aufbau richtig sein könnte, ja aber nicht in der Datenbank steht.

Und ich denke das ist doch eine recht hohe sicherheit


----------



## Sonecc (23. Okt 2009)

Nicht ganz
Irgendwo musst du ja auch lokal den Key speichern und wenn diese Datei gefunden wird, kann sie jeder verwenden um damit dann sein Programm als aktiviert da stehen zu lassen


----------



## GAST__ (23. Okt 2009)

Nein, da wenn jemand den Key findet kann er den zwar eingeben aber dann verbindet sich das programm zur Datenbank und sagt das dieses dieser key bereits verwendet wird.
Und somit wird das programm nicht wieder freigeschaltet.


----------



## Sonecc (23. Okt 2009)

Beispiel
Benutzer A hat dein Programm und aktiviert es.
Nun geht Hacker B hin und nimmt sich die Key datei von A.
B überschreibt nun seine Key Datei, die ja keinen Key enthält und startet sein Programm.
Das Programm überprüft nun den Key von B, welcher der gleiche ist, wie der von A.
Der Server meldet das alles ok ist, weil der Key ja vorhanden und aktiviert ist
Das Programm startet und B hat keinen eigenen key gehabt


----------



## GAST__ (23. Okt 2009)

OH,

Stimmt, somit wäre das sogar ein leichtes das zu umgehen.

Bloß wüsste ich nicht wie man dieses verhindern kann.

Man könnte ja theoretisch auch einfach das komplette registrierte programm von Benutzer A nehmen und bei sich auf den Computer kopieren. Dann muss man nichtmal die datei mit dem key suchen. 
Also bringt ja alles verstecken des Keys nix 
=( 

ich hab keine idee wie das schützen kann.


Die einzigste idee wäre :
zum generierten key ein user name und pwd zu speichern. Dann müsste man bei jedem start sein user namen und pwd angeben. Wer hat darauf schon lust  
Aber wenn einer ein key hat und anmelde daten. kann er diese ebenso weitergeben...
DAs heißt das dies auch keine geeignete möglichkeit wäre.


----------



## Sonecc (23. Okt 2009)

und jetzt wissen wir, warum es sowas wie DRM und Co gibt :lol:


----------



## JohannisderKaeufer (24. Okt 2009)

Ich sag nur Token.
1. Start:
Programm generiert ein Token.
Username + Token(A) -> Server
Password  + neues Token(B) -> Client
Password + Username + Token(B) werden Clientseititg zusammen validiert

2. Start:
Username + Token(B) -> Server
Validierung das Token(B) aktuell ist...
Password + neues Token(C) -> Client
Password + Username + Token(C) werden Clientseititg zusammen validiert



Das aktuelle Token wird Clientseitig und Serverseitig gespeichert.
Da immer ein neues Token generiert wird, kann auch nur ein Programm gestartet werden.
Das starten des Programms mit einem bestimmten Token entwertet diesen also.

Wenn also der Token an den nachbarn weitergegeben wird und dieser das Programm startet funktioniert das.
Das Token das du besitzst veraltet aber, so daß du dein Programm nicht mehr starten kannst.

3. Start
Username + Token(B) -> Server
Token(B) ist nicht mehr aktuell sondern Token(C) -> Programm startet nicht


----------



## darkeye2 (25. Okt 2009)

Die letzte erklärung fand ich jetzt irgendwie kompliziert, ich würde volgendes vorschlagen:
der key wird aus name und pw generiert, und in ner db gespeichert, wenn jemand das prog startet, wird der name und pw einfach mit entsprechenden algo umgewandelt, und es wird geprüft, ob der key vorhanden ist .... oder um es noch sicherer zu gestalten:
du suchst dir daten vom pc aus, die man auslesen kann (irgendwas was bei allen betriebssystemen da ist .... und dann wird einfach das noch in den key mit aufgenommen, somit kann es keiner knacken, ausßer er kennt bentzernamen und pw von einem der sich registriert hat, und hat auch noch seinen pc ^^


----------



## GAST__ (25. Okt 2009)

Das mit den Token, finde ich, ist eine sehr gute idee. 

Und i-was vom Betriebssystem zu nehmen, hab ich auch schon dran gedacht. Bei Windows gibt es doch immer son aktivierungscode...aber ich weiß ja nicht wie das so unter den verschiedenen Linux Distributionen aussieht.


----------



## Spacerat (25. Okt 2009)

Meine Idee dazu wäre: Der Keyfile (bzw. das was man über den Server bekommt) ist eine RSA-Verschlüsselte Klasse, nennen wir sie ExtendsMain, die, wenn man sie entschlüsselt, essentielle Methoden (z.B. Load oder Save) der Main-Klasse überschreibt.

Der Vorgang:
1. Der Händler verschlüsselt ExtendsMain mit seinem privatem Schlüssel und den Userdaten.
2. Die verschlüsselte ExtendsMain wird dem User per Sitzung (online) oder per Installation zugänlich gemacht.
3. Beim Programmstart wird ExtendsMain mit dem öffentlichen Schlüssel und den Userdaten entschlüsselt.
4. Per Factory wird versucht, sich eine Instanz von Main zu besorgen. Nur wenn ExtendsMain erfolgreich entschlüsselt wurde, kann diese als Instanz zurückgegeben werden.

Beim "per Installation"-Verfahren kann man die TimeStamp der Installation noch mit in die Verschlüsselung einbeziehen. Generierte KeyFiles laufen dann nur auf dieser einen Installation. Das hätte aber den Nachteil, das man sich bei jeder Neuinstallation erneut registrieren muss.

Da man sich beim Verschlüsseln nicht unbedingt auf eine Klasse beschränken muss, sondern sogar ganze Archive verschlüsseln kann, hat man obendrein noch ein weitaus effektiveres Verfahren, seine Software gegen Dekompilieren zu "schützen" als simple Obfuscation. [edit]Aus Performancegründen sollte man es hier aber nicht übertreiben [/edit]


----------



## JanHH (26. Okt 2009)

Wie auch immer man das machen will, die grundsätzliche Schwäche von java ist ja die sehr einfache Möglichkeit des reverse engineering. Man muss im Sourcecode nur die Stelle finden, an der die Überprüfung stattfindet, und sie durch ein simples "return true" oder so ersetzen, und schon waren alle Bemühungen umsonst.

Daher also auf keinen Fall den Obfuscator vergessen! Aber so 100%ig helfen tut das auch nicht. Hab das auch mal mit einem Freund diskutiert, was man da machen kann. Der meinte, die beste Lösung wäre (und es macht ja offenbar nix, wenn das Programm nur läuft wenn der Rechner online ist, da ein Kontakt zum Server eh stattfinden muss), einen eigenen class loader zu schreiben, der Teile des Programms überhaupt erst dann vom Server lädt, so dass gar nicht erst irgendwas reverse-engineerbares lokal vorhanden ist. Auch das kann man irgendwie hacken, aber das wird dann schon ziemlich aufwändig.


----------



## Spacerat (26. Okt 2009)

> Wie auch immer man das machen will, die grundsätzliche Schwäche von java ist ja die sehr einfache Möglichkeit des reverse engineering.


Die Möglichkeit hast du überall. Wir haben in diesem Forum schon oft genug darüber dikutiert und sind uns wohl darüber einig,dass dieses keine Schwäche von Java ist und dass es keinen perfekten Kopierschutz gibt oder geben wird und sich deswegen auch der Aufwand nicht lohnt, einen perfekten einbauen zu wollen.


----------



## Sonecc (26. Okt 2009)

Ich finde aber, dass es doch ein recht interessantes Thema ist, die Gedanken die man damit verbringt sind jedenfalls nicht verschwendet...


----------



## JanHH (26. Okt 2009)

Naja naja, ein java-class-File wieder in den Ursprungsquellcode  zu verwandeln ist nun doch erheblich einfacher als wenn man ein nativ compiliertes exe, von dem man evtl. nicht mal weiss aus welcher Programmiersprache mit welchem Compiler es erstellt wurde, vorliegen hat.


----------



## Spacerat (26. Okt 2009)

JanHH hat gesagt.:


> Naja naja, ein java-class-File wieder in den Ursprungsquellcode  zu verwandeln ist nun doch erheblich einfacher als wenn man ein nativ compiliertes exe, von dem man evtl. nicht mal weiss aus welcher Programmiersprache mit welchem Compiler es erstellt wurde, vorliegen hat.


Das Thema ist durch... und Dank IDAPro ist die Sprache egal. Dieses erstellt dir mit 'nem PI aus jedem Maschinencode C ähnlichen Pseudo-Quelltext. Mus man das erst in die FAQ aufnehmen, damit jeder erkennt.[c]Nicht RE-Geschützter Code ist nicht nur eine Schwäche von Java![/c]


----------



## darkeye2 (26. Okt 2009)

um auf das ursprüngliche thema zurück zu kommen:
Wie wäre es, wenn du es so machst, dass du mithilfe einer db üerwachst, ob der client mit den key online ist, sprich: wenn man online geht, wird erst geprüft, ob der key nun stimmt oder net, der irgendwo steht, vllt irgendwie verschlüsselt in ner xml  datei, oder sonst wie.... wenn ja, geht das prog auf, und in der db wird dieser key auf "online" gestellt, sollte jemand versuche mit dem gleichen key reinzukommen, sprich key ist online, und client versucht mit dem gleichen key auch online zu kommen, wird einfach der key gelöscht, so dass beide danach den net mehr nutzen könne, also der verbreiter, und der, der den key unrechtmäßig erworben hat.

Ich glaube, dass ist eine gute möglichkeit, sowas zu verhindern. Mit einen ip-check lässt sich auch ausschließen, dass es der gleiche rechner ist  ....

MfG
darkeye


----------



## madboy (26. Okt 2009)

Ich würde von solch "strengen" Maßnahmen abraten. Es gibt Leute (mich eingeschlossen), die nicht wollen dass ein Programm "nach Hause telefoniert" ohne dass ich es explizit erlaube. Außerdem sollte darauf geschaut werden, dass der rechtmäßige Benutzer nicht zu sehr gegängelt wird. Bei einem Reconnect des Router und damit neuer IP bei laufendem Programm würde nach dem Vorschlag von darkeye2 der Key gesperrt ;-)

Jeder Entwickler, der mit Kopierschutzgedanken spielt, sollte sich meiner Meinung nach das Desaster mit kopiergeschützten CDs in Erinnerung rufen, die vor einiger Zeit im Umlauf waren.
Der rechtmäßige Benutzer wird genervt und bekommt im schlimmsten Fall ein Rootkit unter geschoben. Derjenige, der sich illegal mp3s lädt, hat keinen Streß. Das natürlich nur als Extremfall 

Gibt wohl (noch?) keine Patentlösung...


----------



## GAST__ (27. Okt 2009)

Also das mit dem nach hause telefonieren, finde ich persöhnlich auch nicht gut. 
Aber mir fällt da momentan nix besseres ein. Das mit ten Token die sich wechseln bei jedem start, finde ich gut.


----------



## Gast2 (27. Okt 2009)

token funktioniert auch nicht ... was ist bei einer Neuinstallation?


----------



## darkeye2 (27. Okt 2009)

Es war nach meiner idee eigentlich so gedacht, dass sobald eine meldung ausbleibt, wieder auf offline gewechselt wird, also in der db steht zeit des letzten meldevorgangs, und wenn der länger als die angegebene zeit ist, wird erst wieder auf offline gestellt, und dann neu angemeldet....

Aber ich glaub, mittlerweile sind wir uns einig, dass man das nie richtig in grif kriegt ...


----------

