Kurze Werte speichern, die der User nicht per Hand ändern kann ohne My.Settings

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Michdi.

    Kurze Werte speichern, die der User nicht per Hand ändern kann ohne My.Settings

    Guten Abend,
    da ich gerade bemerkt habe ( Denkfehler von mir ), dass man die My.Settings einfach bearbeiten kann, da sie unter %appdata% liegen, habe ich mir vorgenommen,
    bei meinem Programm den Premium boolean eventuell rauszunehmen, da man sich einfach selber Premium geben kann...
    Gibt es eine einfache Methode, wie man soetwas speichern kann, ohne, dass es der User bearbeiten kann? Man soll es aber auch noch bearbeiten können (Im code, wie z.B. mit My.settings.premium = true)

    Danke,

    Michdi :)
    Lösung:

    Ich habe zur Sicherung 3 Varianten auf einmal benutzt:
    Normale My.Setting.Premium als Boolean
    Eine zweite My.Setting die ich unauffällig benannt habe
    Einen unauffällig bennanten Registry Eintrag

    VB.NET-Quellcode

    1. Dim pramium as string
    2. 'Registry Eintrag
    3. pramium = System.Windows.Forms.Application.UserAppDataRegistry.GetValue("michmusstduauchirgendwienennen")
    4. 'Premium Abfrage
    5. If My.Settings.premium = true And My.Settings.michmusstduandersnennen = "irgendeinmüll" + irgendein code, z.B. IP + "irgendeinmüll" And pramium = "irgendwie" Then
    6. 'Premium vergeben
    7. Try
    8. System.Windows.Forms.Application.UserAppDataRegistry.SetValue("michmusstduauchirgendwienennen", "irgendwie")
    9. my.settings.premium = true
    10. my.settings.michmusstduandersnennen = "irgendeinmüll"
    11. Catch ex As Exception
    12. MsgBox(ex.Message)
    13. End Try

    Die beste maschinelle Übersetzung der Welt - DeepL Übersetzer
    Alle Zitate, die ich seit dem 1.9.2017 übersetzt habe, wurden vollautomatisch mit DeepL übersetzt.



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

    Bringt imho garnix. Selbst wenn du das verschlüsselst speicherst, packe ich einfach nen Decompiler aus und umgehe die Mechanik innerhalb von 5 Minuten oder eben direkt im RAM. So Lizenzsysteme funktionieren nicht wirklich gut, also lass es lieber gleich sein.

    LG
    @Michdi Mach das ggf. zur Laufzeit mit Passwort.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn es eine vernünftige Absicherung sein sollte, die nur schwer umgehbar ist, würde ich folgendes machen (habe ich schon im Einsatz):

    Generiere zum Beispiel anhand der Systemkomponenten einen Key, die den du ja beliebig verschlüsseln kannst.
    Zusätzlich generierst Du einen zweiten Schlüssel mit ein paar Algorithmen.

    Diese Keys schickst Du jetzt zu deinem Server (Webspace reicht natürlich) und baust Dir ein simples PHP Script, welches den Unique-Key des Users und den zweiten Schlüssel checkt. Das Zweite ist zwar "nur" ein wenig Spielerei, hilft dennoch ein wenig weiter. Du machst im PHP Script, genau das gleiche was du auch in VB machst.

    Nun schreibts du beide Werte in eine Datenbank und prüfst bei jedem Start, ob der/die Schlüssel gleich sind. Wenn es nicht ganz so sicher sein muss, kannst du natürlich auch eine "Offline"-Prüfung vornehmen.

    Um den/die Nutzer zu entscheiden, reicht ein winziges PHP-Script mit Login für Usernamen und Passwort (am besten mit SALT) vollkommen aus.

    Vor deine eigentliche Form, machst Du dann einfach noch ein Login-Fenster.

    Die Erklärung war ziemlich knapp, ich denke aber dass Du damit problemlos arbeiten könntest.

    Einziges Manko: Sollte der User seine Hardware oft ändern, musst du den User manuell wieder freischalten. Wir haben es einfach so eingestellt, dass der User die Schlüssel 5 mal selbst erstellen kann.

    Grüße
    Schmandal

    Edit: Das ganze macht natürlich nur Sinn, wenn Du gewisse Funktionen auch online zur Verfügung stellst. Alles andere ist natürlich recht schnell "geknackt".
    Ich habe mir jetzt vorgenommen, den My.Setting nicht mehr premium zu nennen sondern irgendwie komisch und keinen Boolean zu benutzten sondern 2. weitere komische Werte, die sich aus verschiedenen Systemeigenschaften zusammensetzten, wie Schmandal bereits gesagt hat :)

    Danke!
    Die beste maschinelle Übersetzung der Welt - DeepL Übersetzer
    Alle Zitate, die ich seit dem 1.9.2017 übersetzt habe, wurden vollautomatisch mit DeepL übersetzt.



    Willst du es noch unauffindbarer machen, dann schreibs in die Registry. Die wenigsten "normaluser" trauen sich dort was zu ändern, da Windows selbst bei Änderungen dem User meldet, dass sein System dadurch instabil werden könnte. Das schreckt ab. Als nächstes benutzt du eben nicht Premium = true oder Premium = 1 sondern Premium = [kauderwelsch] oder [Kauderwelsch] = [Kauderwelsch] so kennt nur dein Programm und Besitzer einer Premium-Version den richtigen Schlüssel. Möchte also jemand mit ner normalen Version sich Premium ermogeln, müsste er schon dein Programm auslesen, und das schließt schonmal 70-80% der Weltbevölkerung, trotz Tools wie ILSpy, effektiv aus.

    Um nun noch die restlichen 20-30% aka Programmierer/Hobby-Software-Hacker auszuschließen, musst du nun schon wesentlich mehr Arbeit reinstecken.
    Perfekt, ich habe es jetzt mit dem generierten Schlüssel gemacht, mit der Registry und der My.Setting!

    Meine Lösung für alle anderen:

    Dim pramium as string
    pramium = System.Windows.Forms.Application.UserAppDataRegistry.GetValue("michmusstduauchirgendwienennen")

    If My.Settings.premium = true And My.Settings.michmusstduandersnennen = "irgendeinmüll" + irgendein code, z.B. IP + "irgendeinmüll" And pramium = "irgendwie" Then

    Und um Leute Premium zu machen:


    Try
    System.Windows.Forms.Application.UserAppDataRegistry.SetValue("michmusstduauchirgendwienennen", "irgendwie")
    Catch ex As Exception
    MsgBox(ex.Message)
    End Try

    Ich habe es extra nicht in Codeblöcken gemacht, damit ich farbig schreiben kann.

    Falls jemand noch Hilfe braucht, hier fragen :)
    Die beste maschinelle Übersetzung der Welt - DeepL Übersetzer
    Alle Zitate, die ich seit dem 1.9.2017 übersetzt habe, wurden vollautomatisch mit DeepL übersetzt.



    Sorry, aber das hier ist in meinen Augen lesbarer, als deine Einfärbung:

    VB.NET-Quellcode

    1. Dim pramium as string
    2. pramium = System.Windows.Forms.Application.UserAppDataRegistry.GetValue("michmusstduauchirgendwienennen")
    3. If My.Settings.premium = true And My.Settings.michmusstduandersnennen = "irgendeinmüll" + irgendein code, z.B. IP + "irgendeinmüll" And pramium = "irgendwie" Then
    4. 'dum di dum
    5. Try
    6. System.Windows.Forms.Application.UserAppDataRegistry.SetValue("michmusstduauchirgendwienennen", "irgendwie")
    7. Catch ex As Exception
    8. MsgBox(ex.Message)
    9. End Try

    Dazu kommt, dass man AndAlso verwenden sollte. Zudem werden strings in VB.NET mit & und nicht mit + zusammengeknüpft. Oder sollten das nur logische/gedankliche verknüpfungen sein? :S
    Hmm. Die Lösung an sich finde ich in Ordnung. Vielleicht noch ein paar Zeilen Code mit dem Tipp, das ganze zu encoden und ggf. zusätzlicher in einer Datei zu speichern.

    CPU (nur erste) / SERIAL / MAC (schnell vom User änderbar) etc...

    VB.NET-Quellcode

    1. 'CPU Funktion Beispiel!
    2. Dim objCPUItem As Object, objCPU As Object
    3. On Error Resume Next ' <--- nur fürs Beispiel!
    4. objCPUItem = GetObject("winmgmts:").InstancesOf("Win32_Processor")
    5. If Err.Number = 0 Then
    6. Trim$(Str$(objCPUItem.Count))
    7. For Each objCPU In objCPUItem
    8. ohar = objCPU.ProcessorId
    9. Next
    10. objCPUItem = Nothing
    11. End If
    12. 'Mac Addy Beispiel
    13. Dim mc As System.Management.ManagementClass
    14. Dim mo As ManagementObject
    15. Dim mac As String = String.Empty
    16. mc = New ManagementClass("Win32_NetworkAdapterConfiguration")
    17. Dim moc As ManagementObjectCollection = mc.GetInstances()
    18. For Each mo In moc
    19. If CBool(mo.Item("IPEnabled")) = True Then
    20. mac = mo.Item("MacAddress").ToString()
    21. End If
    22. Next
    23. Return mac
    24. 'CPU Infos
    25. Dim cpuInfo As String = ""
    26. Dim managClass As New ManagementClass("win32_processor")
    27. Dim managCollec As ManagementObjectCollection = managClass.GetInstances()
    28. For Each managObj As ManagementObject In managCollec
    29. If cpuInfo = "" Then
    30. cpuInfo = managObj.Properties("processorID").Value.ToString()
    31. Exit For
    32. End If
    33. Next
    34. Return cpuInfo
    35. 'Volume (Serial)
    36. drive += ":"
    37. Dim disk As New ManagementObject("win32_logicaldisk.deviceid=""" + drive + """")
    38. disk.Get()
    39. Dim volumeSerial As String = disk("VolumeSerialNumber").ToString()
    40. disk.Dispose()
    41. Return volumeSerial
    42. 'Beispiel Unique:
    43. If drive = String.Empty Then
    44. For Each compdrive As DriveInfo In DriveInfo.GetDrives
    45. If compdrive.IsReady Then
    46. drive = compdrive.RootDirectory.ToString()
    47. Exit For
    48. End If
    49. If (drive.EndsWith(":\\")) Then
    50. drive = drive.Substring(0, drive.Length - 2)
    51. End If
    52. Next
    53. End If
    54. Dim volumeSerial As String = getVolumeSerial(drive)
    55. Dim cpuID As String = getCPUID()
    56. Return cpuID + volumeSerial
    57. 'und hier noch zur Verarbeitung
    58. Dim sAppPath As String
    59. sAppPath = Application.StartupPath
    60. If Not sAppPath.EndsWith("\") Then sAppPath = sAppPath & "\"
    61. Dim saveToFolder As String = sAppPath
    62. Dim mydrives As String = Get_MACAddress()
    63. Dim mohanni As String = mydrives & getUniqueID("c")
    64. Dim md5 As New MD5CryptoServiceProvider
    65. md5.Clear()
    66. Dim meinergebnis As String = FromBase64("REGISTRYSTUFF?")
    67. Dim parts As New List(Of String)
    68. For i As Integer = 0 To meinergebnis.Length - 1 Step 32
    69. parts.Add(meinergebnis.Substring(i, IIf(i + 32 < meinergebnis.Length, 32, meinergebnis.Length - i)))
    70. Next
    71. Dim thecommonone As String = parts(1) & mohanni & parts(1)
    72. Dim myeggebnis As String = MD5StringHash(thecommonone)


    Die obigen Codes sind "zusammenhangslos" und mit ein paar Kommentaren dazu versehen. So könntest Du ein paar Daten des Computers sammeln. Denke nur bitte daran, dass viele Daten wie zum Beispiel die MAC Adresse ganz ganz einfach durch den Nutzer in ein paar Sekunden geändert werden können. Den Schluss der Sammlung wie du ein/auslesen, verschlüsseln und vergleichen könntest.

    Du solltest natürlich den Variablen etc geeignete Namen geben und eine Funktion einbauen, dass Du den Registry Schlüssel, bei Bedarf ändern oder löschen kannst. Und natürlich auch dort sehr vorsichtig sein. Vieles kann man vereinfachen und besser machen!

    Eine kleine nicht geschlossene Schleife, verschafft sicher bis zu 1000 Registry Einträge/ Sekunde :)

    Michdi schrieb:

    ???
    Hast Du Option Strict On?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bei mir ist die Option Strict off

    Auf was muss ich verweisen bei ManagementClass???
    Update: Verweis hinzufügen System.Management
    Und dann Rechtsklick und Imports System.Management
    Die beste maschinelle Übersetzung der Welt - DeepL Übersetzer
    Alle Zitate, die ich seit dem 1.9.2017 übersetzt habe, wurden vollautomatisch mit DeepL übersetzt.



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

    Michdi schrieb:

    es klappt trotzdem
    Try this:

    VB.NET-Quellcode

    1. Option Strict Off
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim txt1 = "1" + 1
    5. Dim txt2 = "1" & 1
    6. MessageBox.Show(txt1 & Environment.NewLine & txt2)
    7. End Sub
    8. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Michdi schrieb:

    klappt trotzdem


    ... das ist richtig. Unterschied ist dieser:

    Das & verkettet einfach 2 Strings und wenn Du mit & verkettest, hast Du als Ergebnis auch immer einen String.

    EDIT:

    VB.NET-Quellcode

    1. 2 + "2" = 4 ' BEI STRICT ON FEHLER!!
    2. 2 & "2" = "22"
    3. 2 & 2 = "22"
    4. "text" + 2 ' CAST EXCEPTION weil text nicht in double konvertiert werden kann....

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