Ir al contenido


Foto

Protección con USB


  • Por favor identifícate para responder
14 respuestas en este tema

#1 rhino0nt

rhino0nt

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 20 marzo 2009 - 11:58

Este es mi primer post y para variar es para solicitar ayuda u orientación.

¿ Alguien sabe como obtener la ID única de un dispositivo USB ? Necesito obtener el ID único de una memoria USB para encriptar el contenido basándome en ese ID, he investigado y entiendo que cada dispositivo USB tiene un ID único que es posible leer en Linux.

De antemano, Gracias.

  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 marzo 2009 - 12:52

Hola Rhino, ¿necesariamente debe ser en Linux?.

Saludos.
  • 0

#3 rhino0nt

rhino0nt

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 20 marzo 2009 - 01:04

Mea culpa, quise decir Windows, con esto de que vivo en Linux emulando Windows, ultimamente se me van las cabras.  :D

Saludos.
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 marzo 2009 - 01:52

Pues usando la función GetVolumeInformation de la API de windows, aquí­ un ejemplo donde se puede sacar esa información en cualquier tipo de unidad:



delphi
  1. unit Main;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   StdCtrls, ExtCtrls, FileCtrl;
  8.  
  9.  
  10. type
  11.   TFileFlag = (fsCaseIsPreserved, fsCaseSensitive, fsUnicodeStoredOnDisk,
  12.               fsPersistentAcls, fsFileCompression, fsVolumeIsCompressed);
  13.   TFileFlags = set of TFileFlag;
  14.  
  15.   //This set is used for determining the drive type of the drive
  16.   //set in DriveComboBox1
  17.   TDrvType = (dtNotDetermined, dtNonExistent, dtRemoveable,
  18.               dtFixed, dtRemote, dtCDROM, dtRamDrive);
  19.  
  20.   TForm1 = class(TForm)
  21.     DriveComboBox1: TDriveComboBox;
  22.     Memo1: TMemo;
  23.     Button1: TButton;
  24.     Label1: TLabel;
  25.     Label2: TLabel;
  26.     Label3: TLabel;
  27.     Label4: TLabel;
  28.     Label5: TLabel;
  29.     Label6: TLabel;
  30.     Label7: TLabel;
  31.     Label8: TLabel;
  32.     Label9: TLabel;
  33.     Label10: TLabel;
  34.     Label11: TLabel;
  35.     Label12: TLabel;
  36.     Label15: TLabel;
  37.     Label16: TLabel;
  38.     Bevel1: TBevel;
  39.     procedure Button1Click(Sender: TObject);
  40.     procedure Button2Click(Sender: TObject);
  41.     procedure FormCreate(Sender: TObject);
  42.     procedure DriveComboBox1Change(Sender: TObject);
  43.   private
  44.     procedure GetVolInfo; //This is the meat and potatoes procedure
  45.   end;
  46.  
  47. var
  48.   Form1: TForm1;
  49.  
  50.   function GetLogDrives : String; //Extra procedure to demonstrate
  51.                                   //getting logical drives from system.
  52.  
  53. implementation
  54.  
  55. {$R *.DFM}
  56.  
  57. procedure TForm1.GetVolInfo;
  58. var
  59.   //Variables de informacion del volumen
  60.   nVNameSer  : PDWORD;
  61.   drv        : String;
  62.   pVolName    : PChar;
  63.   FSSysFlags,
  64.   maxCmpLen  : DWord;
  65.   I          : Integer;
  66.   pFSBuf      : PChar;
  67.  
  68.   //Variables de informacion de discos;
  69.   dType      : TDrvType;
  70.   SectPerCls,
  71.   BytesPerCls,
  72.   FreeCls,
  73.   TotCls      : DWord;
  74.  
  75. begin
  76.   //inicializar las variables
  77.   drv := DriveComboBox1.Drive + ':\';
  78.   GetMem(pVolName, MAX_PATH);
  79.   GetMem(pFSBuf, MAX_PATH);
  80.   GetMem(nVNameSer, MAX_PATH);
  81.  
  82.   //Limpiamos el memo primero
  83.   Memo1.Lines.Clear;
  84.  
  85.   //Obtenemos la información de volumen
  86.   GetVolumeInformation(PChar(drv), pVolName, MAX_PATH, nVNameSer,
  87.                       maxCmpLen, FSSysFlags, pFSBuf, MAX_PATH);
  88.  
  89.   //Obtener la descripcion de los tipos de flags
  90.   for I := 0 to 5 do begin
  91.     if ((FSSysFlags AND I) <> 0) then
  92.       case I of
  93.         Ord(fsCaseIsPreserved)    :
  94.           Memo1.Lines.Add('...preserves case with file names');
  95.         Ord(fsCaseSensitive)      :
  96.           Memo1.Lines.Add('...supports case sensitive file names');
  97.         Ord(fsUnicodeStoredOnDisk) :
  98.           Memo1.Lines.Add('...stores Unicodes as on disk');
  99.         Ord(fsPersistentAcls)      :
  100.           Memo1.Lines.Add('...preserves and enforces ACLs');
  101.         Ord(fsFileCompression)    :
  102.           Memo1.Lines.Add('...supports file-based compression');
  103.         Ord(fsVolumeIsCompressed)  :
  104.           Memo1.Lines.Add('...resides on a compressed volume');
  105.       end;
  106.   end;
  107.  
  108.   //Determinar si el sistema soporta nombres largos
  109.   if (maxCmpLen > 8.3) then
  110.     Memo1.Lines.Add('...soporta nombres largos');
  111.  
  112.   Label6.Caption := StrPas(pVolName);
  113.   Label3.Caption := IntToStr(nVNameSer^);
  114.   Label4.Caption := StrPas(pFSBuf);
  115.  
  116.   //Obtener el tipo de Unidad
  117.   dType := TDrvType(GetDriveType(PChar(drv)));
  118.   case dType of
  119.     dtNotDetermined : Label10.Caption := 'Imposible de determinar';
  120.     dtNonExistent  : Label10.Caption := 'No existe';
  121.     dtRemoveable    : Label10.Caption := 'Unidad portatil)';
  122.     dtFixed        : Label10.Caption := 'Disco Fixed';
  123.     dtRemote        : Label10.Caption := 'Unidad de Red';
  124.     dtCDROM        : Label10.Caption := 'CD-ROM';
  125.     dtRamDrive      : Label10.Caption := 'RAM';
  126.   end;
  127.  
  128.   //Obtener la capacidad total y espacio disponible del disco
  129.   //presentado en MB's
  130.   GetDiskFreeSpace(PChar(drv), SectPerCls, BytesPerCls, FreeCls, TotCls);
  131.   Label11.Caption := FormatFloat('0.00', (SectPerCls * BytesPerCls *
  132.                                           TotCls)/1000000) + ' MB';
  133.   Label12.Caption := FormatFloat('0.00', (SectPerCls * BytesPerCls *
  134.                                           FreeCls)/1000000) + ' MB';
  135.  
  136.   FreeMem(pVolName, MAX_PATH);
  137.   FreeMem(pFSBuf, MAX_PATH);
  138.   FreeMem(nVNameSer, MAX_PATH);
  139. end;
  140.  
  141. function GetLogDrives : String;
  142. var
  143.   stDrives : Set of 0..25; //Posibles unidades lógicas
  144.   drvNum  : Integer;
  145. begin
  146.   Integer(stDrives) := GetLogicalDrives; //Tal vez cargue posibles valores;
  147.   Result := '';
  148.   for drvNum := 0 to 25 do begin
  149.     if not (drvNum in stDrives) then
  150.       Continue;
  151.     Result := Result + Char(drvNum + Ord('a'));
  152.   end;
  153. end;
  154.  
  155. procedure TForm1.Button1Click(Sender: TObject);
  156. begin
  157.   Release;
  158.   Application.Terminate;
  159. end;
  160.  
  161. procedure TForm1.Button2Click(Sender: TObject);
  162. begin
  163.   ShowMessage(GetLogDrives);
  164. end;
  165.  
  166. procedure TForm1.FormCreate(Sender: TObject);
  167. begin
  168.   GetVolInfo;
  169. end;
  170.  
  171. procedure TForm1.DriveComboBox1Change(Sender: TObject);
  172. begin
  173.   GetVolInfo;
  174. end;
  175.  
  176. end.



No sé si eso es lo que buscas.

Saludos.
  • 0

#5 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 599 mensajes

Escrito 20 marzo 2009 - 03:53

Amigo enecumene, eso te da información lógica de un dispositivo, una vez reformateado el SN que esta almacenado en el Boot cambia y deja de ser un valor identificativo, aquí­ escribi algo hace un tiempo atrás...
  • 0

#6 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 20 marzo 2009 - 04:05

Yo estoy dándole vueltas a esto:



delphi
  1. uses ComObj, ActiveX;
  2.  
  3. procedure USBPnPIDs(List: TStringList);
  4. var
  5.   ScriptControl: OleVariant;
  6.   WmiService: OleVariant;
  7.   Items: IUnknown;
  8.   DiskDrives: IEnumVariant;
  9.   Fetched: Cardinal;
  10.   Item: OleVariant;
  11.   Str: String;
  12. begin
  13.   List.Clear;
  14.   ScriptControl:= CreateOleObject('ScriptControl');
  15.   ScriptControl.Language := 'VBScript';
  16.   WmiService:= ScriptControl.Eval('GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")');
  17.   Items:= WMIService.ExecQuery('SELECT * FROM Win32_DiskDrive')._NewEnum;
  18.   DiskDrives:= Items as IEnumVariant;
  19.   DiskDrives.Next(1, Item, Fetched);
  20.   while Fetched = 1 do
  21.   begin
  22.     if VarToStrDef(Item.InterfaceType,EmptyStr) = 'USB'  then
  23.     begin
  24.       Str:= VarToStrDef(Item.PNPDeviceID,EmptyStr);
  25.       if Str <> EmptyStr then
  26.         List.Add(Str);
  27.     end;
  28.     DiskDrives.Next(1, Item, Fetched);
  29.   end;
  30. end;
  31.  
  32. // Por ejemplo
  33. var
  34.   List: TStringList;
  35. begin
  36.   List:= TStringList.Create;
  37.   try
  38.     USBPnpIDs(List);
  39.     memo1.Lines.Assign(List);
  40.   finally
  41.     List.Free;
  42.   end;
  43. end;



Y tambien a esto:


delphi
  1. procedure USBPnPIDs(List: TStringList);
  2. var
  3.   i: integer;
  4. begin
  5.   with TRegistry.Create do
  6.   try
  7.     RootKey:= HKEY_LOCAL_MACHINE;
  8.     if OpenKeyReadOnly('\SYSTEM\CurrentControlSet\Services\USBSTOR\Enum') then
  9.     begin
  10.       i:= 0;
  11.       while ValueExists(IntToStr(i)) do
  12.       begin
  13.         List.Add(ReadString(IntToStr(i)));
  14.         inc(i);
  15.       end;
  16.       CloseKey;
  17.     end;
  18.   finally
  19.     Free;
  20.   end;
  21. end;



Pero no termina de convencerme  :^)

  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 marzo 2009 - 04:08

Amigo enecumene, eso te da información lógica de un dispositivo, una vez reformateado el SN que esta almacenado en el Boot cambia y deja de ser un valor identificativo, aquí­ escribi algo hace un tiempo atrás...


Ah vaya, no sabí­a eso :s, gracias por la info ChackAll, (y).

Saludos.
  • 0

#8 rhino0nt

rhino0nt

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 21 marzo 2009 - 06:15

Yo estoy dándole vueltas a esto:



delphi
  1. uses ComObj, ActiveX;
  2.  
  3. procedure USBPnPIDs(List: TStringList);
  4. var
  5.   ScriptControl: OleVariant;
  6.   WmiService: OleVariant;
  7.   Items: IUnknown;
  8.   DiskDrives: IEnumVariant;
  9.   Fetched: Cardinal;
  10.   Item: OleVariant;
  11.   Str: String;
  12. begin
  13.   List.Clear;
  14.   ScriptControl:= CreateOleObject('ScriptControl');
  15.   ScriptControl.Language := 'VBScript';
  16.   WmiService:= ScriptControl.Eval('GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")');
  17.   Items:= WMIService.ExecQuery('SELECT * FROM Win32_DiskDrive')._NewEnum;
  18.   DiskDrives:= Items as IEnumVariant;
  19.   DiskDrives.Next(1, Item, Fetched);
  20.   while Fetched = 1 do
  21.   begin
  22.     if VarToStrDef(Item.InterfaceType,EmptyStr) = 'USB'  then
  23.     begin
  24.       Str:= VarToStrDef(Item.PNPDeviceID,EmptyStr);
  25.       if Str <> EmptyStr then
  26.         List.Add(Str);
  27.     end;
  28.     DiskDrives.Next(1, Item, Fetched);
  29.   end;
  30. end;
  31.  
  32. // Por ejemplo
  33. var
  34.   List: TStringList;
  35. begin
  36.   List:= TStringList.Create;
  37.   try
  38.     USBPnpIDs(List);
  39.     memo1.Lines.Assign(List);
  40.   finally
  41.     List.Free;
  42.   end;
  43. end;



Y tambien a esto:


delphi
  1. procedure USBPnPIDs(List: TStringList);
  2. var
  3.   i: integer;
  4. begin
  5.   with TRegistry.Create do
  6.   try
  7.     RootKey:= HKEY_LOCAL_MACHINE;
  8.     if OpenKeyReadOnly('\SYSTEM\CurrentControlSet\Services\USBSTOR\Enum') then
  9.     begin
  10.       i:= 0;
  11.       while ValueExists(IntToStr(i)) do
  12.       begin
  13.         List.Add(ReadString(IntToStr(i)));
  14.         inc(i);
  15.       end;
  16.       CloseKey;
  17.     end;
  18.   finally
  19.     Free;
  20.   end;
  21. end;



Pero no termina de convencerme  :^)


Esto serí­a para obtener el id del puerto donde se ha conectado el dispositivo USB, es correcto ? Tengo entendido que Windows asigna un id único a cada puerto usb en el sistema pero esto no serí­a el número de identificación del usb, como comentaba anteriormente tengo entendido que cada dispisitivo USB cuenta con un id único...

Continuaré investigando y cualquier avance lo publicaré.

  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 21 marzo 2009 - 06:21

¿La solución de ChacKall no te sirve?, él colocó un ví­nculo a su web donde presenta un código al respecto.

Saludos.
  • 0

#10 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 21 marzo 2009 - 07:51

Esto serí­a para obtener el id del puerto donde se ha conectado el dispositivo USB, es correcto ?

No, esto devuelve el numero de serie del disco usb.

La cadena de texto que te devuelve para cada disco tienen varios parámetros separados por el sí­mbolo "\". El ultimo de ellos es el numero de serie que el fabricante grabo en el disco. Pero este numero no tiene porque ser único, bien porque dos fabricantes pueden usar números de serie iguales, o porque un fabricante perezoso no se moleste en grabar números de serie diferentes para cada dispositivo.

De todas formas si quieres solo el numero de serie usa la función ExtractFilename. Por ejemplo:


delphi
  1. procedure USBPnPIDs(List: TStringList);
  2. var
  3. i: integer;
  4. begin
  5. with TRegistry.Create do
  6. try
  7.   RootKey:= HKEY_LOCAL_MACHINE;
  8.   if OpenKeyReadOnly('\SYSTEM\CurrentControlSet\Services\USBSTOR\Enum') then
  9.   begin
  10.     i:= 0;
  11.     while ValueExists(IntToStr(i)) do
  12.     begin
  13.       List.Add(ExtractFilename(ReadString(IntToStr(i))));
  14.       inc(i);
  15.     end;
  16.     CloseKey;
  17.   end;
  18. finally
  19.   Free;
  20. end;
  21. end;



Pero yo usarí­a la cadena completa, ya que, además del numero de serie, contiene otros identificadores como el fabricante o la versión, lo que hace esta cadena mas "única" que el simple numero de serie.

  • 0

#11 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 22 marzo 2009 - 05:34

Saludos SEOANE

Oye con respecto a los SERIES de los USB,,  sabes si alguna marca en PARTICULAR las SERIALIZA distintas,,,  es decir que CADA USB tenga su propia SERIE independientemente si FABRICARON "x" cantidad.

Porque como lo comentas si fue PERESOSO el FABRICANTE y se utiliza la de ese fabricante pues la llave seria muy sencilla de CLONAR copiar..


  • 0

#12 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 22 marzo 2009 - 06:12

Pues no se que fabricante es el mas adecuado pcicom, supongo que seria una cuestión de "prueba y error".

De todas formas esta protección usb es algo improvisado, no se deberí­a de usar como algo seguro al 100%. Para eso ya hay sistemas de protección comerciales muchí­simo mas seguros, que ya utilizan llaves usb (no discos) combinados con sistemas de cifrado asimétrico.
  • 0

#13 rhino0nt

rhino0nt

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 23 marzo 2009 - 01:52


Esto serí­a para obtener el id del puerto donde se ha conectado el dispositivo USB, es correcto ?

No, esto devuelve el numero de serie del disco usb.

La cadena de texto que te devuelve para cada disco tienen varios parámetros separados por el sí­mbolo "\". El ultimo de ellos es el numero de serie que el fabricante grabo en el disco. Pero este numero no tiene porque ser único, bien porque dos fabricantes pueden usar números de serie iguales, o porque un fabricante perezoso no se moleste en grabar números de serie diferentes para cada dispositivo.

De todas formas si quieres solo el numero de serie usa la función ExtractFilename. Por ejemplo:


delphi
  1. procedure USBPnPIDs(List: TStringList);
  2. var
  3. i: integer;
  4. begin
  5. with TRegistry.Create do
  6. try
  7.   RootKey:= HKEY_LOCAL_MACHINE;
  8.   if OpenKeyReadOnly('\SYSTEM\CurrentControlSet\Services\USBSTOR\Enum') then
  9.   begin
  10.     i:= 0;
  11.     while ValueExists(IntToStr(i)) do
  12.     begin
  13.       List.Add(ExtractFilename(ReadString(IntToStr(i))));
  14.       inc(i);
  15.     end;
  16.     CloseKey;
  17.   end;
  18. finally
  19.   Free;
  20. end;
  21. end;



Pero yo usarí­a la cadena completa, ya que, además del numero de serie, contiene otros identificadores como el fabricante o la versión, lo que hace esta cadena mas "única" que el simple numero de serie.


Me salta un poco el uso del HKEY_LOCAL_MACHINE en el registro, voy a hacer las pruebas con un usuario restringido para ver si no brinca por falta de derechos, lo pruebo y les comento.

Lo que estoy haciendo es básicamente una alternativa para algunos clientes perezosos que tengo en mis sistemas que no quieren ni siquiera recordar una contraseña para acceder a sus sistemas pero que si son muy esquizofrénicos con la infomración que guardan en la misma, asi que básicamente lo que hago es crear una llave única con la combinación de la serie de una usb que ellos definan y un algoritmo de encriptación por cuadros que no es nada del otro mundo pero que me ha servido mucho personalmente.

Una vez que lo tenga terminado pueden dar por hecho que publicaré un tutorial al respecto, quizá alguien cuenta con el mismo tipo de clientes para sus aplicaciones.

Saludos a todos.

  • 0

#14 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 27 abril 2009 - 03:36

y en que quedo ???

se puede o no se puede ???

digo suena interesante como para hacer algo asi como un licenciamiento de tipo
te regalo el programa
pero te vendo la USB que hace que corra
jjiijjiijijij


  • 0

#15 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 599 mensajes

Escrito 26 mayo 2009 - 10:26

y en que quedo ???

se puede o no se puede ???

digo suena interesante como para hacer algo asi como un licenciamiento de tipo
te regalo el programa
pero te vendo la USB que hace que corra
jjiijjiijijij


usbGetSerial
  • 0




IP.Board spam blocked by CleanTalk.