Seite 1 von 2

USB Stick Herstellerseriennummer auslesen

Verfasst: 31.10.2016 15:00
von Micha122
Hallo PB-Gemeinde!

Möchte einen USB Stick als Key benutzen.
Damit sollen definitiv nicht die Goldreserven der USA geschützt werden, ist eigentlich mehr ne Spielerei.

Bei rs-basic habe ich folgendes gefunden:

Code: Alles auswählen

EnableExplicit

Procedure.s GetHDSerial(Drive.s)
  Protected Serial.l
  Protected Fixed.s = Left(Drive.s, 1) + ":\"
  
  GetVolumeInformation_(@Fixed, #Null, #Null, @Serial, 0,#Null , #Null, #Null)
  ProcedureReturn Hex(Serial.l)
EndProcedure

MessageRequester("","Seriennummer der Festplatte: "+GetHDSerial("f"),0)
Der Nachteil bei "GetVolumeInformation" ist definitive, das diese Funktion die von Windows erzeugte Seriennummer liefert die sich mit jedem Formatieren ändert. :oops:
Auch lässt sich der Stick mit jedem Kopierprogramm im RAW-Modus vervielfältigen. :oops:

Gibt es eine Möglichkeit die nicht veränderbare Herstellerseriennummer auszulesen? :?:

Grüße

Re: USB Stick Herstellerseriennummer auslesen

Verfasst: 31.10.2016 15:20
von RSBasic
Du kannst den Geräte-Manager starten, die Eigenschaften deines USB-Sticks aufrufen und auf Details klicken.
Dort hast du alle Informationen, die das USB-Gerät liefert. Vergleiche die Informationen, ob eine davon nach einer Formatierung gleich bleibt.
Wenn du was herausgefunden hast, dann kann man versuchen, diese Information aus der Registry oder mit Hilfe einer WinAPI-Funktion auszulesen.

Re: USB Stick Herstellerseriennummer auslesen

Verfasst: 31.10.2016 16:14
von Micha122
Hi RSBasic,
Geräteinstanzpfad sieht mir vielversprechend aus. :idea:

Probiere das aber später zu hause erstmal auf mehreren Rechnern aus.

Re: USB Stick Herstellerseriennummer auslesen

Verfasst: 31.10.2016 16:16
von DarkDragon
Vielleicht gehts mit der Windows Setup API ähnlich wie hier:

http://www.purebasic.fr/german/viewtopi ... =3&t=21873

Im Prinzip kann man wohl mit der Setup API einen neuen Gerätemanager schreiben.

Re: USB Stick Herstellerseriennummer auslesen

Verfasst: 01.11.2016 11:05
von Micha122
Guten morgen.

@RSBasic
Die Information die "Geräteinstanzpfad" liefert scheint definitiv brauchbar zu sein. :)

Beispiel: USBSTOR\DISK&VEN_VERBATIM&PROD_STORE_N_GO&REV_1.0\1206000000002191&0

1. Diese Kennung bleibt auch nach dem Formatieren erhalten/gleich
2. Bleibt auch auf unterschiedlichen Rechnern gleich.
3. Jedes USB-Gerät hat eine andere Kennung

Aktuelles Manko ist allerdings, das ich keine zwei USB-Geräte gleichen Typs und Hersteller habe um die unverwechselbarkeit hundertprozentig zu bestätigen.

@DarkDragon
Setup API scheint wirklich etwas damit zu tun zu haben. Jedenfalls ergab die Suche nach "Geräteinstanzpfad" immer wieder Treffer zu Setup API.
https://msdn.microsoft.com/en-us/window ... l/setupapi

Sieht aber nicht gerade einfach aus. :oops: Da bräuchte ich schon :praise: Hilfe.

Grüße

Re: USB Stick Herstellerseriennummer auslesen

Verfasst: 01.11.2016 11:25
von RSBasic
Hallo Micha122,

um den Geräteinstanzpfad ermitteln zu können, kannst du den bereits vorhandenen WinAPI-Beispielcode benutzen: http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb
In der Liste taucht der Geräteinstanzpfad meines USB-Sticks auf.
Leider funktioniert der Code nur mit der 32 Bit-Version von PB und ohne Unicode.
Der Code müsste angepasst werden, damit auch unter 64 Bit und mit Unicode funktioniert.

Re: USB Stick Herstellerseriennummer auslesen

Verfasst: 01.11.2016 15:12
von Micha122
Danke RSBasic! :allright:

Dein Code ein wenig geändert:

Code: Alles auswählen

;Autor: bingo

EnableExplicit

Structure SP_DEVINFO_DATA
  cbSize.l
  ClassGuid.GUID
  DevInst.l
  Reserved.l
EndStructure

Define DeviceInfoData.SP_DEVINFO_DATA
Define EventID
Define hDeviceInfoSet
Define *F1
Define i
Define pnplen = 255
Define bufferlen = 1024
Define pnp.s = Space(bufferlen)
Define NewList Daten.s()
Define Key = #False

#DIGCF_PRESENT = 2
#DIGCF_ALLCLASSES = 4


  
  hDeviceInfoSet = SetupDiGetClassDevs_(0,0,0,#DIGCF_PRESENT|#DIGCF_ALLCLASSES)
  DeviceInfoData\cbSize=SizeOf(DeviceInfoData)
  
  If OpenLibrary(1,"cfgmgr32.dll")
    *F1 = GetFunction(1, "CM_Get_Device_IDA")
    Repeat
      If SetupDiEnumDeviceInfo_(hDeviceInfoSet,i,@DeviceInfoData) = 0
        Break
      EndIf
      
      i+1
      
      CallFunctionFast(*F1,DeviceInfoData\DevInst,@pnp,pnplen,0)
      AddElement(Daten())
      Daten() = pnp

    ForEver
    ForEach Daten()
      If Daten() = "USBSTOR\DISK&VEN_VERBATIM&PROD_STORE_N_GO&REV_1.0\1206000000002191&0" ;Geräteinstanzpfad MEINES USB-Sticks
        MessageRequester("Key Test","Sie benutzen einen gültigen Key")
        Key = #True
      EndIf
    Next
    If Key = #False
      MessageRequester("Key Test","Es wurde kein gültiger Key gefunden.")
    EndIf
    
    CloseLibrary(1)
  EndIf
 
  SetupDiDestroyDeviceInfoList_(hDeviceInfoSet)
Wer in ausprobieren möchte, muss lediglich den Geräteinstanzpfad eines eigenen USB-Geräts eintragen.
Leider funktioniert der Code nur mit der 32 Bit-Version von PB und ohne Unicode.
32 Bit stört mich momentan recht wenig. Bin eh gezwungen momentan mit nem alten Netbook zu arbeiten (Rechner defekt). :cry:

Grüße

Re: USB Stick Herstellerseriennummer auslesen

Verfasst: 01.11.2016 16:32
von _JON_
Hab es mal upgedated, sollte jetzt x86/x64 und Unicode/Ascii kompatibel sein :D

Code: Alles auswählen

;Autor: bingo

EnableExplicit

Structure SP_DEVINFO_DATA Align #PB_Structure_AlignC
  cbSize.l
  ClassGuid.GUID
  DevInst.l
  Reserved.i
EndStructure


Prototype pCM_Get_Device_ID(dnDevInst, Buffer, BufferLen, ulFlags)
Define DeviceInfoData.SP_DEVINFO_DATA
Define EventID, hDeviceInfoSet, hcfgmgr
Define CM_Get_Device_ID.pCM_Get_Device_ID
Define i, pnplen = 255, bufferlen = 1024
Define pnp.s = Space(bufferlen)


#DIGCF_PRESENT = 2
#DIGCF_ALLCLASSES = 4



If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListViewGadget(1, 10, 10, WindowWidth(0) - 20, WindowHeight(0) -20, 0)
  
  hDeviceInfoSet = SetupDiGetClassDevs_(0, 0, 0, #DIGCF_PRESENT | #DIGCF_ALLCLASSES)
  DeviceInfoData\cbSize = SizeOf(SP_DEVINFO_DATA)
  
  hcfgmgr = OpenLibrary(#PB_Any,"cfgmgr32.dll")
  If hcfgmgr
    CompilerIf #PB_Compiler_Unicode
      CM_Get_Device_ID = GetFunction(hcfgmgr, "CM_Get_Device_IDW")
    CompilerElse
      CM_Get_Device_ID = GetFunction(hcfgmgr, "CM_Get_Device_IDA")
    CompilerEndIf
    
    Repeat      
      If SetupDiEnumDeviceInfo_(hDeviceInfoSet, i, @DeviceInfoData) = 0
        Break
      EndIf
      
      i + 1
      
      CM_Get_Device_ID(DeviceInfoData\DevInst, @pnp, pnplen, 0)
      AddGadgetItem(1, -1, pnp, 0, 0)
    ForEver
    
    CloseLibrary(hcfgmgr)
  EndIf
  
  SetupDiDestroyDeviceInfoList_(hDeviceInfoSet)
  
  Repeat
    EventID=  WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf

Re: USB Stick Herstellerseriennummer auslesen

Verfasst: 01.11.2016 16:37
von RSBasic
Vielen Dank, _JON_. :allright:
Den Code werde ich in meiner WinAPI Library aktualisieren.

Re: USB Stick Herstellerseriennummer auslesen

Verfasst: 08.01.2017 23:27
von GPI
Nur so eine andere Idee. Ich bin mir sicher, das wer es kann auch die Seriennummer problemlos kopieren könnte. Wenn man den Stick formatiert, ist man selbst Schuld. Den Stick einfach rumliegen lassen, wäre sowieso fahrlässig.
Schon mal daran gedacht, zwei Partitionen auf einen Stick zu erstellen - die zweite Partition nur ein paar MB groß, also gerade groß genug, um einen Key zu halten. Die zweite Partition sollte halt so angelegt sein, dass das OS damit nichts anfangen kann und es ignoriert. Bei Windows ist es imo eh so, das es nicht wirklich gut mit Partitionen auf den USB-Stick umgehen kann (ich musste damals mittels DOS-Befehlen die Partitionen löschen. Das Formatieren beachtet ja nur die erste Partition - und die soll ja normal überall auftauchen. Wenn ein paar Bytes fehlen, fällt das auch zu 99% keinen auf. Und diejenigen, die darauf achten, zerlegen dein Sicherheitssystem eh in vorbeigehen.

Das einzige Problem, das ich sehe ist, die Partition auszulesen. Keine Ahnung, wie die Sicherheitssysteme der Betriebssysteme so ausgelegt sind, in Zweifelsfall brauchst du Admin-Rechte. Zumindest würde es mich wundern, wenn jedes Programm direkt auf die Partition lesen kann - zumindest bei den nicht Wechseldatenträgern. Es würde sämtliches Rechtesystem in Dateisystem ab absurdum führen.