Dongle für Programm

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

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Yanbel.

    Dongle für Programm

    Hallo,

    ich bin mir nicht sicher inwiefern das umzusetzen ist und wie anspruchsvoll dies ist. Aber dennoch möchte ich einen oder mehre Dongle für ein Programm haben, wodurch man ausschließlich mit eingestecktem USB-Stick in der Lage ist, das Programm zu starten. Viel dazu gefunden habe ich bisher leider nicht. Hat jemand Tipps oder Erfahrungen zu diesem Vorhaben?
    @uNbRaKe Sieh Dir mal das hier an, da kannst Du im Prinzip einen USB-Stick als Dongle verwenden:
    Daten vom Multimeter VC850 über USB-Schnittstellenadapter auslesen
    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!
    Ich kenne das Prinzip mittels einem FTDI-Chip von einigen Firmen.
    Dieser Chip aggiert als USB-Seriell-Wandler und kann auch selber programmiert bzw. konfiguriert werden.
    Man kann sogar konfigurieren, mit welchen PID/VID (für eigene Treiber) er sich melden soll und ob ein COM-Port sichtbar sein soll oder eben nicht.
    Im Auslieferzustand wird Windows automatisch den COM-Treiber laden.

    Der FTDI hat eine Seriennummer, welche abgerufen werden kann.
    Für diese SN wird dann eine Lizenz erstellt, welche nur mit der SN vom Dongle (FTDI-Chip) gültig ist.

    Vorteile:
    - dokumentierte Funktionalität der .Net-Dll
    - gängige/ zuverlässige Hardware

    Nachteile:
    - teuer

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

    uNbRaKe schrieb:

    wodurch man ausschließlich mit eingestecktem USB-Stick in der Lage ist, das Programm zu starten
    Das ist nur eine Pseudo-Sicherheit.
    Vor allem in .Net-Programmen ist das sehr leicht knackbar.
    Eine If-Abfrage, ob der Stick eingesteckt ist lässt sich relativ einfach umschiffen.

    Echte Dongles arbeiten auf eine Weise, dass regelmäßig vom Dongle etwas berechnet wird, also der Dongle im laufenden Betrieb permanent benötigt wird.

    Wenn du den Schutz allerdings auf "normale Benutzer" begrenzen möchtest, kannst du einfach die Seriennummer aller USB-Sticks auslesen und, wenn die gewünschte dabei ist, den Zugriff erlauben..
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod Inwiefern kann man die If-Abfrage umschiffen?

    Wie ist das umzusetzen, dass der Dongle etwas regelmäßig berechnet?

    Also ich habe jetzt wie im Beispiel eine Listbox, in der alle Seriennummern der Laufwerke ausgelesen werden. Wie ist das ohne Listbox umzusetzen?

    Und wie ist die Zugriffserlaubnis umzusetzen? In Form.Load der Startform?

    uNbRaKe schrieb:

    Wie ist das umzusetzen, dass der Dongle etwas regelmäßig berechnet?
    Ein Dongle berechnet nicht.
    Du musst regelmäßig abfragen, ob der Dongle noch da ist, z.B. bei jedem Eintritt in eine wichtige Prozedur.
    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!
    @uNbRaKe Wie ist Deine bisherige Abfrage?
    Ohne Anhaltspunkt Hardware-Zugriffe zu programmieren ist suboptimal.
    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!
    @RodFromGermany ich habe leider wirklich kein Anhaltspunkt, was Hardware-Programmierung angeht.

    VB.NET-Quellcode

    1. Dim driveNames As New List(Of String)
    2. For Each drive As DriveInfo In My.Computer.FileSystem.Drives
    3. Try
    4. Dim fso As Scripting.FileSystemObject
    5. Dim oDrive As Drive
    6. fso = CType(CreateObject("Scripting.FileSystemObject"), FileSystemObject)
    7. oDrive = fso.GetDrive(drive.Name)
    8. ListBox1.Items.Add(oDrive.SerialNumber)
    9. Catch ex As Exception
    10. End Try
    11. Next


    Ich habe dies aus einem Beispiel übernmmen. Ich lasse alle Hardwre-ID's der Laufwerke in eine Listbox laden.
    @uNbRaKe Wenn das funktioniert, ist doch schon mal alles fein.
    Du musst ermitteln, welche Nummer Dein Dongle hat, die legst Du verschlüsselt in einer Settings-Datei ab.
    Dann rufst Du die besagte Boolean Funktion auf und übergibst ihr diesen verschlüsselten Wert.
    In der For-Schleife verschlüsselst Du jeden ausgelesenen Wert und vergleichst diesen mit dem übergebenen.
    Ist der übergebene Wert vorhanden, returnst Du True, wenn nicht, dann False.
    Bei False ne MessageBox und Exit.
    Feddich.
    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!

    uNbRaKe schrieb:

    Inwiefern kann man die If-Abfrage umschiffen?
    Decompilieren, verändern. kompilieren.
    Oder den IL-Code analysieren und patchen.

    uNbRaKe schrieb:

    Wie ist das umzusetzen, dass der Dongle etwas regelmäßig berechnet?
    Geht nur mit "echten" Dongles wie z.B. iLok oder eLicenser.
    Du kannst dir das so vorstellen, dass so etwas wie eine verschlüsselte DLL auf dem Dongle liegt, deren Funktionen du über API aufrufen kannst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Die einfachste Variante die ich kenne ist folgende: Du liest die Seriennummer des USB-Sticks aus und berechnest anhand der Nummer einen PrivateKey, legst diesen aber nirgendwo ab, sondern löscht ihn nachdem du damit die Datei verschlüsselt hast, die die Zugangsdaten zu deinem SQL-Server enthält. Wenn jemand jetzt dein Programm startet, fragst du die Seriennummern aller angeschlossenen USB-Sticks ab. Wenn der richtige dabei ist, kann die Datei entschlüsselt werden und der Zugriff auf die Datenbank kann hergestellt werden. Wenn nicht, kann der User an deinem Programmcode verändern was er will, er kommt trotzdem nicht an deine Datenbestände. Und du hast kein Problem damit den PrivateKey irgendwo sicher abzulegen. Der befindet sich ja immer in deiner Hosentasche. Ich mache es mit meinem Programm ähnlich. Nur nicht mit nem USB-Stick sondern mit einem AAD-Account und einem KeyVault bei Azure.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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