Fórum executar um programa so para um HD #319418

18/04/2006

0

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

Responder

Posts

18/04/2006

Paullsoftware

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:


Responder

Gostei + 0

27/04/2006

Xadriano

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


Responder

Gostei + 0

27/04/2006

Paullsoftware

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:


Responder

Gostei + 0

03/05/2006

Xadriano

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


Responder

Gostei + 0

03/05/2006

Xadriano

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

adriano.


Responder

Gostei + 0

03/05/2006

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 ... :x :x
Tem alguma dica a me dar nesse caso?
Valeu ...


Responder

Gostei + 0

03/05/2006

Paullsoftware

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:


Responder

Gostei + 0

03/05/2006

Paullsoftware

[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:


Responder

Gostei + 0

03/05/2006

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?


Responder

Gostei + 0

03/05/2006

Xadriano

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

Adriano.


Responder

Gostei + 0

03/05/2006

Leitorbinario

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


Responder

Gostei + 0

03/05/2006

Paullsoftware

[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:
[img:88d3570215]http://img302.imageshack.us/img302/1867/imagem14zq.jpg[/img:88d3570215]
Tela para registro do sistema:
[img:88d3570215]http://img242.imageshack.us/img242/3012/imagem28iw.jpg[/img:88d3570215]

[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]


Responder

Gostei + 0

03/05/2006

Paullsoftware

[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:
[img:3590a0185c]http://img302.imageshack.us/img302/1867/imagem14zq.jpg[/img:3590a0185c]
Tela para registro do sistema:
[img:3590a0185c]http://img242.imageshack.us/img242/3012/imagem28iw.jpg[/img:3590a0185c]

[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]


Responder

Gostei + 0

03/05/2006

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: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]


Responder

Gostei + 0

04/05/2006

Paullsoftware

[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:


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar