executar um programa so para um HD

Delphi

18/04/2006

como excutar um programa somente para um HD. se o cliente tentar instalar em outro computador dar uma mensagen de erro!

grato,


Adriano.


Xadriano

Xadriano

Curtidas 0

Respostas

Paullsoftware

Paullsoftware

18/04/2006

vc pode usar essa unit para pegar o serial do HD e depois aplicar os critérios necessários para o bloqueio...

unit IdeSN;

interface

  function SerialNum(FDrive:String) :String;

  function GetIdeSN : String;

  function GetIdeDiskSerialNumber( ControllerNumber, DriveNumber : Integer ) : String;

//=============================================================
implementation

uses
  Windows,
  SysUtils; // only for Win32Platform, SysErrorMessage and class Exception 

{$IFDEF VER150} 
{$DEFINE VER140} 
{$ENDIF} 

{$IFNDEF VER140} 
procedure RaiseLastOSError; 
begin 
  RaiseLastWin32Error; 
end; 
{$ENDIF} 

//Funçãobásica para detectar o serial lógico do HD, usando em windows 9x
Function SerialNum(FDrive:String) :String;
Var
Serial:DWord;
DirLen,Flags: DWord;
DLabel : Array[0..11] of Char;
begin
Try GetVolumeInformation(PChar(FDrive+´:\´),dLabel,12,@Serial,DirLen,Flags,nil,0);
Result := IntToHex(Serial,8);
Except Result :=´´;
end;
end;

//------------------------------------------------------------- 
// Tries to extract the serial number from specified IDE disk. 
// 
// Parameters: 
//   ControllerNumber - SCSI port number of the controller. 
//   DriveNumber - SCSI port number of the controller. 
// Notes: 
//  1. The parameter ControllerNumber is ignored on Windows 9x/ME platforms and should be 0. 
//  2. This function CAN NOT extract SCSI disk serial number. 
// 
function GetIdeDiskSerialNumber( ControllerNumber, DriveNumber : Integer ) : String; 
type 
  TSrbIoControl = packed record 
    HeaderLength : ULONG; 
    Signature    : Array[0..7] of Char; 
    Timeout      : ULONG; 
    ControlCode  : ULONG; 
    ReturnCode   : ULONG; 
    Length       : ULONG; 
  end; 
  SRB_IO_CONTROL = TSrbIoControl; 
  PSrbIoControl = ^TSrbIoControl; 

  TIDERegs = packed record 
    bFeaturesReg     : Byte; // Used for specifying SMART "commands". 
    bSectorCountReg  : Byte; // IDE sector count register 
    bSectorNumberReg : Byte; // IDE sector number register 
    bCylLowReg       : Byte; // IDE low order cylinder value 
    bCylHighReg      : Byte; // IDE high order cylinder value 
    bDriveHeadReg    : Byte; // IDE drive/head register 
    bCommandReg      : Byte; // Actual IDE command. 
    bReserved        : Byte; // reserved for future use.  Must be zero. 
  end; 
  IDEREGS   = TIDERegs; 
  PIDERegs  = ^TIDERegs; 

  TSendCmdInParams = packed record 
    cBufferSize  : DWORD;                // Buffer size in bytes 
    irDriveRegs  : TIDERegs;             // Structure with drive register values. 
    bDriveNumber : Byte;                 // Physical drive number to send command to (0,1,2,3). 
    bReserved    : Array[0..2] of Byte;  // Reserved for future expansion. 
    dwReserved   : Array[0..3] of DWORD; // For future use. 
    bBuffer      : Array[0..0] of Byte;  // Input buffer. 
  end; 
  SENDCMDINPARAMS   = TSendCmdInParams; 
  PSendCmdInParams  = ^TSendCmdInParams; 

  TIdSector = packed record 
    wGenConfig                 : Word; 
    wNumCyls                   : Word; 
    wReserved                  : Word; 
    wNumHeads                  : Word; 
    wBytesPerTrack             : Word; 
    wBytesPerSector            : Word; 
    wSectorsPerTrack           : Word; 
    wVendorUnique              : Array[0..2] of Word; 
    sSerialNumber              : Array[0..19] of Char; 
    wBufferType                : Word; 
    wBufferSize                : Word; 
    wECCSize                   : Word; 
    sFirmwareRev               : Array[0..7] of Char; 
    sModelNumber               : Array[0..39] of Char; 
    wMoreVendorUnique          : Word; 
    wDoubleWordIO              : Word; 
    wCapabilities              : Word; 
    wReserved1                 : Word; 
    wPIOTiming                 : Word; 
    wDMATiming                 : Word; 
    wBS                        : Word; 
    wNumCurrentCyls            : Word; 
    wNumCurrentHeads           : Word; 
    wNumCurrentSectorsPerTrack : Word; 
    ulCurrentSectorCapacity    : ULONG; 
    wMultSectorStuff           : Word; 
    ulTotalAddressableSectors  : ULONG; 
    wSingleWordDMA             : Word; 
    wMultiWordDMA              : Word; 
    bReserved                  : Array[0..127] of Byte; 
  end; 
  PIdSector = ^TIdSector; 

const 
  IDE_ID_FUNCTION = $EC; 
  IDENTIFY_BUFFER_SIZE       = 512; 
  DFP_RECEIVE_DRIVE_DATA        = $0007c088; 
  IOCTL_SCSI_MINIPORT           = $0004d008; 
  IOCTL_SCSI_MINIPORT_IDENTIFY  = $001b0501; 
  DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE; 
  BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize; 
  W9xBufferSize = IDENTIFY_BUFFER_SIZE+16; 
var 
  hDevice : THandle; 
  cbBytesReturned : DWORD; 
  s : String; 
  pInData : PSendCmdInParams; 
  pOutData : Pointer; // PSendCmdInParams; 
  Buffer : Array[0..BufferSize-1] of Byte; 
  srbControl : TSrbIoControl absolute Buffer; 

  procedure ChangeByteOrder( var Data; Size : Integer ); 
  var ptr : PChar; 
      i : Integer; 
      c : Char; 
  begin 
    ptr := @Data; 
    for i := 0 to (Size shr 1)-1 do 
    begin 
      c := ptr^; 
      ptr^ := (ptr+1)^; 
      (ptr+1)^ := c; 
      Inc(ptr,2); 
    end; 
  end; 

begin 
  Result := ´´; 
  FillChar(Buffer,BufferSize,#0); 
  if Win32Platform=VER_PLATFORM_WIN32_NT then 
    begin // Windows NT, Windows 2000 
      Str(ControllerNumber,s); 
      // Get SCSI port handle 
      hDevice := CreateFile( 
        PChar(´\\.\Scsi´+s+´:´), 
        GENERIC_READ or GENERIC_WRITE, 
        FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); 
      if hDevice=INVALID_HANDLE_VALUE then RaiseLastOSError; 
      try 
        srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL); 
        System.Move(´SCSIDISK´,srbControl.Signature,8); 
        srbControl.Timeout      := 2; 
        srbControl.Length       := DataSize; 
        srbControl.ControlCode  := IOCTL_SCSI_MINIPORT_IDENTIFY; 
        pInData := PSendCmdInParams(PChar(@Buffer)+SizeOf(SRB_IO_CONTROL)); 
        pOutData := pInData; 
        with pInData^ do 
        begin 
          cBufferSize  := IDENTIFY_BUFFER_SIZE; 
          bDriveNumber := DriveNumber; 
          with irDriveRegs do 
          begin 
            bFeaturesReg     := 0; 
            bSectorCountReg  := 1; 
            bSectorNumberReg := 1; 
            bCylLowReg       := 0; 
            bCylHighReg      := 0; 
            bDriveHeadReg    := $A0 or ((DriveNumber and 1) shl 4); 
            bCommandReg      := IDE_ID_FUNCTION; 
          end; 
        end; 
        if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ) then RaiseLastOSError; 
      finally 
        CloseHandle(hDevice); 
      end; 
    end 
  else 
    begin // Windows 95 OSR2, Windows 98 
      hDevice := CreateFile( ´\\.\SMARTVSD´, 0, 0, nil, CREATE_NEW, 0, 0 ); 
      if hDevice=INVALID_HANDLE_VALUE then RaiseLastOSError; 
      try 
        pInData := PSendCmdInParams(@Buffer); 
        pOutData := PChar(@pInData^.bBuffer); 
        with pInData^ do 
        begin 
          cBufferSize  := IDENTIFY_BUFFER_SIZE; 
          bDriveNumber := DriveNumber; 
          with irDriveRegs do 
          begin 
            bFeaturesReg     := 0; 
            bSectorCountReg  := 1; 
            bSectorNumberReg := 1; 
            bCylLowReg       := 0; 
            bCylHighReg      := 0; 
            bDriveHeadReg    := $A0 or ((DriveNumber and 1) shl 4); 
            bCommandReg      := IDE_ID_FUNCTION; 
          end; 
        end; 
        if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, pInData, SizeOf(TSendCmdInParams)-1, pOutData, W9xBufferSize, cbBytesReturned, nil ) then RaiseLastOSError; 
      finally 
        CloseHandle(hDevice); 
      end; 
    end; 

  with PIdSector(PChar(pOutData)+16)^ do 
  begin 
    ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber)); 
    SetString(Result,sSerialNumber,SizeOf(sSerialNumber)); 
  end; 

  Result := Trim(Result); 

end; 

//------------------------------------------------------------- 
function GetIdeSN : String; 
var 
  iController, iDrive, maxController : Integer; 
begin 
  Result := ´´; 
  maxController := 15; 
  if Win32Platform<>VER_PLATFORM_WIN32_NT then maxController := 0; 
  for iController := 0 to maxController do 
  begin 
    for iDrive := 0 to 4 do 
    begin 
      try 
        Result := GetIdeDiskSerialNumber(iController,iDrive); 
        if Result<>´´ then Exit; 
      except 
        // ignore exceptions 
      end; 
    end; 
  end; 
end; 

end.

pesquisa aqui no forum que existe várias dicas sobre como usar essa unit e como proteger o seu software :wink:


GOSTEI 0
Xadriano

Xadriano

18/04/2006

eu tendo o serial e ip, como faço para bloquear?


GOSTEI 0
Paullsoftware

Paullsoftware

18/04/2006

Você armazena essas informações em algum lugar, registro ou arquivo, de preferência criptografadas e toda vez que seu sistema abrir vc compara as informações gravadas com as atuais do computador. :wink:


GOSTEI 0
Xadriano

Xadriano

18/04/2006

eu usei um programa que descobri o serial e o ip da maquina, eu queria era um codigo que so execute o programa só se se essas informações baterem com a maquina.

adriano


GOSTEI 0
Xadriano

Xadriano

18/04/2006

eu tenho um programa que descobrir o serial e o ip da maquina, qual codigo uso para o programa so abri nesta maquina?

adriano.


GOSTEI 0
M@gnun

M@gnun

18/04/2006

blz paullsoftware, eu uso o idesn tmb... mas tem um porem ...
Guardo as informaçoes no registro e em alguns arquivos, certo? mas e se o usuario formatar a maquina ? Lá se vão o registro e os arquivos...
Eu coloco as rotinas para, na primeira execução, ele criar esses arquivos, e nas outras ele só os verifica. O critério que uso é a existencia ou não desses arquvos. Mas sempre que ele formatar a maquina são criados novos arquivos, ou se ele instalar em outra maquina tambem serao criados ... :x :x
Tem alguma dica a me dar nesse caso?
Valeu ...


GOSTEI 0
Paullsoftware

Paullsoftware

18/04/2006

eu preparei um exemplo básico de como vc deve proceder, porém melhore ele para uma melhor segurança do seu sistema...
http://us.f13.yahoofs.com/bc/4452a716_9649/bc/Delphi/Exemplo+(Serial+do+HD).zip?bf4uKWEBCKUveUom
espero ter ajudado... qq coisa estamos ai :wink:


GOSTEI 0
Paullsoftware

Paullsoftware

18/04/2006

[quote:f97f18a9d7=´m@gnun´]
blz paullsoftware, eu uso o idesn tmb... mas tem um porem ... Guardo as informaçoes no registro e em alguns arquivos, certo? mas e se o usuario formatar a maquina ? Lá se vão o registro e os arquivos... Eu coloco as rotinas para, na primeira execução, ele criar esses arquivos, e nas outras ele só os verifica. O critério que uso é a existencia ou não desses arquvos. Mas sempre que ele formatar a maquina são criados novos arquivos, ou se ele instalar em outra maquina tambem serao criados ... Tem alguma dica a me dar nesse caso? Valeu ...
[/quote:f97f18a9d7]

Eu sempre guardo os arquivos criptografados em arquivos na mesma pasta do sistema, então se ele formatar deve fazer um backup do sistema antes, senão vai tudo pro espaço... outra coisa, é que quando um cliente meu vai formatar a máquina eu sempre peço para ele me avisar antes, pois, não me resposabilizo por perda dos dados do meu sistema...

Quando as informações que vc grava no registro, eu parei de fazer isso justamente devido a esse problema, porém, estou fazendo agora de outra forma...
sempre que meu sistema inicia verifico a existência das chaves de registro, caso elas não existam eu crio-as com informações contidas nos arquivos criptografados... o segredo é sempre comparar os dados dos arquivos/chaves do registro com o serial do HD, hoje eu faço mais ou menos assim:
Pego o serial e converto em usando componentes de criptografia SHA1 da [b:f97f18a9d7]TurboPower[/b:f97f18a9d7] que me proporciona uma maior segurança, então como estava dizendo. Pego o serial o HD converto ele com esse componente fica mais ou menos assim:
Serial Original: 0891J1JXB44796
Criptografado: 0859A1B8D84043EC76DD253E401E62 (divido em pelo menos 4 partes em arquivos diferentes)
e guardo tb ela completa em um outro lugar vamos supor que seja no registro, só que de forma invertida para dificultar uma possível quebra da segurança...
então quando meu sistema abre eu tenho um atualizador que enquanto verificar a versão do exe uma thread se encarrega de ler o registro do sistema, ou seja, os arquivos com as informações necessárias...

espeto ter ajudado :wink:


GOSTEI 0
M@gnun

M@gnun

18/04/2006

valeu, ajudou bastante ... só falta uma duvida...
´quando´ vc pega o serial do hd?

o que eu nao estou conseguindo sacar é como vc disse:

´´´
sempre que meu sistema inicia verifico a existência das chaves de registro, caso elas não existam eu crio-as com informações contidas nos arquivos criptografados...

´´´
pelo que entendi vc pega o serial antes, isso? como email? viagei?


GOSTEI 0
Xadriano

Xadriano

18/04/2006

cara esse link nao funciona, se vc puder mandar para meu email, ficaria muito grato,
adrifonpereira@bol.com.br

Adriano.


GOSTEI 0
Leitorbinario

Leitorbinario

18/04/2006

Procura no google, tem DLLs que pegam o serial do HD pra vc.


GOSTEI 0
Paullsoftware

Paullsoftware

18/04/2006

[quote:88d3570215=´m@gnun´]
valeu, ajudou bastante ... só falta uma duvida... ´quando´ vc pega o serial do hd? o que eu nao estou conseguindo sacar é como vc disse: ´´´ sempre que meu sistema inicia verifico a existência das chaves de registro, caso elas não existam eu crio-as com informações contidas nos arquivos criptografados... ´´´ pelo que entendi vc pega o serial antes, isso? como email? viagei?
[/quote:88d3570215]
Quando o meu sistema abre pela primeira vez ele fica pedindo um espécie de registro (isso também ocorre quando o cliente tenta copiar o sistema para um outro micro), então esse registro é solicitado pq eu já fiz uma verificação da exitência das informações necessárias para inicialização do sistema (Comparação do Serial do Arquivo com o Serial do HD) então faço uma comparação básica
Se Serial_Registro = Serial_HD Então
//Continua abertura do programa
senão
//Mostrar tela pedindo Registro
:arrow: [b:88d3570215]Espero que tenha endentido[/b:88d3570215] :wink:

op´s...
foi mal galera, eu havia colocado no meu Porta-Arquivos... estou hospedando no site aqui da empresa, mais não sei por quanto tempo posso deixá-lo lá...
:arrow: [size=18:88d3570215][color=blue:88d3570215]http://safpe.com.br/externo/Exemplo+(Serial+do+HD).zip[/color:88d3570215][/size:88d3570215] :wink:

Image de aviso no caso da não existência dos dados de registro:
Tela para registro do sistema:

[b:88d3570215][size=18:88d3570215][color=red:88d3570215]Executável do Sistema, é onde eu pego qual programa está sendo registrado no caso de existir mais de um sistema instalado na mesma máquina[/color:88d3570215][/size:88d3570215][/b:88d3570215]


GOSTEI 0
Paullsoftware

Paullsoftware

18/04/2006

[quote:3590a0185c=´m@gnun´]
valeu, ajudou bastante ... só falta uma duvida... ´quando´ vc pega o serial do hd? o que eu nao estou conseguindo sacar é como vc disse: ´´´ sempre que meu sistema inicia verifico a existência das chaves de registro, caso elas não existam eu crio-as com informações contidas nos arquivos criptografados... ´´´ pelo que entendi vc pega o serial antes, isso? como email? viagei?
[/quote:3590a0185c]
Quando o meu sistema abre pela primeira vez ele fica pedindo um espécie de registro (isso também ocorre quando o cliente tenta copiar o sistema para um outro micro), então esse registro é solicitado pq eu já fiz uma verificação da exitência das informações necessárias para inicialização do sistema (Comparação do Serial do Arquivo com o Serial do HD) então faço uma comparação básica
Se Serial_Registro = Serial_HD Então
//Continua abertura do programa
senão
//Mostrar tela pedindo Registro
:arrow: [b:3590a0185c]Espero que tenha endentido[/b:3590a0185c] :wink:

op´s...
foi mal galera, eu havia colocado no meu Porta-Arquivos... estou hospedando no site aqui da empresa, mais não sei por quanto tempo posso deixá-lo lá...
:arrow: [size=18:3590a0185c][color=blue:3590a0185c]http://safpe.com.br/externo/Exemplo+(Serial+do+HD).zip[/color:3590a0185c][/size:3590a0185c] :wink:

Image de aviso no caso da não existência dos dados de registro:
Tela para registro do sistema:

[b:3590a0185c][size=18:3590a0185c][color=red:3590a0185c]Executável do Sistema, é onde eu pego qual programa está sendo registrado no caso de existir mais de um sistema instalado na mesma máquina[/color:3590a0185c][/size:3590a0185c][/b:3590a0185c]


GOSTEI 0
M@gnun

M@gnun

18/04/2006

eh aqui que eu me perco:

´ Se Serial_Registro = Serial_HD Então ´
o Serial_HD vc pega com GetIdeSN, mas o Serial_Registro vc jah tem correto?

a questao é com o que vc compara o serial do hd vc envia algo por email?

olha aqui eu fiz +- assim veja se entende :

eu mando um pequeno exe para o usuario, quando ele abre o prog, o mesmo pega alguns dados do pc pra enrolar , e pega tambem o serial.
eu do um ´migué´ nos dados pra nao ficar na cara né ... se o serial fosse
123456789 eu coloco [b:9ed6611f2e]1[/b:9ed6611f2e]kj[b:9ed6611f2e]2[/b:9ed6611f2e]098[b:9ed6611f2e]3[/]lksd ...

ai o usuario tem q me mandar esse arquivo

depois eu mando o sistema pra ele e mando o mesmo arquivo, ´criptografado´ dinovo ai ele compara o numero q ele me mandou com o serial atual com getidesn

é por aí ??? valeu pela atenção

ps: desculpa por me apossar do topico xadriano ok ...[/b:9ed6611f2e]


GOSTEI 0
Paullsoftware

Paullsoftware

18/04/2006

[quote:b358ade814=´m@gnun´]eh aqui que eu me perco:

´ Se Serial_Registro = Serial_HD Então ´
o Serial_HD vc pega com GetIdeSN, mas o Serial_Registro vc jah tem correto?

a questao é com o que vc compara o serial do hd vc envia algo por email?

olha aqui eu fiz +- assim veja se entende :

eu mando um pequeno exe para o usuario, quando ele abre o prog, o mesmo pega alguns dados do pc pra enrolar , e pega tambem o serial.
eu do um ´migué´ nos dados pra nao ficar na cara né ... se o serial fosse
123456789 eu coloco [b:b358ade814]1[/b:b358ade814]kj[b:b358ade814]2[/b:b358ade814]098[b:b358ade814]3[/]lksd ...

ai o usuario tem q me mandar esse arquivo

depois eu mando o sistema pra ele e mando o mesmo arquivo, ´criptografado´ dinovo ai ele compara o numero q ele me mandou com o serial atual com getidesn

é por aí ??? valeu pela atenção

ps: desculpa por me apossar do topico xadriano ok ...[/b:b358ade814][/quote:b358ade814]

da forma que passo não preciso que me seja enviado nada por email, apenas por telefone....
como eu disse quando o sistema é aberto se não existir registro ainda ele cria automaticamente um e fica esperando por uma chave de ativação (como muitos softwares fazem hoje), porém, essa ativação somente é feita quando o cliente entra em contato comigo ou quando acesso o micro dele remotamente (com o VNC por exemplo) então após ele me passar esse código que é justamente o serial do HD eu mando um outro pra ele que vai criptografado e quando ele for inserir eu vou comparar com o atual, para evitar que seja burlado com facilidade, ajo da seguinte maneira:
Serial Mostrado ao cliente:
[b:b358ade814]8453B32E[/b:b358ade814] (Esse seria o serial do HD)
então eu passo esse pra ele:
[b:b358ade814]2900-A6BC-31-BF61-045B[/b:b358ade814]
Observe que o código que eu paço possui separação faço isso pois não vai na ordem correta quando meu sistema receve esse código ele quebra a string em partes e vai juntando tudo tipo assim:
[b:b358ade814]31BF612900A6BC045B[/b:b358ade814]
depois de feito isso, eu descriptografo e comparo o resultado com o serial do hd, ou seja, o resultado tem que dá igual ao serial do HD... dessa forma fica quase, eu disse quase impossível burlar a segurança do meu sistema :wink:


GOSTEI 0
M@gnun

M@gnun

18/04/2006

aff saquei ... demoro mais saquei ... hehehe valeu cara ... acho que a unica diferença eh a forma q estou entrando em contato com o cliente ...

valeu pela atenção paullsoftware ...


GOSTEI 0
Paullsoftware

Paullsoftware

18/04/2006

[quote:e6c299ae50=´m@gnun´]aff saquei ... demoro mais saquei ... hehehe valeu cara ... acho que a unica diferença eh a forma q estou entrando em contato com o cliente ...

valeu pela atenção paullsoftware ...[/quote:e6c299ae50]

Ok :wink:
qualquer coisa estamos ai... :lol: 8)


GOSTEI 0
POSTAR