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.
Auch lässt sich der Stick mit jedem Kopierprogramm im RAW-Modus vervielfältigen.
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.
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.

Da bräuchte ich schon

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!
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).
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
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_.
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.