USB Stick Herstellerseriennummer auslesen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

USB Stick Herstellerseriennummer auslesen

Beitrag 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
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: USB Stick Herstellerseriennummer auslesen

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: USB Stick Herstellerseriennummer auslesen

Beitrag von Micha122 »

Hi RSBasic,
Geräteinstanzpfad sieht mir vielversprechend aus. :idea:

Probiere das aber später zu hause erstmal auf mehreren Rechnern aus.
Barcodes for PureBasic - http://micha122.bplaced.net/
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: USB Stick Herstellerseriennummer auslesen

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: USB Stick Herstellerseriennummer auslesen

Beitrag 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
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: USB Stick Herstellerseriennummer auslesen

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: USB Stick Herstellerseriennummer auslesen

Beitrag 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
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: USB Stick Herstellerseriennummer auslesen

Beitrag 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
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: USB Stick Herstellerseriennummer auslesen

Beitrag von RSBasic »

Vielen Dank, _JON_. :allright:
Den Code werde ich in meiner WinAPI Library aktualisieren.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: USB Stick Herstellerseriennummer auslesen

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten