Protect for Delphi
Protect for Delphi Component, by Reinaldo Yañez Arrey.
Copyright © 2000 Reinaldo Yañez Arrey.
Todos los derechos reservados.
rya@labs.df.uba.ar
Version 1.0 - Build 4. 4/2000

Protect for delphi es un componente Delphi nativo que permite proteger programas contra piratería. Forma parte de un sistema de protección y registración que permite validar en forma remota las copias de un programa ejecutable y administrar el proceso de registración. Como características distintivas Prot4Delphi provee máxima seguridad, no esconde ningún tipo de información en registry y cuenta con la posibilidad de activar diversas capacidades del programa protegido en registraciones sucesivas, cada una de ellas con una fecha de caducidad determinada. Esto facilita al desarrollador la posibilidad de habilitar gradualmente ciertas opciones de su software, a medida que el usuario lo requiera. Permite habilitar/deshabilitar hasta 32 opciones independientemente, permitiendo la creacion de niveles de seguridad de manera muy sencilla. El sistema protege ejecutables diseñados para correr bajo los sistemas operativos Windows 95 y Windows 98, y es muy simple de utilizar. No hace falta distribuir archivos del tipo .vxd, el .vxd esta codificado internamente. El bug que ocasionaba el crash de la aplicación bajo algunas configuraciones se ha eliminado. Permite hacer multiples backups del programa protegido que corren solo en la computadora donde se registro el ejecutable. El usuario no tiene que pedir otra clave si reformate su disco rigido y reinstala el programa protegido !!! Nuevo ejemplo que demuestra el uso de niveles de seguridad. Nuevo!! Versiones incluidas para Delphi 3, Delphi 4 and Delphi 5 en este paquete, con instrucciones de instalación verdaderamente simples. Documentación completa en dos lenguajes: Inglés y Castellano. Compre en linea utilizando un formulario privado y seguro !!

La siguiente terminologia se utilizará a lo largo del documento:

- Desarrollador: la persona/institución que diseñó la aplicación a proteger.
- Usuario: la persona/institución que utiliza el programa protegido.
- Código de registro: Es la huella digital que el programa protegido genera automáticamente y mediante la cual el Desarrollador puede validar a un usuario. (Es conocido por ambas partes y generado automáticamente por el programa protegido en la primera ejecución)
- Clave de Registro: Es la clave que solo el desarrollador puede generar y que destraba el programa protegido. (Es lo que desea obtener el usuario para registrar su copia del programa) (Es conocida por ambas partes cuando el usuario esta registrado, pero solo el desarrollador puede generarla.)Clave de aplicación: Es la clave con la que se cifra el código de registro. Sirve para que el código de registro sea solo legible para el desarrollador. Se genera automaticamente al poner el componente Prot4Delphi en un form. (Vea más adelante).

# Sección rápida:

  Esta seccion lo guía paso a paso para una puesta en marcha rápida. Si usted desea proteger su programa contra copia y luego leer la documentación del sistema, esta sección podrá ser de ayuda. Lea cada una de las preguntas en orden y realice los pasos indicados.

Que requiero para instalar el componente ?

Sistema operativo Windows 95 o Windows 98 instalado.
4 Mb de espacio disponible en el disco rígido.
Delphi 3 o Delphi 4 o Delphi 5 instalado..

Como instalar el componente ?

1) Descomprimir el paquete de instalación (Prot4Dph.zip) a algun directorio,
por ejemplo a C:\Protect4Delphi\

2) Instalar el componente en la paleta.
Delphi 3:
Desde Delphi IDE,
menu -> Components -> Install Packages -> 'Add'
abrir \Bin\Delphi3\Protect4DelphiV30Demo.dpl
(o bien \Bin\Delphi3\Protect4DelphiV30Full.dpl)
El componente deberia ir a la paleta de componentes.
Delphi 4:
Desde Delphi IDE,
menu -> Components -> Install Packages -> 'Add'
abrir \Bin\Delphi4\Protect4DelphiV40Demo.bpl
(o bien \Bin\Delphi4\Protect4DelphiV40Full.bpl)
El componente deberia ir a la paleta de componentes.

Delphi 5:
Desde Delphi IDE,
menu -> Components -> Install Packages -> 'Add'
abrir \Bin\Delphi5\Protect4DelphiV50Demo.bpl
(o bien \Bin\Delphi5\Protect4DelphiV50Full.bpl)
El componente deberia ir a la paleta de componentes.

3) Agregar el path de instalacion al "Library Path" de Delphi.
Delphi 3:
Desde Delphi IDE ir a: Tools->Environment options->Library.
Agregar a mano el directorio de instalacion al path. Presionar el boton 'OK'.

Delphi 4 & Delphi 5:
Desde Delphi IDE hacer: Tools->Environment options->Library.
Presionar el boton marcado con (...) del item "Library Path:"
Escribir el path completo de instalacion y presionar el boton 'Add'.

Contenido del paquete de instalación:

\Bin
KeyGenerator.exe (Generador de claves)
\Bin\Delphi3
Protect4DelphiV30Demo.dpk
Protect4DelphiV30Demo.dpl
Protect4DelphiV30Demo.dcp
Protect4DelphiV30Demo.dcu
Protect4DelphiV30Demo.res
Protect4DelphiV30Demo.dof
\Bin\Delphi4
Protect4DelphiV40Demo.dpk
Protect4DelphiV40Demo.bpl
Protect4DelphiV40Demo.dcp
Protect4DelphiV40Demo.dcu
Protect4DelphiV40Demo.res
Protect4DelphiV40Demo.dof
\Bin\Delphi5
Protect4DelphiV50Demo.dpk
Protect4DelphiV50Demo.bpl
Protect4DelphiV50Demo.dcp
Protect4DelphiV50Demo.dcu
Protect4DelphiV50Demo.res
Protect4DelphiV50Demo.dof

- all versions include -
UProt4DelphiDefs.dcu
Prot4Delphi2.dcu
Prot4Delphi3.dcu
Prot4Delphi4.dcu
Prot4Delphi5.dcu
Prot4Delphi6.dcu
Prot4Delphi7.dcu
Prot4Delphi8Cipher.dcu
Prot4Delphi8KeySchedule.dcu
Prot4Delphi8SBoxes.dcu
Prot4Delphi8StaticTable.dcu
UProt4Delphi.dcu
UProt4DelphiDefs.dcu
UDefaultRegistration.pas
UDefaultRegistration.dfm

\Doc
Protect for Delphi (English).htm (Hipertexto. Documentacion, Inglés)
Protect for Delphi (Spanish).htm (Hipertexto. Documentacion, Español)
\Demos\Standard
Main.pas
Main.dfm
UDefaultRegistration.pas
UDefaultRegistration.dfm
Simple.dpr
Simple.res
\Demos\Custom
Main.pas
Main.dfm
Custom.dpr
Custom.res
MyID0010857.uid
\Demos\UnlockLevels
Main.pas
Main.dfm
Readme.txt
UnlockLevelsDemo.dpr
UnlockLevelsDemo.dof
UnlockLevelsDemo.cfg
UnlockLevelsDemo.res

Como proteger un ejecutable en pocos pasos?

Es muy sencillo, bastan los 3 pasos siguientes :

- Poner un componente del tipo Prot4Delphi en algun form de la aplicación a proteger: Para ello hay que ir a la paleta de componentes y seleccionar con el mouse la hoja Prot4Delphi. En esa hoja aparece el icono del componente que luce así : . Seleccionarlo con un click del boton izquierdo y luego hacer click nuevamente sobre el form elegido. El componente debe aparecer en el form. (Al poner el componente Prot4Delphi en un form, (lo que se ha hecho en este paso) se genera automaticamente una clave de aplicacion que depende del nombre del proyecto. Esta clave de aplicación puede ser modificada en forma arbitraria pero debería ser diferente para cada proyecto. La existencia de esta clave de aplicación es crucial para la seguridad del sistema de protección y no debe ser revelada a ningun usuario. Puede setear una clave de aplicación manualmente, seteando la property ApplicationKey. Claves de aplicacion validas son por ejemplo:

MiProyecto7345h
OtroProyectoMio
AnotherValidAppKey
UnSoftwarePara247Perez

(Más adelante puede ver informacion adicional acerca de este punto)

- Insertar el siguiente código en la unit en pascal:

agregar debajo de implementation:
uses UDefaultRegistration;

agregar en el evento FormCreate:
TRegistrationForm.CheckAndShowIfNotReg(Prot4Delphi1);

El codigo debería lucir parecido a:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, UProt4Delphi;

type
TForm1 = class(TForm)
Prot4Delphi1: TProt4Delphi;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;

implementation
{$R *.DFM}

uses UDefaultRegistration;

procedure TForm1.FormCreate(Sender: TObject);
begin
TRegistrationForm.CheckAndShowIfNotReg(Prot4Delphi1);
if not Prot4Delphi1.IsRegistered then Application.Terminate;
end;
end.

- Recompilar y ejecutar el programa. (Presionar la tecla F9 en Delphi)

Como se distribuye el programa protegido ?

Una vez protegido, el programa está listo para funcionar. La compilación genera un ejecutable que contiene internamente el código que se encarga de la protección. No hace falta distribuir ningún otro archivo adicional, que sea relativo a la protección. (Si previo a la protección usted debía distribuir archivos adicionales, además del ejecutable, por supuesto debe seguir distribuyéndolos.)

Que ve el usuario al correr el programa protegido ?

Al ejecutar el programa protegido, aparecerá un cuadro de diálogo que le indica al usuario que está ejecutando una versión no registrada del programa, y muestra el código de registro. (Se indica el funcionamiento del programa protegido si se han completado los pasos anteriores. Otros comportamientos son posibles y se describen luego.)

El cuadro de dialogo tiene el siguiente aspecto:
(El resaltado en colores es solo indicativo.)

Figura 1

La flecha y recuadro violeta en la parte superior indican el código de registro.
Este código es el que el usuario debe enviar al desarrollador para obtener una clave de registro que 'destrabe' el programa total o parcialmente.

Como genera el desarrollador la clave de registro ?

Una vez obtenido el código de registro del usuario que se quiere validar, el desarrollador ejecuta el programa generador de claves que se distribuye con el paquete de protección como un utilitario separado. (KeyGenerator.exe)

Este generador de claves luce así:
(El resaltado en colores es solo indicativo.)

Figura 2

El generador de claves requiere

- la clave de aplicación (señalada con trazo azul) y 2) el código de registro que envió el usuario (señalado con trazo verde). La clave de aplicación, puede consultarse del siguiente modo: En Delphi abra el proyecto del programa protegido.Abra el form donde está el componente Prot4Delphi. Seleccione el componente Prot4Delphi con un click del mouse.Oprima la tecla F11 para ver el object inspector.La property ApplicationKey del componente, contiene el texto exacto de la clave de aplicación. Es MUY importante ingresar EXACTAMENTE esta clave.
- El código de registro es el que envió el usuario. Es MUY importante ingresar EXACTAMENTE el código de registro. Como ayuda para el ingreso del código de registro, el generador de claves no acepta aquellos caracteres que no son válidos. Nota: El número cero no forma parte de ningún código de registro válido, si el usuario envía al desarrollador un código que contiene ceros, debe reemplazarse cada uno de ellos por la letra O. Una vez que se ingresó el código de registro, el generador de claves muestra la fecha de primera ejecución del programa protegido (subrayada en naranja) y el identificador único de copia en caso de que opte por incluirlo en la distribuición.

- Opcionalmente, es posible habilitar características adicionales del programa con una fecha de caducidad determinada mediante el cuadro con título "Additional features". (Marcado con amarillo) En el esquema se muestran habilitadas las opciones 1, 3 y 8 con 31 dias de prueba o habilitación.

Una vez ingresados los datos mínimos (puntos 1 y 2) el boton Generate Key, genera la clave de registro y la muestra en letras rojas con recuadro negro al lado de la leyenda Registration key. (Inmediatamente arriba del botón marcado con "Generate Key")
La clave de registro depende fuertemente de todos los datos ingresados, como prueba de ésto, vea como cambia la clave de registro al modificar tan solo una de las opciones habilitadas o la fecha de expiración.

La clave de registro (letras rojas) es la que debe enviarse al usuario para validarlo.
Tanto el código de registro como la clave de registro estan diseñadas para poder enviarse via dictado manual. Ambos 'codigos' tienen 24 caracteres de largo (letras o simbolos). Esta extensión permite que puedan enviarse casi de cualquier modo (Fax, e-mail, dictándolas telefonicamente, etc.)
En cada posición del código puede figurar uno de 42 símbolos diferentes.
Lo cual da una cantidad de 42^24 claves posibles, es decir un número tan grande como:
mil millones de millones de millones de millones de millones de millones
lo cual imposibilita prácticamente cualquier intento de adivinanza. :)

Si todos los datos son correctos, el desarrollador envia la clave de registro al usuario para validarlo como usuario registrado.

Como debe utilizar el usuario la clave de registro ?

El cuadro de dialogo que ve el usuario al correr el programa protegido (que se muestra en la figura 1), permite ingresar la clave de registro que destraba el programa.

El recuadro rojo indica donde debe tipear el usuario la clave de registro que valida el software protegido. El botón marcado con verde claro es el que sirve para indicar que se aceptan los datos ingresados.
Si la clave de registro se corresponde con el código de registro, se logra la validación correcta del software, que a partir de ese momento, se ejecutará normalmente.
Si la clave ingresada es incorrecta, el sistema de protección mostrará el cuadro de diálogo de registración al iniciar nuevamente el programa protegido.

Completados estos pasos, la registración del usuario se ha realizado en forma exitosa. Si el software se registra correctamente, el usuario ya no nota ninguna característica propia de la protección. Mientras que el programa se siga ejecutando en la computadora donde se registró originalmente, la protección funciona de forma ' transparente' al usuario.
Si el programa detecta un cambio en la huella digital original (copia no registrada corriendo en otra computadora), simplemente se vuelve al modo 'Software no registrado', mostando nuevamente el cuadro de diálogo de registración.

Como se pueden obtener distintos niveles de bloqueo del programa protegido ?

Es posible habilitar diferentes niveles de bloqueo mediante el uso de la sección "Additional features" del generador de claves. Este puede generar diferentes claves para cada grupo de opciones soportadas, como fue explicado anteriormente. El componente exporta la lista de opciones soportadas mediante la propiedad SupportedCapabilities
Esta propiedad puede ser leida por el programa en tiempo de ejecución, para poder tomar acciones específicas por cada opcion soportada/no soportada.

Tiene Protect for Delphi soporte multilenguaje ?

Protect for Delphi es un componente no visible completamente configurable. Los mensajes de "Registrado" y "No registrado" pueden ser modificados en tiempo de diseño y/o ejecución. El código fuente del Form Standard de Registro se incluye en todas las versiones del componente, y puede ser modificado y distribuido libremente.
Estas características brindan al usuario la posibilidad de soportar diferentes lenguajes para su aplicación, aunque el componente no tenga utilidades de traducción internas.

He tenido problemas con las instrucciones.
Donde puedo ver ejemplos funcionando ?

Los ejemplos (que deberian compilar sin problemas) están en las carpetas:

\Demos\Standard (Directorio de ejemplo standard)
Simple.dpr (Proyecto standard)
\Demos\Custom (Directorio de ejemplo más complejo)
Custom.dpr (Proyecto más complejo)
\Demos\UnlockLevels
UnlockLevelsDemo.dpr (Proyecto que demuestra el uso de niveles de seguridad)

Para abrirlos: en Delphi hacer (menu) File -> Open -> (ir a la carpeta donde se ha instalado el componente) -> (seleccionar uno de los directorios indicados arriba) -> (seleccionar el archivo de proyecto) -> OK u Open.
Compilar y correr con F9

Cual es el método de pago para obtener Protect for Delphi ?
Se ofrece soporte y futuras
actualizaciones ?

Los métodos de pago disponibles son tarjeta de crédito o transferencia de dinero.
Existen dos opciones de registro:

1) Versión Full. (componente, generador de claves, generador de IDs)
Funcionalidad total. Solo es necesaria la registración del generador de claves y de IDs.
Se obtienen ofertas especiales a muy bajo costo para futuras actualizaciones.

2) Nuevo !!!
Versión Full con codigo fuente. (componente, generador de claves, generador de IDs, +Codigo Fuente !!!)
Funcionalidad total. Incluye código fuente !!!
Se obtienen dos meses de soporte técnico gratuito, y actualizaciones gratuitas por un año.

Usted tiene dos opciones para registrar Protect for Delphi:

Via RegNet - The Registration Network usando cualquiera de estos metodos

https://secure.reg.net/product.asp?ID=7257
Regnet #: 7257
On the web - http://www.reg.net
By Phone - 1 800 WWW2REG (1 800 999-2734) or (661) 288-1827
By Fax - 1 (661) 288-1867

Via GetSoftware:

http://www.getsoftware.com/cgi/products.gs?vendor=346
http://www.getsoftware.com/cgi/products.gs?vendor=346

o directamente a la opcion 1)

http://www.getsoftware.com/cgi/verify.gs?cart=1554
http://www.getsoftware.com/cgi/verify.gs?cart=1554

Sección adicional:

>> Usted puede saltear esta parte. La explicacion del funcionamiento interno provee una pauta de la confiabilidad del sistema, pero no leer esta sección no debería impedir su uso <<

Al activarse, el componente genera una huella digital del primer disco rígido conectado a la computadora donde se está corriendo el programa protegido.
Esta huella encriptada es la que se muestra en el formulario de registración estandard, y es la que provee el usuario como Código de Registro.
Para el desarrollador, el Código de Registro contiene la siguiente información:

_ Identificador del primer disco rígido de la computadora del usuario.
(Unico para cada dispositivo)
_ Fecha de primera ejecución del software en la computadora del usuario.
(Según el seteo de fecha hora del usuario)
_ Identificador único de copia.
(Numero de copia que fue distribuida al usuario)

Para el usuario ninguna parte de esta información está disponible ya que el código de registro se encuentra encriptado con la clave de aplicación, que solo el desarrollador conoce.

Mediante el generador de claves, que es parte del sistema, se pueden generar todas la Claves de Registro posibles. Por ejemplo, puede generarse una clave de registro total, con todas las opciones habilitadas y sin fecha de caducidad. Por supuesto, tambien son posibles claves mas restrictivas, con un número fijo de dias de caducidad y solo algunas opciones habilitadas.
El numero máximo de opciones soportadas es 32, pudiendo ser habilitadas independientemente.
El generador de claves valida el Código de Registro enviado por el usuario y muestra los datos asociados a él en caso de ser válido.
Así, por ejemplo, es posible saber qué copia (identificada con un numero) es la que está corriendo en la computadora del usuario y generar una clave que habilite solo esa copia. (Para que esta opción tenga validez, deberá distribuirse previamente con el software protegido su identificador único de autenticidad. Ver “Generando identificadores de autenticidad”)
Es posible saber, además, la fecha en que el programa protegido se ejecutó por primera vez en la maquina del usuario. Esto permite conocer la cantidad de dias de uso del programa en modo demostración, en caso de contar con una licencia de esa clase.

Como se indicó anteriormente, el funcionamiento descripto en la sección rápida es un comportamiento estandard, que puede modificarse a voluntad.
Para ello hace falta modificar algunas propiedades del componente, que permiten lograr la maxima flexibilidad de uso.
Para ver un ejemplo de otros comportamientos posibles, abra el proyecto: \Demos\Custom\Custom.dpr con Delphi.
Se trata de un proyecto que no utiliza el diálogo de registro estandard.

Documentación de las propiedades del componente:

- Métodos
procedure Start;
function TrailPeriodHasExpired: Boolean;
procedure SetRegistrationKey(RegKey: string);
- Principales
ApplicationKey string
IsRegistered Boolean
CheckSecurityEachNSeconds Integer
MessageNotRegistered string
MessageRegistered string
RegistrationCode string
- Adicionales
TrialDays Integer
SupportedCapabilities[Number : Integer] Boolean
HardExitProgramOnCheckSecurityFailure Boolean
HardExitWindowsOnCheckSecurityFailure Boolean
UniqueIDShortFilename string (solo 4 bytes usados)
UniqueCopyIdentifier (*) Integer (solo los 26 bits bajos)
- Eventos
OnNotRegistered TNotifyEvent
OnRegistered TNotifyEvent

Descripción breve de las propiedades del componente:

Métodos

Start: Debe ser invocado para inicializar el componente.
IMPORTANTE: Si no es invocado, la protección NO FUNCIONARA. (Salvo si se utiliza el cuadro de diálogo standard de registración, en la forma indicada en la sección rápida.)
TrailPeriodHasExpired: Indica si el período de prueba ha expirado.
SetRegistrationKey: Setea la clave de registración.

Propiedades

ApplicationKey: Es la clave elegida por el desarrollador para nombrar univocamente cada uno de sus proyectos Delphi, que desea proteger contra copia. No debe ser revelada a ningún usuario.

IsRegistered: Puede consultarse en tiempo de ejecución para saber si el software está registrado.

CheckSecurityEachNSeconds: Numero de segundos para un checkeo de seguridad adicional. Si se especifica un numero de segundos mayor a cero, el componente checkea el estado de la registración cada N segundos, donde N es el número seteado.

MessageNotRegistered: Mensaje de software no registrado. Se encuentra encriptado internamente para no permitir su modificación.

MessageRegistered: Mensaje de software registrado. Se encuentra encriptado internamente para no permitir su modificación.

TrialDays: Dias de trial de la versión registrada.

SupportedCapabilities[Number : Integer]: Capacidades adicionales habilitadas por la clave de registro. Permite habilitar gradualmente y a distancia, diversas caracteristicas del software protegido. La clave de registro habilita/deshabilita aquellas caracteristicas que selecciona el desarrollador mediante el generador de claves.

HardExitProgramOnCheckSecurityFailure: Si esta setado a True y falla la seguridad en un chequeo adicional, el programa es abortado abruptamente.

HardExitWindowsOnCheckSecurityFailure: Si esta setado a True y falla la seguridad en un chequeo adicional, windows es cerrado abruptamente.
(ATENCION!!! Este seteo de seguridad es muy extremo. Cualquier aplicación abierta al momento del fallo de seguridad se cerrará sin guardar los datos asociados. En equipos con apagado automatico, Windows se apagará. UTILIZAR CON PRECAUCION)

UniqueIDShortFilename: Hasta cuatro letras mayúsculas o números que indican el principio del nombre del archivo con extension .UID, que identifica univocamente cada copia del programa ejecutable.
Ejemplo de valor correcto: MAPP
ATENCION!: Si se setea un valor no vacío para esta propiedad, el programa protegido busca un identificador único de autenticidad con el formato: MYIDNumero.UID en el mismo directorio desde donde corre el ejecutable.
Si no lo encuentra, el programa ABORTA su ejecución.
Si lo encuentra y el archivo no está corrupto, el número de identificación de copia se setea al valor que figura encriptado ese archivo.

UniqueCopyIdentifier: Es el número de identificación de la copia que se está ejecutando.

Generando identificadores de autenticidad:

Si el desarrollador se encarga del proceso de distribución del software, los identificadores de autenticidad son innecesarios. Sin embargo, cuando el desarrollador delega la tarea de distribución de su software en un tercero no confiable, o bien realiza una distribucion en forma masiva, los identificadores de autenticidad pueden ser de mucha utilidad.
Veamos el proceso secuencial de distribución de copias en el caso en que el desarrollador sea el encargado de esa tarea:
A modo de ejemplo supongamos que se distribuyeron solo 2 copias del programa protegido a dos usuarios A y B.

El primer usuario (A) ejecuta el programa en su computadora 1, esto genera un codigo de registro que llamaremos A1.
Envía el codigo de registro y el pago por la registración al desarrollador, éste confirma el pago, lo valida como correcto y le envia la clave de registro ClaveParaA1.
Algo similar sucede con el usuario B:
El usuario B ejecuta el programa en su computadora 1, esto genera un codigo de registro que llamaremos B1.
Envía el codigo de registro y el pago por la registración al desarrollador, éste confirma el pago, lo valida como correcto y le envia la clave de registro ClaveParaB1.
Hasta aqui no ha habido inconvenientes.

El proceso es diferente cuando se distribuyen copias en forma masiva(distribuidor):
El desarrollador envía al distribuidor una cantidad de copias del programa protegido, para su posterior venta. Para fijar ideas, supongamos que esta cantidad es de 1000 copias.
Supongamos que el distribuidor ha vendido 500 copias el primer día.
Ese día y los subsiguientes, el desarrollador recibe de los usuarios compradores los pedidos de registro. Recordemos que cada pedido de registro tiene un código de registro asociado, por lo que en principio podrían validarse todos los usuarios sin problemas.
Sin embargo, si algún usuario no es honesto, podría instalar el programa protegido en muchas computadoras y requerir todas las claves de registro.

En este punto, si no se utilizan identificadores de autenticidad, el desarrollador no tiene manera de distinguir si algún usuario está requiriendo más claves de registro que las que tiene permitidas, o bien si cada uno de los usuarios requirió su clave.
Por supuesto, el desarrollador sabe el número de copias que fueron vendidas, pero no puede basar su control en ese único número, ya que ese número total no dice como fueron repartidas las claves entre los usuarios.
La situación que se espera obtener es que cada usuario pueda pedir SU clave de registro y ninguna más. Si el control se hiciera sobre el numero total de copias vendidas, puede suceder, por ejemplo, lo siguiente:

- un usuario pide 30 claves de registro (en horarios distintos, falseando su identidad) (Está pidiendo la clave que le corresponde por haber pagado su licencia de uso y 29 claves más que no le corresponden)
- el desarrollador verifica que los códigos de registro son válidos. Tambien sabe que el número de copias vendidas fue 500. El desarrollador piensa que quedan 500 - 30 = 470 usuarios sin registrar, por lo que espera 470 pedidos de registro (de los usuarios que han pagado su licencia el primer dia). Sin embargo, la cantidad real de usuarios sin registrar es de 499.
- Como no tiene motivos para sospechar, envia al usuario tramposo las 30 claves solicitadas.Esto es grave, ya que como el control se realiza sobre el número total de copias, algunos usuarios que pagaron por su licencia no obtendrán su clave de registro.

La solución: Identificadores de autenticidad

Para solucionar el inconveniente que se ilustró en la seccion anterior existen los identificadores de autenticidad.
Basicamente son archivos de extension .uid que numeran las distintas copias
del ejecutable protegido, y deben distribuirse junto con éste.
Nombres válidos son por ejemplo:
MyID0000001.uid
MyID0000002.uid
MyID0010857.uid

Si el programa se distribuye con un identificador de autenticidad, el código de registro contiene la información del número de copia del ejecutable. Esto permite discernir cual es la copia que se está registrando.
La situacion problemática que se presentó antes queda completamente salvada.
Veamos la misma situación anterior: Recordemos que se han distribuido 1000 copias, se han vendido 500 el primer dia.

- un usuario pide 30 claves de registro (en horarios distintos, falseando su identidad) (Está pidiendo la clave que le corresponde por haber pagado su licencia de uso y 29 claves más que no le corresponden)
- Cuando llega el primer pedido de registro, el desarrollador verifica la autenticidad del código de registro, ANOTA EL IDENTIFICADOR DE LA COPIA que se está registrando y lo valida. (El usuario tramposo obtiene la clave por la que ha pagado)
- Cuando llegan los demás pedidos de registro ese usuario, cada uno con distinto código de registro, el generador de claves REPORTA UN identificador de copia que YA FUE REGISTRADO. El desarrollador nota esta situación e informa a ese usuario que no es posible registrar mas de una copia por licencia. (El usuario tramposo NO obtiene las claves por la que ha NO ha pagado)

- Cuando llegan los pedidos de registro de los demás usuarios, el generador de claves reporta un identificador de copia (un número) que todavia no ha sido registrado, por lo que simplemente lo valida.

Como genero los identificadores de autenticidad ?

Para generar los identificadores de autenticidad, el desarrollador debe ejecutar el generador de identificadores de autenticidad que se incluye en el paquete de distribución. Se llama IDGenerator.exe y luce así:
(El resaltado en colores es solo indicativo.)

Este generador requiere:

1) la clave de aplicación (señalada con trazo azul)
2) el comienzo del nombre del archivo identificador (señalado con trazo verde claro)
3) Un intervalo de valores (señalado con trazo rojo)
4) Un directorio para guardar TODOS los identificadores. (Al lado del recuadro con trazo rojo)

Una vez que se han ingresado todos estos datos, al oprimir el boton
'Generate Unique ID Files' se comienza la generación de los identificadores, que son escritos al directorio seleccionado.
El boton stop sirve para detener el procesamiento.
En el ejemplo el intervalo va de 1 a 500, por lo que se generan 500 archivos con estos nombres: MYID1.uid, MYID2.uid, MYID3.uid, ..., MYID500.uid
Se debe distribuir uno de estos archivos con cada copia del programa protegido.

De la manera expuesta, el desarrollador controla la registración copia por copia de su software. Cada vez que le llega un pedido de registro, anota el número de copia (identificador) asociado al codigo de registro.
Si el numero de copia ya figura en su lista, no debe validarlo.
Si el numero de copia no figura en ella, envía la clave de registro al usuario y se completa la validación con éxito. Asi de simple.

DISCLAIMER y LEGALES Este software no tiene ninguna garantia de funcionamiento implícita o explicita por parte del autor. El uso de este software es bajo cuenta y riesgo de los usuarios. El siguiente paquete de distribuición puede ser copiado con propósitos de evaluación, mientras no sea modificado en ninguna de sus partes y sea distribuido como un conjunto. Bajo ninguna circunstancia es posible la venta de este software (o cualquiera de sus partes) sin el consentimiento escrito del autor. La presente nota se refiere unicamente a la version de demostración, por favor lea la sección de registro para obtener mas información sobre este punto. El uso de este software implica la aceptación de los puntos anteriores. Reinaldo Yañez Arrey se declara único propietario de los derechos de autor de este software.

Notas adicionales:

- Notar que el proyecto de demostración mas complejo utiliza un identificador de copia ya generado. Si este archivo: MYID0010857.uid fuera modificado o borrado del directorio del ejecutable, surgiria un error al correrlo.

- El sistema de protección NO esconde ni guarda ni lee información desde el registro de Windows. (Registry)

- El código de registro se forma con la huella digital del primer disco rígido conectado a la computadora del usuario, mas la información de la fecha de primera ejecución del programa protegido, mas la identificación de número de copia. La huella digital del disco rígido (número de serie y características físicas) NO DEPENDEN del formato ni contenido del disco. Esta información se obtiene mediante un Virtual Device (.vxd) que está internamente contenido en el componente. Esta característica permite facilitar la instalación tanto del componente, como tambien la del programa protegido, haciendo innecesario distribuir el archivo con extension vxd. Además, se logra la mayor seguridad posible en cuanto a la identificación del dispositivo.

- El sistema le permite al usuario hacer la cantidad de copias de seguridad (backups) del programa protegido que crea necesarias. Todas ellas funcionan solo en la computadora que fue registrada. (El archivo 'NombreDelEjecutable'.KEY debe estar en el mismo directorio que el programa ejecutable, para cada backup)

- Por tanto, el usuario puede modificar su hardware sin problemas, exceptuando el disco rígido. El programa protegido queda 'pegado' al disco rigido sobre el que se realizó la registración.

- El sistema REQUIERE que la computadora donde se ejecuta el programa protegido tenga dísco rígido. Por supuesto, puede ejecutarse el programa desde otro disco (unidad de diskettes u otro dispositivo), pero la identificación (huella digital) se realiza siempre sobre primer disco rígido.

- Los códigos de registro pueden contener lo siguientes carateres: 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '.', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', '+', '-', '#','=', '$'

(C)opyright 2000, Reinaldo Yañez Arrey.
Buenos Aires, Argentina.
rya@labs.df.uba.ar
ryaayr@yahoo.com

IMPORTANTE: Limitaciones de la versión demo:

1) El paquete de instalación para la versión demo NO incluye el programa generador de identificadores únicos.

2) Los mensajes de 'registrado', 'no registrado' aparecen con el siguiente texto adicional que no puede removerse:

This program was copy protected using a Demo version of Protect for Delphi
A protection of this kind is NOT ALLOWED for commercial use.
(C)opyright 2000, by Reinaldo Yañez.
e-mail: rya@labs.df.uba.ar, ryaayr@yahoo.com

3) En el entorno de Delphi, al abrir cualquier proyecto que contenga un componente del tipo TProt4Delphi, aparecerá un mensaje con el texto:
'Reminder: Prot4Delphi component is NOT registered.'
el mensaje se repite cada 30 segundos.

4) La property CheckSecurityEachNSeconds se ha desconectado.
La seguridad se verifica cada 60 segundos.

5) La property SupportedCapabilities retorna correctamente solo las 2 primeras características (Características Número 0 y Numero 1). Las demás se retornan como NO SOPORTADAS. En el generador de claves sólo se puede utilizar estas 2 características.

(C)opyright 2000, Reinaldo Yañez Arrey.
Buenos Aires, Argentina.
rya@labs.df.uba.ar
ryaayr@yahoo.com

Acerca del autor:

Actualmente soy estudiante de ciencias fisicas de la UBA. Trabajo para una empresa de programación que se dedica principalmente al desarrollo de software de gestión y control. En el trabajo programo principalmente en Delphi y C. Para mis proyectos, en Delphi, C, C++ y assembler.
Mi direccion fija de e-mail (por el momento :) es rya@labs.df.uba.ar
Con respecto al sistema que presento, hice hace varios años una version para DOS que directamente encriptaba el codigo del ejecutable (ya compilado).
Cuando me pasé al extraordinario Delphi (dicho sea de paso) quedó pendiente el tema de la distribución de mis propios programas. Ya no me era posible pasarlos sin algun temor. (Me gusta que se respete el Copyright)
De esa necesidad propia surgió este componente que en el estado actual es mas que robusto. El unico problema es que no tengo demasiado tiempo para diseñar el driver para hacerlo funcionar en Windows NT.
Pido disculpas por la documentación un tanto mal diseñada (me doy cuenta un poco tarde), pero pronto comienzo a estudiar para los finales de la facultad y no tengo tiempo de arreglarla. Espero que de todas formas sea de ayuda.

Para los "especialistas": el componente utiliza encripción segura de nivel industrial. El paquete de encripción es un block cipher de 64 bits de datos y 384 bits maximos de clave. Tiene 128 Kbytes de S-BOXES randomly generated. (Y si, no creo demasiado en las human-made S-BOXES !!)

(C)opyright 2000, Reinaldo Yañez Arrey.
Buenos Aires, Argentina.
rya@labs.df.uba.ar
ryaayr@yahoo.com