Página 1 de 1

Protecao de software com pen-drive

Enviado: 24 Dez 2007 12:26
por angeiras
Olá,

O código original está no forum internacional do Fivewin e foi criado pelo Antonio linares.

O objetivo é ler o número serial da pen-drive, que é único ( mesmo formatando ) e utilizar como esquema de proteção de software.

Achei muito interessante por dois motivos :

1) Protege o software contra pirataria. NÃO É PERFEITO, mas até mesmo produtos comerciais como o HASP e o PROTEQ já foram hackeados.

2) Serve também como armazenamento para backup dos dados.

A adaptação para xHarbour puro é muito simples, bastando alterar a criação dos objetos. O resto é a mesma coisa.

O Código :

Código: Selecionar todos

***************
FUNCTION MAIN()
***************
  Alert( "Numero serial da pen-drive : " + GetUSBSerial( "Z:" ) )
RETURN NIL

*******************************
FUNCTION GetUSBSerial( cDrive )
*******************************
   local cDiskNum := "", cPnPDeviceID := "", cTmp, oDiskDrive, oLogicalDrive

   local oWMIObjA, oWMIServerA, oWMIDiskDrive, oWMIObjA2, oWMIServerA2,;
         oWMILogicalDisk

   try
      oWMIObjA := GetActiveObject( "wbemScripting.SwbemLocator" )
   catch
      try
         oWMIObjA := CreateObject( "wbemScripting.SwbemLocator" )
      catch
         Alert( "ERRO ! Nao criou objeto wbemScripting")
         return
      end
   end
   oWMIServerA   := oWMIObjA:ConnectServer()
   oWMIDiskDrive := oWMIServerA:ExecQuery( "SELECT * FROM Win32_DiskDrive" )

   try
      oWMIObjA2 := GetActiveObject( "wbemScripting.SwbemLocator" )
   catch
      try
         oWMIObjA2 := CreateObject( "wbemScripting.SwbemLocator" )
      catch
         Alert( "ERRO ! Nao criou objeto wbemScripting")
         return
      end
   end
   oWMIServerA2    := oWMIObjA2:ConnectServer()
   oWMILogicalDisk := oWMIServerA2:ExecQuery( "SELECT * FROM Win32_LogicalDiskToPartition" )

   for each oLogicalDrive in oWMILogicalDisk
      if substr(oLogicalDrive:Dependent, at('"',oLogicalDrive:Dependent )+1,2 ) == cDrive
         cDiskNum := substr(oLogicalDrive:Antecedent, at('#',oLogicalDrive:Antecedent )+1,1 )
      endif
   next

   for each oDiskDrive in oWMIDiskDrive
      if oDiskDrive:Name == "\\.\PHYSICALDRIVE" + cDiskNum .and. oDiskDrive:InterfaceType == "USB"
         cTmp         := substr( oDiskDrive:PnPDeviceID, 1, rat( "&", oDiskDrive:PnPDeviceID ) - 1 )
         cPnPDeviceID := substr( cTmp, rat( "&", cTmp ) + 1 )
      endif
   next
RETURN cPnPDeviceID
O Z:, é a letra que indiquei para meus pen-drives.

Testei com todos os meus pen-drives, em windows XP e funcionou. Alguém mais disposto a testar ?

[]s
Manoel Angeiras

Enviado: 24 Dez 2007 22:33
por sygecom
Angerias, muito boa essa função...amanha vou testar para ver como funciona certinho ...depois volto com os resultados.

Enviado: 25 Dez 2007 23:19
por asimoes
Angeiras,

Testei e funciona blz.

[]´s

Enviado: 26 Dez 2007 20:53
por sygecom
Tche, fungo tudo blz em NT, agora tem PEN-DRIVER que não esta mais compativel com win95/98/98se/me por exemplo KINGSTON, ai se tornaria um pouco complicado usar essa função, mas tmb. com o o win98 já esta cada vez sendo menos usado, pelomenos isso é uma realidade entre meus clientes....quem sabe amanha depois...Obrigado por Compartilhar essa solução com nós !!!!

Enviado: 05 Jan 2008 09:04
por asimoes
Angeiras,

No 2000 Professional não funcionou.

[]´s

Enviado: 05 Jan 2008 18:30
por angeiras
Olá,

Segundo o link

http://msdn2.microsoft.com/en-us/libra ... .85).aspx

O WMI vem pré-instalado nos SO Windows ME, 2000, XP, 2003 e Vista. Para as outras versões, precisa ser instalado o WMI Redistributable Components.

Dá uma lida do link para uma explicação mais completa.

[]s
Manoel Angeiras