Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi USB-Speicher identifizieren (https://www.delphipraxis.net/21676-usb-speicher-identifizieren.html)

Robert Marquardt 9. Sep 2005 18:44

Re: USB-Speicher identifizieren
 
Von http://www.sf.net/projects/jedi-apilib scapi und win32api runterladen.
In scapi ist ein Beispielprogramm dazu enthalten (SafeRemoval)

r_amse_s 20. Dez 2006 01:49

Re: USB-Speicher identifizieren
 
hallo,

habe ausprobiert saferemoval zu kompilieren, leider ohne erfolg.

in jediapilib.inc

Delphi-Quellcode:
{$IFNDEF JEDI_INC}
ALERT_jedi_inc_incompatible              <-------------- error
// secure against old versions of jedi.inc.
{$ENDIF !JEDI_INC}
error lautet:
[Error] jediapilib.inc(47): 'INTERFACE' expected but identifier 'ALERT_jedi_inc_incompatible' found


hat jemand eine idee ?

habe D7 enterpr.

danke!

Robert Marquardt 20. Dez 2006 04:45

Re: USB-Speicher identifizieren
 
Das besagt das eine alte jedi.inc im Suchpfad von Delphi enthalten ist. Das deutet auf die Installation einer alten JCL oder JVCL hin.

r_amse_s 25. Dez 2006 21:27

Re: USB-Speicher identifizieren
 
habe nach jedi.inc gesucht und habe 7 files gefunden

http://i77.photobucket.com/albums/j4...e_s/search.png

welche sind nun relevant und welche nicht ?

Robert Marquardt 26. Dez 2006 14:28

Re: USB-Speicher identifizieren
 
Relevant sind JCL bzw. JVCL (es ist egal welches der Files zuerst gefunden wird, da sie gleich sind).
Schau mal unter "Tools : Environment Options... : Library : Library path" nach (ich habe englisches Delphi installiert).
Dort ist der JVCL-Pfad vermutlich am Ende der Pfadliste. Schieb den Eintrag hoch so das er vor den anderen steht.

Alternativ ersetze die JEDI.INC Files durch common\jedi.inc aus der JVCL. Die anderen Komponenten sollten das vertragen.

r_amse_s 26. Dez 2006 22:10

Re: USB-Speicher identifizieren
 
danke robert !

die verschiebung hat leider nicht viel gebracht, sehr wohl aber das ersetzen aller jedi.inc files wie oben beschrieben. das compilier vorgang geht jetzt weiter...
nach ca. 10 min. compilierung sind 3 errors aufgetretten

http://i77.photobucket.com/albums/j41/r_amse_s/s1.png

http://i77.photobucket.com/albums/j41/r_amse_s/s2.png

was bedeutet das jetzt ?
danke im voraus!

Robert Marquardt 27. Dez 2006 04:56

Re: USB-Speicher identifizieren
 
Da musst du HINSTANCE durch HINST ersetzen. Das ist ein Konversionsfehler den ich noch nicht behoben habe.

r_amse_s 28. Dez 2006 12:14

Re: USB-Speicher identifizieren
 
ok, jetzt wird alles compiliert aber unter W2K bekomme eine exception hier:

SafeRemovalMain.pas
Delphi-Quellcode:
  PnPHandle := SetupDiGetClassDevs(@StorageGUID, nil, 0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
http://i77.photobucket.com/albums/j41/r_amse_s/safe.png


unter WinXP läuft alles perfekt.
gibt es eine lösung auch für W2K ?
ich bilde mir ein, dass in einer frühere version von scapi auch in W2K alles funktioniert hat...oder ?
was ist unter W2K anders ?

auch bei dem beispiel USBView ist ist das gleiche problem, exception tritt auf in

USBDeviceTree.pas
Delphi-Quellcode:
  if CM_Locate_DevNode(Dest, nil, 0) = CR_SUCCESS then
danke!

Robert Marquardt 28. Dez 2006 12:26

Re: USB-Speicher identifizieren
 
Check mal jediapilib.inc. Dort ist wahrscheinlich WINXP als Linklevel eingestellt. Wenn du dann auch noch LINKONREQUEST an hast, was standardmaessig der Fall ist, dann versagt das Laden der DLL und alle Funktionen loesen diese Exception aus.

r_amse_s 28. Dez 2006 22:07

Re: USB-Speicher identifizieren
 
jetzt funkt alles sowohl unter W2K als auch unter XP!
...nur WinXP auskommentiert und W2K aktiviert.

jetz wieder zum thread thema "usb speicher identifizieren"

durchs experimentieren sind aber weitere fragen aufgetaucht:
- habe einige USB-Sticks angesteckt: manche zeigen eine (zumindest für 2 PCs) eindeutige seriennr. in hex. ist das wircklich die hard coded seriennr. oder ist eine id von windoze vergeben aufgrund von verschiedene param ? (die nr. sind gleich auf verschiedene PCs)
- kann man davon ausgehen, dass auch auf andere PCs die gleiche nr "zugeordnet" bekommen
- ein stick zeigt statt die sernr. einen string der form 6&64173e2&0&1. was bedeuten diese zahlen ? sind sie auch eindeutig für jedes stick ? in der registry wird dieses stick unter:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\U SB\Vid_067b&Pid_2515

die anderen sticks werden unter:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\U SB\Vid_0ea0&Pid_2168

- kann man diese sernr manipulieren ? bsp. registry editieren, ohne die funktion/stabilität zu beeinträchtigen ?

- wie kann man auch andere devices (z.b. pcmcia datenkarten-gsm modems) in der liste von saferemoval anzeigen und aufwerfen per soft ?

nochmals vielen dank für die hilfe!

Robert Marquardt 29. Dez 2006 04:46

Re: USB-Speicher identifizieren
 
VendorID und ProductID sind feste in der Firmware des Sticks abgelegte Nummern. Die VendorID kauft man sich beim USB Implementers Forum, Die PID vergibt der Hersteller fuer ein Produkt. Anhand dieser beiden Nummern identifiziert ein Betriebssystem ein USB-Geraet. Windows schaut erst mal nach ob es ein INF-File mit diesen Nummern entdeckt (genaugenommen diese Stringbestanddteile) und weist dann die im INF-File eingetragenen Treiber zu. Ansonsten versucht Windows anhand der auch vom Geraet gelieferten Klasse (Mass Storage fuer USB Sticks) einen Systemtreiber zuzuweisen.
Die Seriennummer, die auch in diesem Registrystring einkodiert ist, ergibt zusammen mit VID und PID eine eindeutige Kennung fuer das individuelle Exemplar des Geraetes.
Es kann allerdings vorkommen das Billiggeraete keine Seriennummer haben oder noch schlimmer nur genau eine Seriennummer fuer alle Geraete haben. Wegschmeissen das Zeug.

Manipulation am USB-Bereich der Registry ist Unsinn und fuehrt nur zu Problemen der schlimmen Art.

Nicht alle Geraete lassen sich auswerfen, allerdings war ich ueberrascht das sich Maeuse auswerfen lassen. Da hat MS geschlampt.
Ich habe das Programm auf (faktisch) einfache USB-Sticks beschraenkt, da es noch USB-Sticks gibt, die mehrere Partitionen haben und eine andere Methode zum Auswerfen brauchen. Ausserdem wollte ich die Laufwerksbuchstaben anzeigen und da passen andere Geraete schlecht ins Konzept.

r_amse_s 29. Dez 2006 22:19

Re: USB-Speicher identifizieren
 
hintergrund ist das Versuch (wie vielleicht andere vor mir versucht haben) ein USB Stick als Lizenzkey zu verwenden.

angenommen man verkauft die app (die auf jedem rechner lauffähig sein soll) zusammnen mit einem stick wo die seriennr. sauber implementiert ist.
somit hat der user eine gültige seriennr. die er in der registry von anderen pc eintragen/verändern könnte. geht das überhaupt ohne sofortige negative auswirkungen zu haben ?

was für relativ sichere alternativen gibt es mein vorhaben zu verwirklichen im bezug auf usb stick (kein echtes hardlock da kein speicher für apps vorhanden auf so einen ding)?

hier scheint jemand das realisiert zu haben, antwortet aber nicht auf mails :(
CaptNemo

auch andere threads haben relativ alte infos...

Robert Marquardt 30. Dez 2006 05:10

Re: USB-Speicher identifizieren
 
Veraendert man den Registry-Eintrag, so legt Windows beim naechsten Plug einen neuen Eintrag an. Hat das Device eine Seriennummer, dann legt Windows die Registry-Eintraege pro USB Port an (voellig schwachsinnig). Dieses Verhalten kann man allerdings per Registry-Eintrag abschalten.

I.A 4. Mär 2009 10:00

Re: USB-Speicher identifizieren
 
Hallo allerseits!

Interessantes Thema hier. Hab mir grad eben die Beiträge durchgelesen und frage mal in die Runde aber auch besonders den Threadersteller:

-Muss es denn unbedingt die Seriennummer sein?

-Wie sieht der Gesamtstring bei einem Stick eines Herstellers bei einer Speicherkapazität aus?
Sins dies Strings dann bei beiden Sticks gleich?

-Wie sieht der String bei unterschiedlichen USB Geräten (Maus, Drucker, Tastatur, Speicherstick...) aus.

Ich denke, sobald dieser String für jedes Gerät eindeutig ist, können die Geräte schon mal unterschieden werden, denn eben mit dem Gesamtstring.

Aber wie sieht das beispielsweise bei zwei USB Sticks des selben Herstellers und der selben Speicherkapazität aus, wenn die beiden Sicks auch noch baugleich sind?

Und wie ist es bei einem Stick, sagen wir von Sony, dessen Speicher auf einem Chip fest eingebaut ist, während der zweite Sick ein Speicherkartenleser ist? Wieder gleiche Speicherkapazität angenommen?

Ich selber werde jetzt auch mal schauen, habe aber 3 Sticks verschiedener Hersteller und mit verschiedener Speicherkapazität. Da wär es eher ungewöhnlich, wenn ich bei allen 3 Sticks gleiche Strings vorfände. Aber ich werde mal schauen.

GoTo0815 4. Mär 2009 10:52

Re: USB-Speicher identifizieren
 
Hallo,

ist ja lange her, dass ich den Thread geschrieben habe.
Mittlerweile setze ich für solche Fälle einfach die Einträge direkt auf dem Controller.
Wenn ein Kunde identifizierbare Sticks braucht, dann kaufen wir nur noch USB-Sticks mit Boards, welche wir auch nach unseren Wünschen gestalten können. Mit einem speziellen Tool können wir während dem Formatierungsvorgang so ziemlich alles setzen was wir brauchen. Vendor, Serial, Herstellereinträge, CD Partition, Partittionierung, Schreibschutz, Versteckte Partition FAT, Private Partition ohne Dateisystem. Selbst das Blinkverhalten der LED kann man so beinflussen.
Für ein bestimmtes Controllermodell haben wir dann ein paar Delphikomponenten entwickelt mit denen man über eine DLL auf den Stick von einer eigenen Anwendung aus zugreifen kann.
Nachteil: Dieser Zugriff braucht dann Adminrechte. Aber für das setzen der Seriennummern oder andere Einstellungen ist das ja ok.
Lesen der Einträge kann man ja dann später auch ohne entsprechende Rechte.

Gruß

Hendrik

schöni 4. Mär 2009 11:33

Re: USB-Speicher identifizieren
 
Da ist also die konkrete Vorgehensweise ein kleines Geheimnis? Oder gibt es Komponenten für Delphi, mit denen jeder seinen Stick auslesen kann, ich meine dokumentierte Komponenten. Muss nicht OpenSource geschweige Freeware sein. Es genügt eine kommerzielle Komponentensammlung mit bezahlbarem Preis.

Ist das Auslesen an sich wirlich so kompliziert?

delphifan2004 5. Mär 2009 09:54

Re: USB-Speicher identifizieren
 
Hallo!

Wozu der Aufwand? Ich glaube, irgendwo gelesen zu haben, das es für USB inzwischen auch sog. Dongles gibt. Leider wieß ich nicht mehr, wo.

GoTo0815 5. Mär 2009 13:53

Re: USB-Speicher identifizieren
 
Hallo,
also nicht das aus meinem vorigen Posting etwas falsch verstanden wird.
Ich meinte natürlich nicht, dass ich den Thread gestartet habe, sondern mich daran beteiligt habe.

DelphiFan2004 danke ich übrigens für den vorangegangenen hilfreichen Beitrag :-).
Ich denke eher, dass es genau darum geht, diese Art Dongles oder auch andere Software für USB Sticks selbst zu gestalten.
Irgendwer hat das ja mit dem USB Dongle auch so gemacht.

Also eine Sache die man sich ansehen sollte: HID components von Robert Marquardt (der hat sich hier auch an dem Thread beteiligt)

Gruß

Hendrik

hathor 5. Mär 2009 20:43

Re: USB-Speicher identifizieren
 
Zitat:

Zitat von delphifan2004
Hallo!

Wozu der Aufwand? Ich glaube, irgendwo gelesen zu haben, das es für USB inzwischen auch sog. Dongles gibt. Leider wieß ich nicht mehr, wo.


http://www.aladdin.de/special/hasp/s...FUaK3godNybllg

delphifan2004 5. Mär 2009 22:53

Re: USB-Speicher identifizieren
 
Zitat:

Zitat von HendrikSturm
Hallo,
also nicht das aus meinem vorigen Posting etwas falsch verstanden wird.
Ich meinte natürlich nicht, dass ich den Thread gestartet habe, sondern mich daran beteiligt habe.

DelphiFan2004 danke ich übrigens für den vorangegangenen hilfreichen Beitrag :-).
Ich denke eher, dass es genau darum geht, diese Art Dongles oder auch andere Software für USB Sticks selbst zu gestalten.
Irgendwer hat das ja mit dem USB Dongle auch so gemacht.

Also eine Sache die man sich ansehen sollte: HID components von Robert Marquardt (der hat sich hier auch an dem Thread beteiligt)

Gruß

Hendrik

Was mir abar partout nicht einleuchten will, ist der String, der ausgelesen wird. Das Auslesen mit einem dafür geeigneten Tool schon. Aber ich dachte, das dieser String für jeden USB Stick eindeutig sei, weshalb ich auch die Fragen von I.A irgendwo nachvollziehen kann.

Schöni schreibt noch das hier:
Zitat:

Da ist also die konkrete Vorgehensweise ein kleines Geheimnis?
Das sollte eigentlich niemals der Fall sein. Bei Verschlüsselungen weiß ich, das da der Schlüssel, aber nicht der Verschlüsselungsalgorithmus geheim ist.

Mit den HID Komponenten von Robert Marquardt wäre ja auch das Auslesen gelöst. Bleibt noch, den ausgelesenen String zu interpretieren.

Zitat:

Ich nehme mal die relevante Zeile aus deveject:
'USB-Massenspeichergerõt' 'USB\VID_054C&PID_008B\6&2A6BBF53&0&1' [REMOVEABLE]

oder der hier:
\\?\usbstor#disk&ven_sony&prod_storage_media&rev_1 .00#7&1ce25073&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
Da kann ich die Fragen von I.A irgendwie nachvollziehen. Es sei denn, bei typgleichen USB Sticks vom gleichen Hersteller und gleicher Speicherkapazität wäre der String bei jedem Stick gleich.

Das hier hat I.A gefragt:
Zitat:

-Muss es denn unbedingt die Seriennummer sein?

-Wie sieht der Gesamtstring bei einem Stick eines Herstellers bei einer Speicherkapazität aus?
Sins dies Strings dann bei beiden Sticks gleich?

-Wie sieht der String bei unterschiedlichen USB Geräten (Maus, Drucker, Tastatur, Speicherstick...) aus.

Ich denke, sobald dieser String für jedes Gerät eindeutig ist, können die Geräte schon mal unterschieden werden, denn eben mit dem Gesamtstring.

Aber wie sieht das beispielsweise bei zwei USB Sticks des selben Herstellers und der selben Speicherkapazität aus, wenn die beiden Sicks auch noch baugleich sind?
Wenn der Gesamtstring für jeden Stick eindeutig wäre hätte man ja die eindeuteige Zuordnung.

Wenn der String jedoch bei baugleichen Sticks mit gleicher Speicherkapazität und gleichem Hersteller bei jedem Stick gleich ist, ist diese Vorgehensweise natürlich nicht die gesuchte Lösung. Dann neheme ich meine Bemerkung zurück. Ich kann auch nachvollziehen, das mancher Programmierer seine Dongle Lösung selber gestalten will.

I.A 6. Mär 2009 08:17

Re: USB-Speicher identifizieren
 
Hallo!

Entschuldigt bitte, ich nehme alle meine Fragen zurück. Habe soeben noch mal hir geguckt und den Beitrag von Robert Marquardt entdeckt. Den hatte ich voriges Mal schlichtweg übersehen.


Es gibt also doch Sticks ohne Seriennummer. Dann wäre wenigstens bei gleichen Sicks des gleichen Herstellers der String nicht mehr eindeutig. Für ein kommerzielles Programm mit Lizenzschlüssel per USB muss man daher sicherheitshalber eine VendorID kaufen.

GoTo0815 6. Mär 2009 11:15

Re: USB-Speicher identifizieren
 
Hallo,

nein nicht zwangsweise.
Mein Vorschlag wäre USB Sticks von einem Lieferanten kaufen der Deine gewünschte Seriennummern setzt. (Ich kenne da ganz zufällig einen :-) )
Das hat dann nichts mit der Vendor oder ProductID zu tun.
Im gleichen Zuge kann beim Setzen, auch gleich die zu schüztende Software mit aufgespielt werden.
Veredelung (also Loganbringung), Infos des Sticks setzen (Serial etc), Partitionierung (wenn gewünscht) und Datenaufspielung in einem Abwasch.

Die Seriennummer kann dann von der Software geprüft werden.
Um eine größere Sicherheit zu erlangen ist es manchmal nötig, dass Ganze so zu implementieren, dass die Software selbst (z.B. nach einem Update) die Seriennummer des Sticks ändert. So können eventuell vorherige gehackte Lizenzen ungültig gemacht werden.
Dazu braucht man dann aber einen direkten Zugriff auf z.B. die von manchen Herstellern gelieferte API (DLL / SDK meist schwer und nur kommerziell zu bekommen). Und das funktioniert auch nur bei Software die beim Ändern der Seriennummer auch Adminrechte besitzt. (Was ja bei einem Update aber oft sowieso der Fall sein muss.)

Solch ein Aufwand hängt natürlich immer mit dem Wert der zu schützenden Software und den Mengen der Verbreitung dieser ab.

Wer also kommerzielles Interesse an so etwas hat, darf mich gern ansprechen, aber ansonsten will ich hier keine zu große Eigenwerbung machen. Ich schätze diese Forum sehr und bin sehr froh, dass diese Forum so konsequent und hilfreich ist.

Gruß

Hendrik

neo4a 6. Mär 2009 12:21

Re: USB-Speicher identifizieren
 
Ich habe mich erfolgreich mit Sticks beschäftigt, die mit der U3-Funktion ausgestattet sind (z.B. von Sandisk). Auch wenn man die U3-Fähigkeit (zusätzliches virtuelles CD-Laufwerk mit Autorun und Autostart-Menü inkl. spezieller Setup-Funktion) von den Sticks entfernt, erlaubt der Zugriff mit der frei verfüfbaren U3DAPI.dll den Zugriff auf Settings und spezielle Speicherbereiche, die für den "normalen" Benutzer nicht sicht- und kopierbar sind. In Szenarien mit geringeren Sicherheitsanforderung eine Alternative zu USB-Dongles, die dazu auch eine hohe Benutzerakzeptanz bietet (Startmenü, portable Applikation, PC- unabhängiges Speichern). Naja, und die Kosten sind auch überschaubar.

Für mich tut es das bis hin zu WinVista, allerdings ist nicht ganz sicher, wie es damit weitergeht. Derzeit sind die Sticks noch vorhanden und kaufbar, allerdings besagen (Marketing-) Gerüchte seit ca. 1 Jahr, dass Sandisk mit Microsoft an einer Folgelösung arbeitet, die bereits seit 4.Quartal 2008 verfügbar ist ;)

--
Andreas

GoTo0815 6. Mär 2009 14:52

Re: USB-Speicher identifizieren
 
Hallo,

ich stimme Andreas (neo4a) in den meisten Punkten zu.
Allerdings denke ich, dass die Funktionalitäten und Settingsmöglichkeiten auf USB Sticks bleiben werden. Ob das nun U3 heißt oder...

Wir haben damals von unserem Haupt-Controllerlieferanten eine eigene API.DLL erhalten auf deren Basis wir unsere Delphi Komponenten entwickelt haben, da der Umgang mit den DLL's selbst ja nicht immer der einfachste ist. :-)
Das Funktioniert dann zwar immer nur mit den Controllern eines bestimmten Controllerherstellers, aber da die Controller sowieso alle im LowBudget Bereich liegen und eher die Speicherpreise relevant sind, ist es auch nicht weiter schlimm, wenn man sich auf einen Controllerhersteller beschränkt.

Andreas: Wenn Du Dich mit der U3DApi auseinandergesetzt hast, weißt DU sicher, ob die Zugriffe dort auch unter NONAdmin funktionieren oder nicht. Würde mich wirklich brennend interessieren.

Gruß

Hendrik

neo4a 6. Mär 2009 17:47

Re: USB-Speicher identifizieren
 
@Hendrik,

in der Tat funktioniert das auch in eingeschränkten Benutzerumgebungen. In der Developer-Area von u3.com gibt es neben der API-Dokumentation im Downloadbereich auch eine Umsetzung der Header für Delphi, die mir als Vorlage diente.

Es gibt zwar beim gegenwärtigen Stand der Entwicklung (ich setze das jetzt seit 2007 ein) seltene Probleme mit der Adressierung, wenn z.B. an einem USB-Hub mit weiteren U3-Medien gearbeitet wird. Dafür habe ich einen treiberlosen Kopierschutz, der für U3-Sticks beliebiger Hersteller funktioniert. Ich kann die Fernfreischaltung diverser Dongle-Lieferanten (Aladdin, Wibu) bieten, indem ich z.B. eine lic-Datei liefere, die nur mit einem bestimmten Stick *einmalig* funktioniert in Abhängigkeit von deren Seriennr. und bereits hinterlegten Parametern. Dieser les- und beschreibbare Bereich ist auf dem Stick nur via API erreichbar. Man kann den Stick löschen, formatieren oder kopieren; diese Infos bleiben erhalten. Man arbeitet damit wie mit der Registry und insgesamt viel einfacher als z.B. mit den arg limitierten Bereich der Aladdin-Hasp, die ich zuvor lange benutzt habe.

Insgesamt ist es eine (für mich) recht bequeme und vor allem preiswerte (2GB ab ca. 6€) Alternative mit o.g. Vorteilen auch für den Benutzer.

--
Andreas


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:58 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz