PROTECCIÓN POR NÚMERO DE DÍAS TRANSCURRIDOS

1º Dentro de su propiedad Options activamos las opciones poAutoInit, poCheckSystemTime y poPasswordOnce:


3º En su evento OnDayTrial podemos el código que controla el paso de cada día:
procedure TFPrincipal.mxProtectorDayTrial(Sender: TObject;
DaysRemained: Integer);
begin
if DaysRemained = 1 then
ENumDias.Caption := 'Sólo te queda un día'
else
ENumDias.Caption := Format('Te quedan %d días.', [DaysRemained]);
BReiniciar.Enabled := False;
end;
4º En su evento OnExpiration va el código cuando ya no quedan más días:
procedure TFPrincipal.mxProtectorExpiration(Sender: TObject);
begin
ENumDias.Caption := 'Le quedan 0 días. Su licencia ha expirado';
BReiniciar.Enabled := True;
end;
5º Y en su evento OnInvalidSystemTime podemos el mensaje que muestra que el usuario ha intentado mover hacia atrás la fecha de Windows para estirar la licencia:
procedure TFPrincipal.mxProtectorInvalidSystemTime(Sender: TObject);
begin
Application.MessageBox('La hora de tu sistema no es correcta.',
'Su licencia ha expirado', MB_ICONSTOP);
end;
6º Al pulsar el botón Reiniciar volvemos a darle otros 30 días:
procedure TFPrincipal.BReiniciarClick(Sender: TObject);
begin
mxProtector.Reset;
end;
Y al igual que vimos en el ejemplo anterior de control por número de ejecuciones, podemos implementar los métodos OnGetString, OnPutString, OnGetBoolean y OnPutBoolean para que guarde el estado en la clave de registro que queramos o en un archivo INI, binario, etc. Esto es válido para todos los métodos de protección que hemos visto así como los siguientes que voy a comentar.
PROTECCIÓN POR REGISTRO DE NÚMERO DE SERIE
Esta es otra de las protecciones que más se suelen utilizar para distribuir programas con licencia Shareware. Según el nombre del usuario, un ID que haga único al PC y un número de serie podemos proteger cada licencia para que sólo se ejecute en un equipo.
Lo primero que vamos a hacer es el programa que va a registrar el usuario según un número de serie que nos dará un generador de claves que vamos a crear más adelante.
El programa va a tener este formulario:

1º En la propiedad Options debemos activar las opciones poAutoInit, poCheckSystemTime, poPasswordOnce y poUseHardwareKey:

2º Activar en la propiedad ProtectionTypes el valor stRegister:

3º En el evento OnGetSerialNumber le pasamos al componente el nombre del usuario y el número de serie generado:
procedure TFPrincipal.mxProtectorGetSerialNumber(Sender: TObject;
var UserName, SerialNumber: string);
begin
UserName := Usuario.Text;
SerialNumber := NumSerie.Text;
end;
4º En el evento OnInvalidSerialNumber mostramos el mensaje de error en caso de que sea incorrecto:
procedure TFPrincipal.mxProtectorInvalidSerialNumber(Sender: TObject);
begin
Application.MessageBox('Nº de serie incorrecto',
'Consulte con el proveedor', MB_ICONSTOP);
end;
5º En el evento OnUnknowHardware debemos mostrar un mensaje en caso de que no podamos obtener la ID del PC:
procedure TFPrincipal.mxProtectorUnknownHardware(Sender: TObject);
begin
Application.MessageBox('El hardware de este equipo es incompatible con este software.',
'Consulte con el proveedor', MB_ICONSTOP);
end;
6º Al pulsar el botón Registrar activamos el producto:
procedure TFPrincipal.BRegistrarClick(Sender: TObject);
begin
mxProtector.Registration;
ComprobarRegistro;
if mxProtector.IsRegistered Then
begin
Application.MessageBox('Gracias por comprar el producto',
'Registro realizado', MB_ICONINFORMATION);
end;
end;
El procedimiento de comprobar el registro es el siguiente:
procedure TFPrincipal.ComprobarRegistro;
begin
if mxProtector.IsRegistered then
begin
Caption := 'Programa registrado';
BRegistrar.Enabled := False;
BDesinstalar.Enabled := True;
end
else
begin
Caption := 'Programa no registrado';
BRegistrar.Enabled := True;
BDesinstalar.Enabled := False;
end;
end;
Activamos o desactivamos los botones de registrar o desinstalar así como el título del formulario según este registrado el programa o no.
7º A pulsar el botón Desinstalar desinstalamos la clave de registro:
procedure TFPrincipal.BDesinstalarClick(Sender: TObject);
begin
mxProtector.Reset;
Application.MessageBox('Ya puede desinstalar del producto',
'Registro cancelado', MB_ICONINFORMATION);
ComprobarRegistro;
end;
8º Por último, tenemos que comprobar en el evento OnCreate del formulario si hemos registrado el programa y obtener ID del PC:
procedure TFPrincipal.FormCreate(Sender: TObject);
begin
ID.Text := mxProtector.GetHardwareID;
ComprobarRegistro;
end;
CREANDO EL GENERADOR DE CLAVES
Ahora vamos a hacer un programa que genere números de serie según el nombre del usuario y un ID único del PC (número de serie del disco duro, de la tarjeta de Windows, etc.).
El programa va a tener este formulario:

1º En la propiedad Options debemos activar las opciones poAutoInit, poCheckSystemTime, poPasswordOnce y poUseHardwareKey:

2º Activar en la propiedad ProtectionTypes el valor stRegister:

procedure TFPrincipal.mxProtectorGetHardwareID(Sender: TObject;
var HardwareID: string);
begin
HardwareID := ID.Text;
end;
4º El botón Generar le pedimos al componente que nos genere un número de clave según el usuario y el ID del PC:
procedure TFPrincipal.BGenerarClick(Sender: TObject);
begin
NumSerie.Text := mxProtector.GenerateSerialNumber(Usuario.Text);
end;
Vamos a probar ambos programas. Abrimos primero la aplicación:



Aunque parezca algo complicado, si tuviésemos que hacer todo esto a mano habría que escribir mucho más código. En el próximo artículo seguiremos viendo otros modos de protección.
Pruebas realizadas en RAD Studio 2007.