Correcto, estoy hablando del código de validación de licencia en una aplicación de escritorio, p. un método bool ValidateLicense(string licenseCode)
. Por supuesto, cualquier esquema de protección puede ser modificado por ingeniería inversa por un cracker experto y determinado. Sin embargo, me gustaría evitar que cualquiera con conocimientos básicos de programación pueda usar Reflector para construir un keygen en un par de minutos.¿Cómo mantener la lógica del programa .NET (razonablemente) en secreto?
posibles enfoques
Ofuscación. Según entiendo, ofuscar causa una sobrecarga de rendimiento y puede dificultar la depuración (legítima). Entonces, ¿hay herramientas que permitan ofuscar solo los métodos seleccionados?
Mueva el método al ensamblado ngen'ed o DLL no administrado. ¿Pero no es esto una invitación a simplemente reemplazar el DLL? Alguna idea de cómo prevenir esto (léase: hacerlo un poco más difícil para un atacante)?
Otro?
PS: Pregunta está obviamente relacionado con Protect .NET code from reverse engineering? tratando de poner pensamientos de allí a practicar
ACTUALIZACIÓN
a 1. Un primer paso ofuscación que seguramente sería cambiar el nombre del método de validación. (Gracias, Jonathan)
Para 2. Suponiendo que la aplicación utiliza los métodos API de Win32, podría redirigir las llamadas a través de una DLL no administrada, convirtiéndola así en una parte integral de la aplicación. Jugar con las firmas del método (por ejemplo, nombre de cambio, parámetros de intercambio) lo haría menos obvio. ¿Crees que los inconvenientes innatos están justificados?
To 3. No distribuir el método de validación pertenece aquí. Guárdelo en su servidor y llame de forma remota, es decir, use la validación en línea (Gracias, David Hedlund)
Decidimos no ofuscarnos y utilizar un mecanismo de clave de licencia simple, junto con una activación en línea. Por supuesto, puede ser "crackeado" (y de hecho lo fue). Nuestro cálculo es el siguiente: aquellos que usan la versión pirateada nunca habrían comprado la herramienta, además tenemos más distribución de nuestro software. No es perfecto, pero es suficiente comparar el esfuerzo para proteger el software con la (mucho mejor) "protección" de escribir buenas herramientas. –
Utilice una combinación de una VM oscura, validación en línea y utilizando un código de máquina virtual aleatorio suministrado por un servicio de validación en línea para algunas partes esenciales (pero no críticas para el rendimiento) de su código. O incluso mover partes de la funcionalidad esencial (no solo la validación) a un servicio en línea. –