Menú de navegaciónMenú
Categorías

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

?id=bdb3bc8b-4a09-4d18-9cc5-b3d1c2eb0f09

Cómo obtener el código fuente de cualquier programa o DLL escrita para .NET (C#)

Imagen ornamental invisible

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 😉

José Manuel Alarcó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é Manuel Alarcón
Archivado en: Lenguajes y plataformas

¿Te ha gustado este post?
Pues espera a ver nuestro boletín mensual...

Suscríbete a la newsletter

La mejor formación online para desarrolladores como tú

Comentarios (1) -

Nestor Linares
Nestor Linares

Solo paso a agradecer el aporte y la clara explicación que das con esta importante herramienta.. Por un error técnico que me obligó a formatear mi PC, perdí un proyecto muy avanzado que tenía en C#, solo me había quedado el ensamblado pero ahora con esto podré recuperar el código fuente nuevamente. Me has salvado de muchas horas de desvelo y por ello te lo agradezco

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.