Fórum executar um programa so para um HD #319418
18/04/2006
0
grato,
Adriano.
Xadriano
Curtir tópico
+ 0Posts
18/04/2006
Paullsoftware
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
27/04/2006
Xadriano
Gostei + 0
27/04/2006
Paullsoftware
Gostei + 0
03/05/2006
Xadriano
adriano
Gostei + 0
03/05/2006
Xadriano
adriano.
Gostei + 0
03/05/2006
M@gnun
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
03/05/2006
Paullsoftware
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
03/05/2006
Paullsoftware
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
03/05/2006
M@gnun
´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
03/05/2006
Xadriano
adrifonpereira@bol.com.br
Adriano.
Gostei + 0
03/05/2006
Leitorbinario
Gostei + 0
03/05/2006
Paullsoftware
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]
Gostei + 0
03/05/2006
Paullsoftware
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]
Gostei + 0
03/05/2006
M@gnun
´ 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
04/05/2006
Paullsoftware
´ 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
Clique aqui para fazer login e interagir na Comunidade :)