Serials

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Da das hier mein erstes tutorial überhaupt ist, hoffe ich, dass ich jetzt alles richtig mache, und dass das thema wichtig genug ist, um nicht gelöscht zu werden. wenn ihr dis lesen könnt, und grade keine mods oder admins seid, wird das wohl der fall sein...

      ich habe mir jetzt mal vorgenommen, jetzt mal ein tutorial zu schreiben, bei dem man lernt, wie man in sein spiel eine seriennummer einbaut, so dass man diese erst eingeben muss, bevor man das spiel (voll) nutzen kann, wobei ich den schwerpunkt auf die seriennummer an sich setze.
      ich schreibe dieses tutorial nur deshalb, weil ich selber einige zeit versucht habe, ein funktionierendes system zu erstellen, bei dem man nicht einfach nur ein passwort eingeben muss, sondern wo schon eine berechnung stattfindet.
      hilfe bekam ich erst hier durch Windapple, aber da das programm für neulinge (wie mich :D ) ein wenig undurchsichtig ist, versuche ich jetzt die dort erstellten skripte und ihre verwendung zu erklären:

      als erstes mal das initialisierungsskript:
      dabei stellt man zuerst mal sicher, ob gamemaker im gesicherten modus läuft, denn in diesem fall kann man die routinen, die in der registry rumschreiben, nicht benutzen. wenn das aber nicht der fall ist, wird der schritt ausgeführt, der, falls das spiel zum ersten mal gestartet wird, den startcode festlegt. dieser besteht aus 9 ziffern, 7 buchstaben, und 3 strichen, also 16 zeichen, bei denen jeweils 4 durch einen strich getrennt sind, d.h. insgesamt 19 zeichen. hierbei sind nur die zahlen wichtig, die buchstaben sind nur zur verwirrung gedacht. für diese wird übrigens nochmal ein extraskript benutzt, dass so aussieht:

      GML-Quellcode

      1. buchstabe[0] = 'A';
      2. buchstabe[1] = 'B';
      3. buchstabe[2] = 'C';
      4. buchstabe[3] = 'D';
      5. buchstabe[4] = 'E';
      6. buchstabe[5] = 'F';
      7. buchstabe[6] = 'G';
      8. buchstabe[7] = 'H';
      9. buchstabe[8] = 'I';
      10. buchstabe[9] = 'J';
      11. buchstabe[10] = 'K';
      12. buchstabe[11] = 'L';
      13. buchstabe[12] = 'M';
      14. buchstabe[13] = 'N';
      15. buchstabe[14] = 'O';
      16. buchstabe[15] = 'P';
      17. buchstabe[16] = 'Q';
      18. buchstabe[17] = 'R';
      19. buchstabe[18] = 'S';
      20. buchstabe[19] = 'T';
      21. buchstabe[20] = 'U';
      22. buchstabe[21] = 'V';
      23. buchstabe[22] = 'W';
      24. buchstabe[23] = 'X';
      25. buchstabe[24] = 'Y';
      26. buchstabe[25] = 'Z';
      27. return buchstabe[floor(random(26))];
      Alles anzeigen

      der teil, der die einzelnen zeichen festlegt, sieht so aus:

      GML-Quellcode

      1. if (secure_mode)
      2. {
      3. return false;
      4. }
      5. else
      6. {
      7. if(registry_path_exists(game_id + '\s\')
      8. {

      dort, wo ich "game_id + '\s\'" geschrieben habe, kommt der pfad in der registry hin, wenn ihr sonst nix eingebt, ist der unter HKEY_CURRENT_USER\software\Gamemaker\ und dann das, was jetzt kommt, wobei ihr dort irgendwie eure spiel-id einbaun solltet, z.b. dieses game_id+'\s\, wobei dann im "ordner" (ja, die registry besteht nur aus ordnern mit den entsprechenden einträgen) gamemaker nach einem ordner mit der gameid eures spiels gesucht wird, in welchen sich ein eintrag namens "s" befinden muss. ist dieser nicht vorhanden, wird der rest des codes ausgeführt, ist er voranden, habt ihr schon einen startcode. der code geht wie folgt weiter:

      GML-Quellcode

      1. for (i=0; i<9; i+=1)
      2. {
      3. start_n[i]= string(ceil(random(9)));
      4. }
      5. for (i=0; i<7; i+=1)
      6. {
      7. start_b[i]= regkey_letter();
      8. }

      start_n und start_b sind arrays, die die einzelnen zeichen speichern, wobei n für nummer und b für buchstabe steht. regkey_letter ist der name des oben beschriebenen skripts, welches einen zufälligen buchstaben zurückliefert, und start_n gibt die reihenfolge der zahlen an,die der startcode enthält, und welche letztendlich auch das ist, worauf es ankommt. nebenbei bemerkt: alle befehle, die ich nicht weiter erkläre sollten in der helpfile nachgelesen werden, falls sie nicht verstanden werden.
      so, jetzt müssen die zeichen nur noch verbunden werden, wobei die endgültige reihenfolge von euch abhängt.
      schreibt dazu zuerst

      GML-Quellcode

      1. startcode=start_n[0] + start_n[1] + /*ich kürz das mal ab*/ + start_n[8];

      fügt dann an beliebigen stellen zwischen den + die variablem start_b[0 bis 6] ein, und ergänzt zu schluss nach jeweils 4 zeichen ein + '-', damit die nummer leserlicher wird.
      danach muss dieser code in die registry eingetragen werden, wozu der ordner, der vorhin gesucht und nicht gefunden wurde, erstellt wird. zusätzlich wird in dem ordner mit der gameid noch ein leerer eintrag namens "u" gemacht, welcher nachher den unlockcode enthalten wird.
      das ende dürfte dann so aussehen:

      GML-Quellcode

      1. startcode = start_n[0] + start_b[0] + start_n[1] + start_n[2] + '-' + start_b[1] + start_n[3] + start_b[2] + start_n[4] + '-' + start_b[3] + start_b[4] + start_n[5] + start_n[6] + '-' +start_b[5] + start_n[7] + start_b[6] + start_n[8];
      2. registry_write_string(game_id + '\s\',startcode);
      3. registry_write_string(game_id +'\u\','');
      4. }

      wahlweise kann man auch seinen pfad für die registry selbst bestimmen, aber das sollten nur die tun, die sich damit besser auskennen.
      damit haben wir schon 2 von 5 skripten fertig: den regkey_letter und das eben erstellte regkey_init.

      als nächstes folgt ein kurzes skript, welches ihr nur benötigt, wenn ihr an mehreren stellen im spiel den startcode anzeigen lassen wollt, welches aber nicht wirklich wichtig ist:

      GML-Quellcode

      1. return registry_read_string(game_id + '\s\');

      dieses skript trägt den namen regkey_getstart, und wenn ihr es benutzt, liefert es den startcode.

      das folgende skript, mit dem namen regkey_attempt kontrolliert, ob der eingegebene unlockcode die korrekte form besitzt:

      GML-Quellcode

      1. //argument0 wird der unlockcode sein, den man dann als parameter übermittelt.
      2. if (string_length(argument0) != 19)
      3. //wenn der unlockcode NICHT aus 19 zeichen besteht,
      4. {
      5. return false;
      6. }
      7. else if (string_length(string_digits(argument0)) != 9) //oder von diesen 19 zeichen NICHT genau 9 zahlen sind,
      8. {
      9. return false;
      10. }
      11. else if (string_length(string_letters(argument0)) != 7)//oder von diesen 19 zeichen NICHT genau 7 buchstaben sind
      12. {
      13. return false;
      14. }
      15. else
      16. {
      17. registry_write_string(game_id + '\u\', argument0);
      18. return true;
      19. }
      Alles anzeigen

      zusammenfassung: wenn man das skript aufruft, regkey_attempt(unlockcode); , dann prüft das skript, ob der übermittelte unlockcode die oben genannten bedingungen erfüllt: 9 zahlen, 7 buchstaben, 3 sonderzeichen (die striche), also insgesamt 19 zeichen. wenn eine dieser bedingungen nicht zutrifft, wird der wert "false" zurückgeliefert, sonst wird der unlockcode in die registry geschrieben, und der wert "true" zurückgeliefert.

      und jetzt kommen wir zu dem wichtigsten teil des tutorials, dem skript, das prüft ob unlockcode und startcode zusammenpassen, mit dem passenden namen regkey_check
      als erstes wird der startcode eingelesen, aber nur die zahlen, daher:

      GML-Quellcode

      1. for (i=0; i<9; i+=1)
      2. {
      3. start[i]=real(string_copy(string_digits(registry_read_string(game_id +'\s\')),i+1,1));
      4. }

      auf dieser weise werden die zahlen nach ihrer reihenfolge auf start[0 bis 8] gelegt. jetzt das wichtigste des ganzen systems: der schlüssel. das skript, das ich hier erkläre kann man für jedes programm wieder benutzen, aber was jetzt kommt, sollte man bei jedem spiel anders machen:

      GML-Quellcode

      1. key[0]= 1;
      2. key[1]= 1;
      3. key[2]= 1;
      4. key[3]= 1;
      5. key[4]= 1;
      6. key[5]= 1;
      7. key[6]= 1;
      8. key[7]= 1;
      9. key[8]= 1;

      die zahlen, die hier untereinander zu sehen sind, bilden den schlüssel, mit dem der startcode verarbeitet wird, um dann den unlockcode zu bilden.
      danach kommt ein system, welches folgendermassen den startcode mit dem key bearbeitet: für jedes zeichen (0 bis 8 ) des startcodes (start) wird das entsprechende zeichen des keys (key[i]) überprüft. die details könnt ihr im folgenden code nachlesen, soviel sollte jeder verstehen, der bis hierher mitgekommen ist.

      GML-Quellcode

      1. for (i=0; i<9; i+=1)
      2. {
      3. if (start[i] > key[i])
      4. {
      5. unlock[i] = start[i] - key[i];
      6. }
      7. else if (start[i] > round(key[i]/2))
      8. {
      9. unlock[i] = start[i] - round(key[i]/2);
      10. }
      11. else if (start[i]+key[i] <=9)
      12. {
      13. unlock[i] = start[i] + key[i];
      14. }
      15. else
      16. {
      17. unlock[i] = start[i] + round(key[i]/2);
      18. }
      19. uc[i] = string(unlock[i]);
      20. }
      Alles anzeigen

      unlock[i] ist das mit dem key bearbeitete zeichen, uc[i] ist das selbe, wie unlock[i], nur das die zahlen hier als string, und nicht als zahl vorliegen.

      dann muss das ganze nur noch zu einem einzigen string zusammengefasst werden:

      GML-Quellcode

      1. endcode = uc[0] + uc[1] + uc[2] + uc[3] + uc[4] + uc[5] + uc[6] + uc[7] + uc[8];

      und mit dem in der registry gespeichertem unlockcode verglichen werden:

      GML-Quellcode

      1. if (endcode == string_digits(registry_read_string(game_id + '\u\')))
      2. {
      3. return true;
      4. }
      5. else
      6. {
      7. return false;
      8. }

      dann wird "true" zurückgeliefert, falls alle richtig ist, sonst "false".


      die namen der skripte habe ich fett geschrieben, damit sie jetzt im bedarfsfall leichter wiedergefunden werden können, denn jetzt erkläre ich noch kurz, wie man sie benutzt:
      wie gesagt: der anfang jedes events, in denen die übrigen codes benutzt werden sollte immer so aussehen:

      GML-Quellcode

      1. if(regkey_init())
      2. {
      3. // hier der restliche code
      4. }

      damit die anderen funktionen auch nur dann benutzt werden, wenn gamemaker nicht im abgesicherten modus läuft.
      ansonsten sieht die sache so aus: das skript regkey_check prüft, ob die registrierung schon erfolgt wurde, wenn ja, wird bei der vollversion weiter gemacht, wenn nicht, wird entweder zur registrierung aufgefordert, oder die shareware gestartet.

      GML-Quellcode

      1. if (regkey_check())
      2. {
      3. // möglichkeit 1
      4. room_goto(/*name des raumes, der zur vollversion führt*/);
      5. //möglichkeit 2
      6. global.registriert=true;
      7. //und bei allen sachen, die eine registrierung erfordern folgt immer ein if(global.registriert)
      8. }
      9. else
      10. {
      11. // zu 1
      12. room_goto(/*name des raumes, der zur shareware führt*/);
      13. //zu 2
      14. global.registriert=false;
      15. //oder 3.
      16. startcode=regkey_getstart();
      17. show_message('Sie müssen sich erst registrieren, bevor sie *** spielen können. # ihr Startcode lautet: ' + startcode);
      18. if(show_question('Wollen sie den Freischaltecode jetzt eingeben?'))
      19. {
      20. unlock=get_string('Bitte Freischaltecode eingeben.','');
      21. if(regkey_attempt(unlock))
      22. {
      23. if (regkey_check)
      24. {
      25. show_message('Registrierung erfolgreich! Bitte das Spiel neu starten.');
      26. }
      27. else
      28. {
      29. show_message('Ungültiger Freischaltecode!');
      30. }
      31. }
      32. else
      33. {
      34. show_message('Ungültiger Freischaltecode!');
      35. }
      36. }
      37. }
      Alles anzeigen

      bei den ersten beiden beispielen bin ich von einer shareware ausgegangen, bei der man noch ein wenig experimentieren kann, beim 3. sollte am ende der abfrage ein game_end(); folgen, damit man erst spielen kann, wenn man den freischaltecode hat.
      aber auch bei shareware sollte man irgendwo einen code wie den aus beispel 3 benutzen, weil der eigentlich alles wichtige enthält: angabe des startcodes, abfrage des freischaltecodes, kontrolle und benachrichtigung auf erfolg.

      jetzt stellt sich natürlich die frage, woher ihr die unlockcodes bekommt, die ihr dann weitergebt. dafür gibt es 3 möglichkeiten:
      1.: ihr nehmt den startcode, schreibt die zahlen auf, die enthalten sind, schreibt den key daneben, führt die berechnungen des regkey_check skripts durch, und erhaltet somit das, was beim unlockcode wichtig ist, die zahlkombination. dort schreibt ihr jetzt wahllos 7 buchstaben zwischen, und trennt jeweils 4 zahlen durch einen strich. dies übermittelt ihr dann denen, die sich registriert haben.
      2.: ihr schreibt ein programm, bei welchem ihr den startcode eingebt, (get_string(startcode); ), führt damit dann das skript regkey_check durch, nur dass ihr diesmal, nachdem ihr uc[i] festgelegt habt, wieder 7 buchstaben durch get_letter holt, diese dann auf uc2[0 bis 6] legt, und schließlich alles auf unlockcode speichert, wobei buchstaben und zahlen wieder kombiniert werden sollten, wieder jeweils 4 durch einen strich getrennt. und anstatt dann die if-bedingung auszuführen, bei der "endcode" überprüft wird, gebt ihr die variable "endcode" sichtbar aus, und übermttelt diese.
      oder 3.: ihr besorgt euch hier das programm Reg-Key System, welches extra für den gamemaker gemacht wurde. dieses liefert dann die nötigen skripte, die ihr einfach nur einzubinden braucht, und es liefert auch gleich die unlockcodes zu den startcodes. wie windapple hier schon mal erklärte, funktioniert es auch noch bei gm6, aber nur ohne die dll.
      im grunde habe ich nur die dort ausgegebenen skripte erklärt (die variablen heißen anders, aber die namen blieben gleich), damit solche, die serials in ihre spiele einbauen wollen (aus welchen gründen auch immer) das system, verstehen, und anhand diesem ihr eigenes entwickeln können.

      z.b. ist es durch variation der skripte möglich, die länge des codes zu vergrößern, die buchstaben in die verarbeitung mit reinzunehmen, die berechnungen komplexer werden zu lassen, den startcode erst selbst mit anzugeben, oder auch einfach nur einen algorythmus reinzusetzen, welcher entscheidet, welche nummern zulässig sind, und welche nicht, so dass die startnummern entfallen, und jeder gültige schlüssel auf jeder ausgabe des spiels funktioniert (so wie die seriennummern von blizzard oder valve)
    • Wenn es dazu gedacht ist, dass das Spiel gekauft wird, bringt es fast nichts.
      Denn sobald ein Registrierter Nutzer auf die Idee kommt, seine Registry VOR und NACH der Installation komplett abzuspiechern, und die Veränderung herauszufiltern, ist alles umsonst.
    • Original von Agnahim
      Wenn es dazu gedacht ist, dass das Spiel gekauft wird, bringt es fast nichts.
      Denn sobald ein Registrierter Nutzer auf die Idee kommt, seine Registry VOR und NACH der Installation komplett abzuspiechern, und die Veränderung herauszufiltern, ist alles umsonst.


      Hast du ne bessere Idee, wo man sowas speichern könnte, ohne das es auffällt?
      Ich meine jetzt ausser ne Datei, das kann man ja auch ganz easy rauskriegen ob da ne Datei geöffnet wurde.
      "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
      - Joseph Weizenbaum
    • Original von Windapple
      Original von Agnahim
      Wenn es dazu gedacht ist, dass das Spiel gekauft wird, bringt es fast nichts.
      Denn sobald ein Registrierter Nutzer auf die Idee kommt, seine Registry VOR und NACH der Installation komplett abzuspiechern, und die Veränderung herauszufiltern, ist alles umsonst.


      Hast du ne bessere Idee, wo man sowas speichern könnte, ohne das es auffällt?
      Ich meine jetzt ausser ne Datei, das kann man ja auch ganz easy rauskriegen ob da ne Datei geöffnet wurde.

      Nö, aber ich bin für Freie Software... 8)
    • Benutzer online 1

      1 Besucher