Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

Ofuscación: cómo proteger el código de tus aplicaciones .NET

En un post anterior vimos cómo era posible recuperar el código de cualquier programa de .NET a partir de su .exe o .dll usando un descompilador. Hoy vamos a ver cómo podemos tratar de evitarlo gracias al uso de un ofuscador de código.

Los ofuscadores de código, como su propio nombre indica, tienen la capacidad de complicar mucho el código original de modo que, aunque no cambia lo que hace el programa, y el computador es capaz de ejecutarlo sin problemas, cuando un humano lee el código fuente resultante es tan complejo que no es capaz de seguirlo.

Primero te cuento en este vídeo cómo puedes lograrlo y, a continuación, te dejo algunas consideraciones importantes sobre estas técnicas de ofuscación, el código de ejemplo, y los enlaces mencionados.

¡Vamos allá!

Debes tener en cuenta que la ofuscación no impide descompilar el código, sólo lo complica mucho, por lo que si lo que quieres ocultar es un detalle muy concreto (como una protección o licencia) no te servirá de mucho ante un "cracker" con determinación.

Existen algunas herramientas muy especializadas como De4DOT o DEObfuscar, que se especializan en deshacer la ofuscación con más o menos éxito según la complejidad del programa. Por ejemplo, aunque es muy efectivo con otros descompiladores, De4Dot no logra apenas nada con el código ofuscado con Obfuscar, el ofuscador que he utilizado en el vídeo. Sin embargo, DEObfuscar es mejor y puede aclarar bastante el código, aunque sigue siendo muy lioso, entre otras cosas porque no recupera nombres de funciones internas, variables, etc...

Por otro lado, no debes obsesionarte con ofuscar el código. Al final hay una verdad universal en programación que, cuando tienes experiencia acabas por descubrir: es mucho más complicado leer código que escribirlo. Y si no, prueba a leer y entender el código de cualquier aplicación Open Source que conozcas que no tenga muchos comentarios o, sin ir más lejos, código tuyo de hace un par de años si lo tienes. Lo más importante en una aplicación no trivial son las miles de pequeñas decisiones que se toman y por qué se toman, y no tanto la implementación concreta de las mismas. Por eso es muy importante mantener una buena documentación interna y externa.

De todos modos, si lo necesitas, espero que este vídeo te haya resultado interesante para aprender a proteger tu código fuente para .NET.

Te dejo el código fuente de las aplicaciones de ejemplo aquí:

Enlaces de interés:

 

José M. Alarcón Aguín Fundador de campusMVP, es ingeniero industrial y especialista en consultoría de empresa. Ha escrito diversos libros, habiendo publicado hasta la fecha cientos de artículos sobre informática e ingeniería en publicaciones especializadas. Microsoft lo ha reconocido como MVP (Most Valuable Professional) en desarrollo web desde el año 2004 hasta la actualidad. Puedes seguirlo en Twitter en @jm_alarcon o leer sus blog técnico o personal. Ver todos los posts de José M. Alarcón Aguín

Boletín campusMVP.es

Solo cosas útiles. Una vez al mes.

🚀 Únete a miles de desarrolladores

DATE DE ALTA

x No me interesa | x Ya soy suscriptor

La mejor formación online para desarrolladores como tú

Comentarios (21) -

Vi tu video y me sirvió a la perfección, pero no se como incluirlo en el paquete de instalación que creo con Visual Studio Installer, he intentado copiando los archivos uno a uno en la carpeta, pero aun asi cuando creo el instalador no me los ofusca, como puedo hacer? Gracias

Responder

José Manuel Alarcón
José Manuel Alarcón

Hola Nathaly:

Tienes que dejar fuera los archivos compilados "convencionales" e incluir, como cualquier otro archivo, los archivos ofuscados, que estarán en la ubicación donde los hayas generado.

Saludos

Responder

Hola, gracias por responder ingresé como archivo independiente el .exe ofuscado y sus dependencias para crear el instalador, pero al momento de instalar e ingresar los datos desde C# a Sql server y querer visualizarlos en un datagridview me salían las filas pero cada celda vacía, y al abrir el programa sin la ofuscacion estaban ahí los datos. ¿Cómo podría solucionar esto?

Responder

José Manuel Alarcón
José Manuel Alarcón

Mmmm, eso tiene pinta de ser algo relacionado con la configuración (cadena de conexión), no tanto con la ofuscación que no debiera afectarle para nada. ¿Estás seguro de que el .config lo está leyendo adecuadamente para ir a la base de datos correcta? Tiene pinta de que no se conecta ni para enviar ni para recibir datos y tienes un gestor de excepciones global o algo que impide que "rompa".

De todos modos eso no creo que sea de la ofuscación, y para solucionarlo tendrás que depurar y ver qué pasa exactamente.

Saludos.

Responder

Hola José Manuel, muchas gracias por tu vídeo, necesito ofuscar un archivo de silverlight en particular uno con extensión  ClientConfig en el que hay mucha información sensible, no encuentro por ahora ningún ofuscador ni siquiera de pago que lo haga, ¿sabes de alguno?

Muchas gracias.

Responder

José Manuel Alarcón
José Manuel Alarcón

Hola Mónica:

Lo siento, pero no trabajo con Silverlight. De hecho me sorprenda que aún haya quien trabaja con esta tecnología...

De todos modos, e independientemente de la tecnología que uses, ten en cuenta que el proceso se llama de ofuscación, no de encriptación o cifrado, por lo que nunca deberías incluir en un ensamblado ofuscado ninguna información problemática que nadie pueda conocer. Todo eso deberá estar siempre en el servidor y fuera del alcance de la gente, y/o además cifrada.

La ofuscación no te va ayudar con esto.

Saludos.

Responder

Rafael  Campillo
Rafael Campillo

Hola estimado José Manuel:
Solo comentarte que va muy bien el ofuscador hasta que intento abrir el ejecutable en release y me salta una excepción que no se porqué la da. He mirado el log y no muestra ninguna anomalía. Comentarte que la compilación la hace perfecta, pasa por el xml, etc. Esta es la excepción: "Se produjo una excepción inesperada del programa (0xe0434352) en la aplicación en la ubicación  0x0000000076AEB4F2.
Hasta ahora utilizaba el Doufuscator pero es que va muy lento para compilar aparte de que no es tan bueno como el tuyo.
Bueno, un cordial saludo y muchas gracias por tu atención.
Rafael Campillo

Responder

José Manuel Alarcón
José Manuel Alarcón

Hola Rafael:

Esa excepción es "desconocida", así que tendrías que depurar el programa a más bajo nivel. De todos modos ¿has mirado en el visor de eventos en "Windows Logs"  luego en  "Application". Allí se registran los errores de .NET y puede que te dé alguna pista.

Dicho esto, el proceso de ofuscación no vale para todos los tipos de programas porque, como explico en el post/vídeo, si por ejemplo usas (tú o alguna de las bibliotecas que empleas) reflexión y se cambian los nombres de las cosas, a lo mejor no te va a funcionar. También puede ser que alguna clase que referencies de según qué manera se le haya cambiado el nombre y no la encuentre (hay opciones para que respete algunas cosas que normalmente cambia), etc...

Es decir, cada aplicación es un mundo y los ofuscadores son herramientas peligrosas. Hay que probar y afinar si quieres usarlos, y no te valdrán para todos los casos. Ojalá fueran herramientas de lanzar y listo, pero no lo son.

A ver si das con lo que sea y si es interesante nos lo comentas.

Saludos!

Responder

Jorge Santiago
Jorge Santiago

Hola José Manuel!
Tengo una aplicación muy pequeña que desearía ofuscar.
El tema es que mi aplicación está desarrollada en Visual Basic.
Cuando completo todos los pasos indicados en tu video me encuentro con un problema en la sentencia incluida en los Built Events:

if $(ConfigurationName) == Release $(Obfuscar)..\..\obfuscar.xlm

Por supuesto el archivo xlm lo nombre "obfucar.xlm" tal como hiciste en tu video.
Supongo que se debe a que tu vu¿ideo muestra todo el código en C sharp.
Podrías indicarme por favor cómo debería ser esta sentencia en este caso?
Gracias!!
Cordialmente.
Jorge Santiago

Responder

José Manuel Alarcón
José Manuel Alarcón

Hola Jorge:

En ese comando tienes dos fallos y seguramente por eso no te funciona:

- Te falta un espacio entre $(obfuscar) y la ruta
- La extensión que le has puesto al archivo es ".xlm", no ".xml" y por eso no te lo encuentra.

Además tienes que asegurarte de que metes los nombres de los ensamblados correctamente en el XML.

Cualquier error que dé el proceso de ofuscación lo puedes ver en la pestaña "Output" y te dice exactamente qué está pasando.

Ya me cuentas si te funciona con estos cambios.

Saludos.

Responder

Jorge Santiago
Jorge Santiago

Estimado José Manuel:
Lo logré!
Muchas gracias por tu ayuda!!
Saludos.

Responder

Estaba probando con .net framework en x64 bit pero no copila , sale error codigo 1. EN x68 si copila bien que podrar ser EN 64 BIT...

Responder

José Manuel Alarcón
José Manuel Alarcón

Hola Pedro:

No sé qué decirte... Debe de ser algo de tu configuración. Lo acabo de probar cambiando para que compile solo a x64 y no para cualquier arquitectura, y funciona perfectamente, y no debería haber diferencia alguna en realidad...

Revisa bien todos los ajustes. Quizá en tu configuración de compilación la carpeta en donde se genere para x64 cambie o algo así...

Siento no poder ayudarte más.

Saludos.

Responder

Jorge Santiago
Jorge Santiago

Hola José Manuel!
Yo de nuevo.
Como te dije el proceso de la ofuscación funcionó perfectamente.
El tema que tengo ahora es que mi aplicación debe ser distribuida, para lo cual armé un instalador mediante el armado de un proyecto setup dentro de Visual Studio.
Cuando compilo y genero el instalador. Luego utilizando el instalador instalo la aplicación en otra computadora.
El problema es que el .exe generado no está ofuscado.
Como puedo hacer para que el instalador genere un .exe ofuscado?
Nuevamente gracias por tu ayuda.
Saludos.

Responder

José Manuel Alarcón
José Manuel Alarcón

Hola Jorge:

Como no me dices cuál, asumo que estarás usando el instalador de Visual Studio (marketplace.visualstudio.com/items).

En ese caso es muy sencillo. Lo único que tienes que hacer es, tras haber añadido el "output" del proyecto, o esa los .exe y .dll que se generan en l carpeta Bin/Release, en el explorador de soluciones vas a la carpeta "Primary Output from NombreDeTuProyecto" y pulsas con el botón derecho, eligiendo la opción de "Exclude filter". Con el botón de añadir, en el diálogo que aparece metes a mano, uno a uno, los nombres de los ensamblados que hayas ofuscado (exes y dlls). Una vez hecho esto, añades manualmente uno a uno los exes y dlls que tengas en la carpeta del ofuscador, que sutituirán a los otros que acabas de excluir.

¡Listo! Ahora cuando se instale lo hará la versión ofuscada y no la normal.

Saludos.

excluir el .exe (y las demás dlls de las que tengas versión ofuscada) de la carpeta principal del programa, con un filtro de excluir.

Responder

Jorge Santiago
Jorge Santiago

Querido José Manuel:
Lo logré!
Invaluable tu ayuda.
Muchísimas gracias!!
Cordialmente.
Jorge

Responder

José Manuel Alarcón
José Manuel Alarcón

¡Estupendo!

Responder

Jorge Santiago
Jorge Santiago

Hola José Manuel!
Nuevamente yo y con problemas con la ofuscación.
Como te dije había logrado ofuscar mi aplicación sin problemas y también había generado el instalador que instalaba la aplicación ya ofuscada.
Encontré un pequeño error en la aplicación y tuve que hacer una modificación en el código.
Al compilar nuevamente la aplicación el archivo ofuscado se generó correctamente, pero el problema se me presenta al generar el instalador.
Hice exactamente lo que me indicaste, esto es: en el proyecto del instalador excluí mi proyecto del Resultado Principal e incluí como ensamblado el archivo ofuscado.
Cuando instalo utilizando el instalador generado la aplicación que se instala no está ofuscada.
Tenés idea de qué puede estar ocurriendo?
Gracias por tu ayuda.
Abrazo.
Jorge

Responder

Daniel Jaimes
Daniel Jaimes

José Mnauel sucede que ofusco mi solución de windows Fomr y funciona bien pero sucede que el único problema es que ya no tengo conexión con un web services que consumia la aplicación. Sabes cuál puede ser el problema?

Responder

José Manuel Alarcón
José Manuel Alarcón

Hola Daniel:

La verdad es que no sé a qué puede ser debido porque dependerá mucho de cómo esté hecha tu aplicación. En principio no debería haber problemas para conectarte a un servicio web, pero puede que al ofuscarlo se construya mal la cadena de texto con la dirección del servicio o algo así, pero no sabría precisarte, lo siento.

Si lo solucionas cuéntanos cómo aquí por si le sirve a alguien más. Gracias.

Saludos.

Responder

Hola buenas, estoy tratando de ofuscar un código de WPF pero no logro hacerlo a alguien le paso lo mismo?

Responder

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.