Lizenzcode(relativ simpel gehalten)

    • VB.NET

    Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

      Lizenzcode(relativ simpel gehalten)

      Heyho Community.

      Ich stelle hier mal mein relativ simpel gehaltenes Lizenzsystem zur Verfügung.
      Es arbeitet mit einer PHP abfrage, die Codes sind mehrfach benutzbar bis man sie ändert oder entfernt.
      Es wird mit 16. stelligen Codes gearbeitet, was jederzeit erhöht oder verringert werden kann.
      Mir ist klar das es nicht das schwerste ist aber dennoch stelle ich es hier mal publik.
      Ich möchte vorweg sagen das ich mich noch nicht all zu lange mit der Materie beschäftige.

      Es wird benötigt :
      - PHP Fähiges Webspace
      - Grundkenntnis PHP , VB


      Die Anwendung könnte wie folgt aussehen(nur ein Beispiel) :



      Der VBCode(Überarbeitet)

      VB.NET-Quellcode

      1. Imports System.IO, System.Net, System.Collections.Specialized
      2. Public Class Form1
      3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      4. cPart1.MaxLength = 4 ' legt die maximale länge der Codefelder fest. - in diesem fall, 4.
      5. cPart2.MaxLength = 4
      6. cPart3.MaxLength = 4
      7. cPart4.MaxLength = 4
      8. End Sub
      9. Private Sub btnOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOk.Click
      10. Dim nvalue As New NameValueCollection
      11. Dim wclient As New WebClient
      12. lblStatus.ForeColor = Color.Orange
      13. lblStatus.Text = "Lizenz wird abgefragt..." ' sobald die Abfrage gestartet wird.
      14. nvalue.Clear()
      15. nvalue.Add("lic", cPart1.Text + cPart2.Text + cPart3.Text + cPart4.Text) ' in der Anwendung eingetragener Code
      16. Dim result() As Byte = wclient.UploadValues("http://SERVER.NET/lizenz/abfrage.php?", "POST", nvalue) ' von wo sollen die Codes abgefragt werden?
      17. Dim resultstring As String = System.Text.Encoding.ASCII.GetString(result) ' Die abfrage an sich
      18. If resultstring.Contains("licok") Then ' wenn das PHP Script ein echo mit dem text "lizenz_ok" ausgibt...
      19. lblStatus.ForeColor = Color.Green
      20. lblStatus.Text = "Lizenz gültig!"
      21. MessageBox.Show("Deine Lizenz ist gültig!", "Gültig!", MessageBoxButtons.OK, MessageBoxIcon.Information)
      22. Form2.Show() ' nächste Form laden
      23. Me.Hide() ' diese Form schließen
      24. ElseIf resultstring.Contains("licwrong") Then ' bei "lizenz_falsch"
      25. lblStatus.ForeColor = Color.Red
      26. lblStatus.Text = "Lizenz ungültig oder fehlende Internetverbindung!"
      27. MessageBox.Show("Deine Lizenz ist nicht gültig!", "Ungültig!", MessageBoxButtons.OK, MessageBoxIcon.Error) ' ausgabe bei einem Falschen schlüssel
      28. Else
      29. lblStatus.ForeColor = Color.Red
      30. lblStatus.Text = "Fehler bei Abfrage!"
      31. MessageBox.Show("Fehler beim abfragen der Lizenz!", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error)
      32. End If
      33. End Sub
      34. End Class


      Der PHPCode(Überarbeitet)

      PHP-Quellcode

      1. /*require 'lizenzen.inc.php'; /*Speicherort der Lizenzen(Wenn außerhalb des Abfragescripts)*/
      2. $lic = $_POST["lic"]; /*Lizenz aus der Anwendung abfragen*/
      3. $licList = array("ABCD1234EFGH1234", "ABCDEFGHIJKLMNOP", "1234567891234567", "FLOCKEISTCOOLHI!");
      4. if (in_array($lic, $licList))
      5. {
      6. echo "licok";
      7. }
      8. else
      9. {
      10. echo "licwrong";
      11. }
      12. ?>
      Dateien

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Flocke“ ()

      @Flocke
      Hallo Flocke ich würde dir raten Mysql zu implementieren denn wenn mein Programm mehr als 10000 Lizenzen hat dauert das auf deine weise ziemlich lange ;)
      also benutze mysql
      MFG 0x426c61636b4e6574776f726b426974
      InOffical VB-Paradise IRC-Server
      webchat.freenode.net/
      Channel : ##vbparadise
      Dir ist schon bewusst das es reicht den Request umzuleiten und dort auf jede Anfrage mit "lizenz_ok" zu antworten das ganze aushebelt?

      Markus Jacobs schrieb:

      Zudem braucht man noch eine Internetverbindung zum Aktivieren

      Ich würde sagen, das ist sinnvoll. Abgesehen davon, dass das hier mit ner simplen Umleitung manipulierbar ist, wäre das ne sinnvolle Methode, denn wenn du das ohne Internet machst, musst du den Code bzw. Key ja irgendwo mitliefern und damit ist das schon ausgehebelt, bevor es angefangen hat zu laden ;)
      Wenn du das online prüfst, dann ist das soweit sicherer. Machen ja große Firmen auch so, da wird halt dann schon am Clienten manipuliert und diese Daten dann geschickt, wenn jemand das aushebeln möchte, aber das ist ja illegal.
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      ich würde anhand des serialkeys im php script eine antwort generieren lassen anstelle von "lizenz_ok" oder was auch immer du benutzt... die selbe antwort generierst du im programm und überprüfst dann ob die antwort vom php script == die im programm generierten antwort ist. das ist schonmal ein kleiner schritt. es gibt zwar immernoch zahlreiche möglichkeiten das zu umgehen, aber es erschwert zumindest die ganze sache etwas

      Trade schrieb:

      musst du den Code bzw. Key ja irgendwo mitliefern

      Siehe diverse Signaturverfahren (DSA,...). Kurz: Nein, so kann man das nicht sagen.

      Allerdings machen jegliche Lizenzverfahren unter .NET aufgrund der einfachen Dekompilierbarkeit relativ wenig Sinn.
      „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

      -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

      Trade schrieb:

      musst du den Code bzw. Key ja irgendwo mitliefern
      Nö, musst du garnicht...
      Kannst dir auch ne x-beliebige Verschlüsselung holen die am Key etwas bestimmtes prüft z.B. ob eine Zahl im ersten block mal genommen eine zahl im 4 ten Block ergibt oder sowas in der art...
      Das wäre sicherer als so wie´s jetzt ist :pinch:
      Meine Kritik (lies: Mein Senf) dazu:

      Das "Lizenzsystem" ist relativ unbrauchbar. Es ist zwar eine grundliegende Idee, mehr aber auch nicht.
      Wie schon oft gesagt wurde, ist das super einfach umgehbar.
      Hab ich auch hier schon mal erklärt (Post #6 und #19).

      Hab ich auch mit diesem Programm nochmal gemacht. Das ist der dekompilierte Code:
      Spoiler anzeigen

      C-Quellcode

      1. private void btnOk_Click(object sender, EventArgs e)
      2. {
      3. this.lblStatus.ForeColor = Color.Orange;
      4. this.lblStatus.Text = "Lizenz wird abgefragt...";
      5. this.nvalue.Clear();
      6. this.nvalue.Add("lizenz", this.cPart1.Text + this.cPart2.Text + this.cPart3.Text + this.cPart4.Text);
      7. byte[] bytes = this.wclient.UploadValues("http://sendmessageservice.heliohost.org/stuff/license.php", "POST", this.nvalue);
      8. string @string = Encoding.ASCII.GetString(bytes);
      9. @string.Contains("lizenz_ok");
      10. // Hier der veränderte Teil: Die die Lizenz ist immer gültig.
      11. if (true)
      12. {
      13. this.lblStatus.ForeColor = Color.Green;
      14. this.lblStatus.Text = "Lizenz gültig!";
      15. Interaction.MsgBox("Login erfolgreich.", MsgBoxStyle.Information, "Lizenz gültig");
      16. MyProject.Forms.Form2.Show();
      17. this.Hide();
      18. }
      19. else
      20. {
      21. if (@string.Contains("lizenz_falsch"))
      22. {
      23. this.lblStatus.ForeColor = Color.Red;
      24. this.lblStatus.Text = "Lizenz ungültig oder fehlende Internetverbindung!";
      25. Interaction.MsgBox("Der Lizenzcode ist nicht gültig oder die Internetverbindung steht nicht!", MsgBoxStyle.Critical, "Lizenz ungültig");
      26. }
      27. else
      28. {
      29. if (@string.Contains(""))
      30. {
      31. this.lblStatus.ForeColor = Color.Red;
      32. this.lblStatus.Text = "Fehler bei Abfrage!";
      33. Interaction.MsgBox("Es ist ein Fehler bei der Abfrage aufgetreten", MsgBoxStyle.Critical, "Fehler");
      34. }
      35. }
      36. }
      37. }



      So viel zur Sicherheit.

      Aber jetzt ein paar Worte zum Tutorial selbst:
      Wenn man ein Tutorial veröffentlicht... oder auch hier im Sourcecode-Austausch postet, sollte man darauf achten, dass man ein gewisses Niveau einhält. Ich rede hier nicht davon, dass alles super perfekt sein muss, sondern es soll sinnvoll sein.
      Der VB-Code ist durchsetzt von WTFs:
      Warum ist nvalue global deklariert, obwohl es nur in der btnOK_Click-Methode verwendet wird?
      Selbiges mit dem WebClient.
      Methoden sollten immer sinnvolle Namen bekommen: btnOK_Click -> CheckLicense
      Selbiges gilt für Controls, Variablen, etc...: cPart1 -> tbLicensePart1
      MsgBox() -> MessageBox.Show() Wird hier immer wieder gepredigt
      Was soll resultstring.Contains("") bewirken? Ein leerer String ist in jedem String enthalten. Also würde das immer True liefern. Ein Else alleine würde sowieso reichen.

      Auch der PHP-Code lässt mich schaudern.
      Wirklich eine If-Abfrage für jede einzelne Lizenz?
      Wie wär's mit

      PHP-Quellcode

      1. $ValidLicenses = array("ASDFASDFASDFASDF", "JKLÖJKLÖJKLÖJKLÖ", .....);
      2. if (in_array($License, $ValidLicenses))
      3. {
      4. echo "OK";
      5. }
      6. else
      7. {
      8. echo "Nope";
      9. }

      Übrigens: hast Du das überhaupt mal ausprobiert?
      Dein Code funktioniert nämlich garnicht. Da kommt immer ein OK zurück. Grund:

      PHP-Quellcode

      1. if($lizenz = "ABCD1234EFGH1234")

      Beachte, dass da nur ein einzelnes = steht.
      Das bedeutet, "ABCD1234EFGH1234" wird der Variable $lizenz zugewiesen und gleichzeitig ist das Ganze ein Ausdruck, nämlich der zugewiesene Wert. Dann hat man da vom Prinzip her das drin stehen:

      PHP-Quellcode

      1. if ("ABCD1234EFGH1234")

      Und ein nicht-leerer String evaluiert bei PHP immer zu true... außer ich hab was übersehen: Klick

      Also bitte überarbeite das Ganze nochmal. Es muss ja kein bombensicheres Lizenzsystem werden, aber es sollte schon seine Optik haben... und auch funktionieren.
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils
      Also entweder überarbeiten und solange den Thread unlesbar machen/löschen oder direkt löschen, denn dass ist wirklich nichts was man gebrauchen könnte und gefährdet Anfänger die in Versuchung kommen so etwas einfach einzubauen...
      Ich habe meinen Beitrag mal editiert, und nach Kritik verbessert.
      Da mein Schwerpunkt bei dem PHP-Script lag habe ich auch das mal angepasst.
      Nun funktioniert es einwandfrei auch wenn es einfach zu umgehen ist, wie angemerkt ist es eben simpel gehalten.

      Bezüglich MYSQL, sobald ich Zeit dafür finde werde ich mich damit ein wenig beschäftigen.
      Das hat in .Net einfach keinen Sinn. Siehe Ilspy...

      Mit diesem schlauen Refactoring Tool, wird dein Code komplett zerlegt und kann auch noch in deine Lieblingssprache basierend auf .Net als Projekt direkt weg gespeichert werden.

      //Edit Again: Zudem müsstest du eine Ende zu Ende Verschlüsselung einbauen. Ansonsten wird jeder Klartext der gesendet oder empfangen wird, einfach geändert und dann hat es sich sowieso.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sio_x“ ()

      Hallo,

      Ansich ne tolle Idee, aber wenige können damit etwas Anfangen. HTTPS sollte zwar die übertragung sichern alerdings die Reverseengenering Freundlichkeit^^ von .NET ist ausgeprägt groß (weil CLR-Kode). Aus diesen grund kann man auch (in Visual Studio nicht in Express^^) mit den Tool Dofuscator Community Edition den Code soweit sichern dass kein Decompilieren mehr möglich ist. (Nur mal so als kleiner Tip).

      LG, Herbrich
      Ich werde eh wen ich Herbrich-20 Fertig mache dann den Dofuscator benutzen, ich teile euch das ergebniss eines Test Decompilierens mal bit.


      PS: Ich habe selber auch nen .NET Dcompilierer z.B. für die .NET Assamblys selber, was ganz praktisch ist :)
      Man kann _jede_ CLI-Assembly (z.B. VB.NET oder C#) wieder in von Menschen lesbaren Code umwandeln, auch wenn du da jetzt den Dotfuscator oder den Confuser drüber laufen lässt oder es sogar mit Thermida oder ähnlichen Programmen packst.

      nafets3646 schrieb:

      Man kann _jede_ CLI-Assembly (z.B. VB.NET oder C#) wieder in von Menschen lesbaren Code umwandeln, auch wenn du da jetzt den Dotfuscator oder den Confuser drüber laufen lässt oder es sogar mit Thermida oder ähnlichen Programmen packst.


      Und wie? :D Wenn man es mit nem normalem Decompiler nicht schafft? ;)
      Hmkay. :|
      Es gibt Tricks, welche ich nicht kenne, da ich mich noch nie mit der Materie auseinandergesetzt habe. Sie existieren aber.
      Schau doch mal in diesem Thread vorbei: CrackMe Sammelthread
      MfG Stefan