¿Añadiendo licenciamiento a tu aplicación .NET? Protege también la comprobación de licencia
Una clave de licencia es tan fuerte como el código que la verifica. Conoce los enfoques habituales de licenciamiento en .NET y por qué la ofuscación y la anti-manipulación son esenciales para que aguanten.
Añadir licenciamiento a una aplicación .NET es sencillo. Hacer que ese licenciamiento sea difícil de eludir es la parte que la mayoría de los desarrolladores subestiman. Este artículo cubre ambas.
Enfoques habituales de licenciamiento en .NET
- Archivos/claves de licencia firmados sin conexión. Firmas una licencia (p. ej. con RSA) y la aplicación la verifica contra una clave pública embebida. Sencillo, funciona sin conexión, pero no se puede revocar una vez emitido.
- Activación en línea. La aplicación contacta con un servidor para activar una clave, vinculándola a una máquina e imponiendo un límite de puestos. Admite revocación y suscripciones; necesita un backend.
- Bloqueo por equipo. Vincula una licencia a una huella de hardware/máquina para que una clave no se pueda compartir libremente.
- Bloqueo de funciones. Desbloquea las funciones “pro” según el nivel de la licencia.
Todos estos son buenos patrones. Pero comparten una debilidad.
El punto débil: la propia comprobación
Cada uno de estos enfoques acaba ejecutando código como:
if (license.IsValid)
EnableProFeatures();
En un ensamblado .NET sin protección, esa comprobación es trivial de derrotar. Un atacante abre tu binario en dnSpy, encuentra el método, edita el IL para que IsValid siempre devuelva true (o elimina la comprobación por completo) y guarda una compilación parcheada. Tu licencia, cuidadosamente firmada, bloqueada por equipo y activada en línea, eludida en minutos, porque el código de verificación era legible y editable.
Qué hace de verdad que el licenciamiento aguante
- Ofuscación: renombra y aplana la lógica de licencia para que sea difícil de localizar y entender en un decompilador.
- Cifrado de cadenas: oculta las URL, claves y mensajes que hacen fácil de buscar el código de licenciamiento.
- Anti-manipulación: detecta que el ensamblado fue modificado después de firmarlo, de modo que un binario parcheado se niega a ejecutarse.
- Anti-depuración: detecta un depurador adjunto como dnSpy para que los atacantes no puedan recorrer y editar la comprobación en vivo.
En otras palabras: tu diseño de licenciamiento aporta la política; la ofuscación y el endurecimiento protegen su aplicación. Omite la segunda mitad y la primera es decorativa.
Lista de comprobación práctica
- Elige un modelo de licenciamiento (firmado sin conexión, o activación en línea con revocación y puestos).
- Mantén cualquier secreto de verdad —claves de firma, credenciales del servidor— fuera del cliente.
- Ofusca y endurece la compilación de Release, incluido el código de licenciamiento, con la anti-manipulación activada.
- Verifica que la compilación protegida sigue activándose y ejecutándose de forma idéntica.
- Firma el binario para que la manipulación sea detectable.
Nebula.NET se encarga de los pasos 3-5 —ofuscación, cifrado de cadenas, anti-manipulación/anti-depuración y firma Authenticode— para .NET Framework 4.8 y .NET 6-10. Mira cómo funciona y fíjate en que las mismas técnicas que ocultan tus algoritmos también protegen la aplicación de tus licencias.
Empieza gratis desde la página de descarga.
Prueba Nebula.NET
Endurece tu código .NET en minutos — empieza con la edición gratuita.