sexta-feira, 7 de janeiro de 2011

Protegendo seu sistema contra cópias ilegais


Apresentarei aqui uma técnica que utiliza o serial lógico de uma unidade de disco do computador, que apesar de poder ser modificada após uma formatação, por exemplo, já é um bom começo!
Bom, vamos lá. Tendo em vista a preocupação dos colegas com pirataria e cópias ilegais, desenvolvi um código que verifica o número de série de um determinado dispositivo conectado ao computador e faz uma comparação.
Abaixo há uma função que pega o número de serie do CD que esta na respectiva unidade. O sistema só irá rodar se aquele determinado CD estiver no drive. Tanto faz se vc colocar o CD na unidade D, E ou F, a função irá verificar cada unidade a procura do número de serie correto e caso não o ache retorna false. Apesar da idéia ser criada com base em um CD, pode ser adaptada para o uso com HD's.
Para testar o código, você precisará acrescenta rum label e um button em seu form. Em seguida, implementar a funçãotbVolSerial, a procedure VerificalSerialH e o evento onClick do botão, conforme abaixo:
// função que pega o numero serial do dispositivo 
function Tform2.tbVolSerial(const Drive: Char; Path: PChar): Cardinal; 
var 
  MaxCompLen, FileSysFlag, PrevErrorMode: Cardinal;
begin
  if Path = nil then 
    Path := PChar(Drive + ':');
  PrevErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    if not GetVolumeInformation(PChar(Path), nil, 0, @Result, MaxCompLen,
      FileSysFlag, nil, 0) then 
      Result := 0;
  finally 
    SetErrorMode(PrevErrorMode);
  end; 
end;
 
//Esta função faz a varredura em todos os dispositivos a
//procura do serial valido. retorna true ou false. 
procedure Tform2.VerificaSerialH(Driver: char); 
const 
  drive: array[0..25] of char = (
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
    'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
    'r', 's', 't', 'u', 'w', 'v', 'x', 'y', 'z'); 
var 
  j: integer;
  ini: TIniFile;
  SerialHardware, AdquireSerial: string;
  erro: Boolean;
begin
  if not FileExists('.serial.ini') then
  begin 
    AdquireSerial := IntToStr(tbVolSerial(Driver, nil));
    ini := TIniFile.Create('.serial.ini');
    ini.WriteString('serial', 'Hardware', AdquireSerial);
    ini.Free;
  end
  else
  begin 
    ini := TIniFile.Create('.serial.ini');
    SerialHardware := ini.ReadString('serial', 'Hardware', '');
    ini.free;
  end;
 
  for j := 0 to 25 do
  begin
    if (IntToStr(tbVolSerial(Drive[j], nil))) = SerialHardware then
    begin 
      Erro := false;
      Label1.Caption := 'Original';
      break;
    end
    else 
      Erro := true;
  end;
 
  if Erro then    Label1.Caption := 'Pirata' 
end;
 
procedure Tform2.Button1Click(Sender: TObject); 
begin 
  Label1.Caption := 'Este sistema é...';
  Label1.Repaint;
  VerificaSerialH('G'); 
end;

Nenhum comentário:

Postar um comentário