En .Net es muy fácil decompilar una DLL y obtener el código fuente original (sin comentarios y toda la pesca, pero el código fuente, perfectamente funcional). El caso es que ejecutando una simple búsqueda en Bing se obtiene cómo resultado multitud de herramientas que permiten hacer esto.
¿Cómo evitarlo? Con las herramientas de ofuscación de código. Estas herramientas no impedirán la decompilación del código, pero sí que harán que sea prácticamente imposible entenderlo, y por tanto editarlo y utilizarlo para las malas artes de un programador mal intencionado. La “mala intención” podría consistir en sacar un juego o programa muy parecido al que hemos hecho nosotros.
Siempre es desagradable que copien tu trabajo… más ahún cuando has pasado muchas horas de desarrollo en él. Así que es necesario tener en cuenta el uso de las herramientas de ofuscación de código.
No me habría propuesto escribir este artículo sinó fuera porque en uno de los MSDN Flash de Windows Phone se recomendaba el uso de estas herramientas. No se si para evitar que los testers de Microsoft tubieran la tentación de decompilar alguna DLL, o bien simplemente para evitar que algún posible bug que causase la posibilidad de descargar un XAP a un usuario mal intencionado trajese consecuencias peores.
En cualquier caso, me parece un buen consejo ofuscar el código. ¿Cómo lo hacemos? La própia instalación de Visual Studio trae su herramienta de ofuscación (sólo las ediciones profesionales para arriba). Usar este ofuscador ya se ha escrito en mil sitios, por ejemplo este: http://forum.codecall.net/tutorials/6391-tutorial-visual-studio-2008-obfuscating-dotfuscator.html, así que no voy a repetirme.
Lo que sí me gustaría añadir es el “descubrimiento” de un ofuscador genialmente sencillo, y además gratuito, que encontré hace unos días buscando una de estas herramientas. Se llama EazFuscator.net, y a pesar de lo complicado de su nombre, no creo que exista otro más fácil de usar. Esto es así porque simplemente tenemos que arrastrar y soltar un proyecto sobre la aplicación para ofuscar la DLL resultante de la compilación en modo release del mismo
Aquí podéis leer más acerca de este ofuscador de código y también descargarlo:
http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.aspx
En .Net es muy fácil decompilar una DLL y obtener el código fuente original (sin comentarios y toda la
Nunca antes había probado el Dotfuscator que viene con el Visual Studio y… menuda decepción de ofuscador.
Lo único que hace es cambiar el nombre de las clases y los métodos, pero el código sigue estando ahí sin variar, con lo que algoritmos, procesos, etc (que creo es lo que vale la pena proteger), siguen estando a la vista de todos…
@Rafael, pues encima de malo, es de pago 😛
En el fondo todos los ofuscadores hacen eso, «enguarrar» el código, pero el código no deja de ser eso, y al final puedes compilarlo. Pero hay maneras y maneras de ensuciar el código para que sea inutilizable 🙂
Pues en temas Java, algunas veces usé el JAD para decompilar código…, quedaba más «bonito» como me lo devolvía el decompilador… 🙂
Bueno, todo es opinable. Personalmente prefiero que mi trabajo se use y que se mejore. Siempre he desarrollado código abierto y pienso seguir haciéndolo. ¿Que usan tu código? Bueno, es como si tararean una canción que has creado 😉
Es más, como desarrollador me inspira más confianza el sw abierto porque además puedo encontrar con más facilidad dónde falla algo cuando tengo un error (cosa bastante complicada muchas veces con esas DLLs cerradas que tú comentas).
También podrías ofuscar tu blog y no lo haces (y me alegro porque me gusta y aprendo mucho 😉 )
Saludos, Jesús.
— lm
Uyyy esto podría abrir el eterno debate del open source… Yo si invierto dinero en mi empresa para hacer un producto, no me gusta que mis posibles competidores me plagien… Todo hipoteticamente hablando 😛
Si comparto quiero que sea una decision mia. Al menos asi lo veo yo.
MMMmmm…
Yo creo que la única manera REAL de proteger tu código, teniendo en cuenta de que no lo quieras open source (que eso ya es decisión de cada cual y a veces ni eso), es mediante términos legales. El resto son apaños 🙂
Al margen de esto, los ofuscadores ayudan, obviamente. Es cierto que el que viene con VS sólo cambia los nombres de las variables (aunque eso es suficiente para evitar que muchos copien el código, no servirá de nada si alguien está realmente interesado en cómo hemos hecho algo), pero creo que porque es la versión gratuita (creo que hay una de pago que hace más cosas).
De todos modos yo prefiero que las DLL que uso estén sin ofuscar (no por copiar nada): a veces gracias a Reflector he visto como el Framework hacía determinadas cosas que me han ayudado a programar mejor o entender un «comportamiento extraño» (this behaviour is by design :p).
Un saludo! 😉
PD
>Si comparto quiero que sea una decision mia. Al menos asi lo veo yo.
Yo también, por supuesto! Cada uno es libre de decidir y los demás deberíamos respetar las decisiones de cada uno (y eso pasa por «no copiar» quien no quiere compartir).
+1 a lo que comentan @Jesus y @Eduard, yo soy quien deci si mi código se puede usar o no, para algo cada uno es libre de postear su código libremente, pero cuando se trata de procesos de negocio, dudo que alguien quiera que su competencia gane dinero gracias a el.
Lo bueno del Reflector es que puedes ver el código decompilado, y en muchas veces puede salvarte de muchas situaciones. Por lo que sea tienes dos dlls con el mismo nombre, versión, public token, pero el código IL es distinto, es lo típico (y mal hecho) de hacer cambios en el código y no cambiar la versión (por temas que se escapan a tu control).
Lo ideal sería que ofuscado o no, se pudiera comparar dos dlls con el mismo nombre, versión, public token y saber si tienen el mismo código IL.
debería apostarse más por el open source, y mejoras de la comunidad, pero también defender el trabajo realizado.
jeje, @Jesús, no es un eterno debate. Lo veo más como una decisión y un modelo de negocio. Si una librería tuya está protegida por una licencia, yo seré el primero en no usarla en un proyecto libre aunque no esté ofuscada 😉
Opino como @Eduard que lo más seguro son las licencias. De hecho en muchos desarrollos libres se evitan licencias víricas para permitir otros desarrollos comerciales privativos.
— lm
Mola haberla liado parda. 🙂
Evidentemente a nivel empresarial la protección viene de la licencia, no de la ocultación de código, peeeeeeeeero… recordemos por ejemplo cómo MS «envolvió» el driver de Stacker para hacer su DrvSpace… lo que supuso una llegada a los tribunales y la desaparición de Stacker pese a que ganó…
Con eso me refiero a que, suponiendo un algoritmo genial de lo que sea y para lo que sea en C#, sería trivial copiarlo y modificarlo basándote en él. Imaginaros que alguien adivina cómo hacer reconocimiento facial infalible, hace y vende una aplicación hecha en .NET, llega la competencia y descubre el algoritmo secreto con un mero Reflector… Ya tiene la basa para hacer su propio algoritmo infalible… sin copiarlo. A eso me refiero.
Yo soy partidario de que la información debe ser libre, pero a veces entiendo a empresas que invierten una espuerta de dinero en algo que luego les va a copiar cualquier mindundi sólo por el hecho de haberlo escrito en .NET… Lo que para mi es otra razón más para NO usar .NET.
@Rafael
Tienes razón, ciertamente! 😉
En este caso, la empresa que crea el algoritmo hará bien en implementarla en código nativo. Esto forma parte de la decisión tecnológica de dicha empresa.
Y además, eso no implica tener que realizar TODA la aplicación en código nativo: basta con realizar la parte que queramos «proteger».
Pero tampoco olvidar usar licencias y patentes. Aunque mejor no mencionemos nada de patentes que eso sí que es abrir la caja de pandora… 😛
@Eduard, a código nativo? vas fuerte eh… que somos programadores de .Net hombre xD
Por cierto, en el tech-ed se comentó que WP7 soportaría código nativo -ahora que yo sepa no lo hace, al menos la mayoría de desarrolladores no tenemos acceso a ello-.
EazFuscator.net está muy bien, además funciona con windows phone y es gratuito, que mas se puede pedir?
Pero tiene una pega, que casca que da gusto si utilizas en tu proyecto wp7 el Microsoft Silverlight Analytics Framework.4 para google analytics.
Cuando compilas en release (habiéndole indicado a EazFuscator.net que ofusce el proyecto cuando compiles en release) salta un NullReferenceException was unhandled, que es justamente debido al Microsoft Silverlight Analytics Framework.4.
Con lo que es una pena que al ser uno de los pocos ofuscadores gratuitos que hay, no funcione si le metes el google anlytics a tu código, por lo que si eres un desarrollador indi pues te quedas sin opciones (a no ser que pagues) si quieres proteger el codigo de tu app.
Otra opción para que funcione EazFuscator.net, es quitar el analytics, pero entonces no conocerás el uso de tu app por parte de los usuarios.