En este vídeo te voy a contar cómo puedes ver el código fuente de cualquier ejecutable o DLL creado con la plataforma .NET, incluyendo .Net clásico, .Net core y .Net. De este modo podrás analizar el código de los programas y entender cómo funcionan aunque no tengas el código fuente. Vamos a verlo...
Lo que te voy a contar sirve para .Net pero se puede conseguir lo mismo para casi cualquier lenguaje o plataforma, y es igual de fácil, por ejemplo, en la plataforma Java. También ten en cuenta que se pueden tomar medidas para impedirlo usando herramientas especiales llamadas ofuscadores, que complican tanto el código que no te sirve de nada obtenerlo de la forma que te voy a contar hoy. Pero esto es tema para otro día. Hoy vamos a ver cómo decompilar fácilmente código .Net.
La herramienta que vamos a utilizar se llama ILSpy. Hay más, pero ésta es de las más conocidas y además es totalmente gratuita y Open Source. La mantiene el programador austriaco Siegfried Pammer y, bueno, lleva ya un montón de años.
Solo tienes que venir a esta página, e irte a la zona de Releases
. Fíjate en que te ofrece, a lo mejor en este momento, una versión preview que a lo mejor no es todo lo estable que debiera, con lo cual yo te recomiendo que te bajes la última versión estable. Para ello si te sale una preview o una beta aquí, lo único que tienes que hacer es ir hacia abajo hasta que te salga una que no lo ponga. Por
ejemplo, en este caso la última estable es la 6 2.1. Le das a los assets y verás que tiene esa parte del código fuente dos formas de descargartela. La primera es un complemento para Visual Studio y la otra es un ejecutable que puedes utilizar de manera independiente. Yo te recomiendo este último, sobre todo para empezar.
Entonces, lo único que tienes que hacer es descargarlo. Como ves es un ZIP. Bien. Lo único que tienes que hacer para usarlo es descomprimirlo y listo. La puedes añadir al menú de inicio desde donde la hayas copiado para luego poder utilizarla siempre, y lo único que tienes que hacer es doble clic, y lanzarla.
Como ves, ya de entrada te saca una serie de bibliotecas del propio sistema. Por ejemplo, la biblioteca base de clases de .Net, con lo cual tienes todo el código fuente de la plataforma, aunque esto tampoco es ninguna novedad porque realmente lo tienes ya Open Source en GitHub, pero puedes examinar cualquier clase o cualquier elemento de código de .Net y ver cómo está hecha.
Ahora voy a entrar en detalle en cómo funciona toda esta parte, pero antes te voy a enseñar un ejemplo concreto que he creado para que veamos cómo funciona y luego te cuento más detalles sobre esto. Para eso tengo aquí este ejemplo que es súpersencillo: es una aplicación que lo único que tiene es un código que lo que hace es mostrar por pantalla a la hora actual y toma un parámetro que puede ser -b
o --batch
desde la línea de comandos. Para eso utiliza un paquete NuGet que se llama CommandLineParser
, es decir otra DLL de la cual depende. Lo hago así porque me interesa que veas de qué manera esta herramienta incluso te va a las DLLs dependientes.
Esto lo compilas y en, este caso, imaginemos que has perdido el código fuente o es un programa de otra persona y quieres ver cómo está hecho. Bueno, pues para eso tengo aquí el ejecutable y ha compilado. Fíjate que está el ejecutable y además ese paquete que te decía que del cual dependía. Lo único que hay que hacer para descompilarlo con ILSpy es arrastrarlo encima.
Fíjate que aquí tengo el ejecutable, y que si ahora despliego, automáticamente tengo todos los elementos del programa. Por ejemplo, está el espacio de nombres principal de la
aplicación. Despliego y tengo el programa, y dentro de éste tengo el método main
que te enseñaba hace un momentito. Fíjate en que el código es prácticamente igual. Faltan cosas, como por ejemplo esta anotación de aquí y algún detalle (porque eso es azúcar sintáctico que luego se transforma en código real, que es el que se descompila), pero el código es exactamente el mismo.
ILSpy lo que hace es que, en cuanto pulsamos en cualquier elemento, nos saca el código fuente en el lenguaje que le digamos. Y además fíjate que en este caso como éste código depende de código que está en esa otra DLL, en la que hablaba hace un momento, está aquí en CommandLineParser.dll
. Ya nos la abre automáticamente aquí, y la pone en otro color para que sepamos que
es un ensamblado que has abierto como dependencia, no tú manualmente. Y podemos también examinarla. No sólo eso, sino que si nos ponemos encima, por ejemplo, de esta
línea que utiliza nuestro código, al pulsarla me lleva a la clase relacionada, pero incluso si voy aquí a un método, me manda directamente a la clase y al método concretos también. Con lo cual puedo ver el código fuente también de esta clase: es decir no sólo me saca el código que me interesa en el momento que yo se lo digo, sino que además puedo navegar por ese código y ver el resto del código fuente de las DLLs y de los elementos que estén relacionados con el programa que estoy analizando, con lo cual es muy potente.
Fíjate además en que te deja escoger el lenguaje entre C# o lenguaje intermedio (IL), que es el lenguaje al cual se compila C# por parte del compilador de .Net. Éste es mucho más complicado de leer porque es casi código máquina, pero incluso nos permite mezclarlo y nos saca el código en C# y el equivalente en lenguaje intermedio. Si escojo lenguaje C#, me deja
incluso escoger qué versión concreta de C# me interesa: por ejemplo ahora está con C# 9, pero podría incluso una versión súper antigua como C# 1.0. En ese caso me saca un código bastante marciano, pero lo puedes ver en otras versiones. En este ejemplo son todas iguales, pero si me voy a otras versiones podría ser que este código variará en función de las características que soporte esa versión. Como vemos es súperpotente y tiene más posibilidades aún que te comento en el vídeo.
Esto es muy interesante para aprender, para depurar e incluso para salvarnos de algunos problemas de vez en cuando. Y no es algo exclusivo de .Net, porque se puede hacer también en otras
plataformas. En otra ocasión podemos hablar de cómo evitarlo usando unas herramientas específicas llamadas ofuscadores.
Espero que te haya resultado interesante y te haya abierto un nuevo mundo de posibilidades 😉