El método de
generación de la licencia no es realmente tan importante, siempre que no sea trivial. El truco es cómo su cliente verifica que la licencia sea correcta.
Digamos que haces algo como esto:
BOOL verifyLicense (char* licenseKey)
{
BOOL result = false;
if(strlen(licenseKey) > 128)
return false;
char* url = (char*)malloc(1024);
sprintf(url, "%s%s", LicenseServerBaseURL, licenseKey);
char* response = http_get(url);
if (strcmp(response, "OK") == 0)
result = true;
free(result);
free(url);
}
Esto es bastante simple: hacemos algunas verificaciones básicas de la clave de licencia, creamos una URL que contiene la clave de licencia, luego hacemos un GET HTTP al servidor para verificar la licencia. Si devuelve "OK" lo aceptamos.
El problema con esto es que cualquiera puede desarmar al cliente:
...
push 06f2011c ; address of url string
call http_get ; http_get(url)
mov ebx, eax ; store a copy of the result address
push 04830040 ; ASCII "OK"
push eax ; address of response string
call msvcrt.strcmp ; strcmp(response, "OK")
test eax, eax ; if( ^ == 0 )
jnz exit ; skip if branch if non-zero
mov eax, 1 ; result = true
exit:
push ebx
call msvcrt.free ; free(result)
push 06f2011c
call msvcrt.free ; free(url)
ret
Todo lo que tengo que hacer es alterar el jnz exit
a una serie de instrucciones nop
, por lo que el salto nunca se toma y el resultado siempre es verdadero. De esta forma, se acepta cualquier clave de licencia. Aún mejor, simplemente podría modificar el inicio del método para establecer inmediatamente eax
en 1 y devolver, por lo que nunca es molesto pedirle a su servidor la validación de la licencia.
Entonces, ¿cómo resolvemos este problema? Desafortunadamente para ti, no podemos. Se está encontrando con el problema de DRM, que esencialmente establece que si le entrega a alguien información, siempre puede cambiarla. No importa cuánto ofusque su código, es posible que el usuario eventualmente realice una ingeniería inversa y descubra cómo realizar cambios o extraer datos. Si encripta el contenido, finalmente tendrá que tener la clave en el sistema para descifrarlo, por lo que siempre hay una forma para que el usuario extraiga esa clave y descifre el contenido de forma permanente.
Lo mejor que puedes hacer es hacerlo difícil, lo que implica mucho tiempo y esfuerzo. Eventualmente, su software será resquebrajado y terminará en un sitio de torrent en algún lugar. Apesta a los desarrolladores que usan este tipo de modelo de negocio, pero es el mundo en el que vivimos. Mi sugerencia es que se vaya por una de dos rutas:
-
Cree un sistema de licencias básico que funcione y acepte el hecho de que algunas personas lo piratearán. Preste servicio a sus clientes reales al dedicar su tiempo de desarrollo a realizar mejoras en el software, en lugar de implementar y mantener sistemas DRM draconianos.
-
Modifique todo su paradigma de desarrollo y negocio, de modo que su producto sea un servicio en lugar de una aplicación de software. SaaS ha sido muy exitoso, ya que es (prácticamente) imposible piratear servicios, y el modelo le permite realizar en tiempo real realice cambios en su base de código y realice análisis en el uso.
Si elige la opción 1, no implique un servidor para la validación. Agrega complejidad, no proporciona seguridad adicional, trae algunas preocupaciones de privacidad y hace que sea imposible para los usuarios usar su software si su servidor de licencias no funciona. Solo quédate con algo simple, por ej. un hash del nombre de usuario y un valor secreto en el lado del cliente. Es trivial romperlo, pero le da una barrera mínima a la piratería.