Jesús Bosch

XNA, programación gráfica y desarrollo de videojuegos por un Microsoft Student Partner

Ofuscación de código

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 Smile

captura

 

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

Posted: 12/1/2011 7:50 por Jesús Bosch | con 14 comment(s)
Comparte este post:

Comentarios

Miemblogs ha opinado:

En .Net es muy fácil decompilar una DLL y obtener el código fuente original (sin comentarios y toda la

# January 12, 2011 8:00 AM

Rafael Ontivero ha opinado:

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...

# January 12, 2011 12:11 PM

Jesús Bosch ha opinado:

@Rafael, pues encima de malo, es de pago :-P

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 :-)

# January 12, 2011 2:27 PM

spaghetti.. ha opinado:

Pues en temas Java, algunas veces usé el JAD para decompilar código..., quedaba más "bonito" como me lo devolvía el decompilador... :)

# January 12, 2011 3:13 PM

Luis Miguel ha opinado:

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

# January 12, 2011 7:17 PM

Jesús Bosch ha opinado:

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 :P

Si comparto quiero que sea una decision mia. Al menos asi lo veo yo.

# January 12, 2011 7:58 PM

Eduard Tomàs i Avellana ha opinado:

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).

# January 12, 2011 8:41 PM

Javier Torrecilla ha opinado:

+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.

# January 12, 2011 9:02 PM

pregunton cojonero ha opinado:

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.

# January 13, 2011 8:55 AM

Luis Miguel ha opinado:

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

# January 13, 2011 9:53 AM

Rafael Ontivero ha opinado:

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.

# January 13, 2011 11:20 AM

Eduard Tomàs i Avellana ha opinado:

@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... :P

# January 13, 2011 1:34 PM

Jesús Bosch ha opinado:

@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-.

# January 13, 2011 3:18 PM

koldo ha opinado:

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.

# July 3, 2011 12:04 PM