Decompilar una aplicación .NET

Visual StudioCuando se compila una aplicación de .NET, el Visual Studio nos crea los archivos binarios de la aplicación, .EXE o .DLL, estos archivos son referidos como ensamblajes, un ensamblaje consta de dos partes. Codigo MSIL y los Metadatos

  • Código MSIL (Microsoft Intermediate Language, tambien lo llaman IL) – Es el lenguaje intermedio común de toda aplicación .NET, esto significa que cuando una aplicación .NET es compilada, el código de alto nivel que tu escribes ya se C# ó Visual basic .NET es compilado en el lenguaje intermedio IL, y el IL es executado por la CLR (Common Language Runtime) cuando se ejecuta la aplicación.
  • Metadatos – en adicion al código fuente IL, el ensamblaje tambien contiene información extra acerca de la version, nombre del producto, nombre de la empresa que lo desarrollo, seguridad, etc etc.

El código MSIL es llamado lenguaje intermedio porque no es un lenguaje que cualquier computadora pueda procesar nativamente, osea que tu procesador no puede executar el código IL que esta en tu ensamblado, un procesador tiene que recibir instrucciones precisas y de un lenguaje particular llamado lenjguaje maquina, pero esa ya es otra historia. Para que una computadora pueda ejecutar instrucciones IL, estas instrucciones IL tienen que ser traducidas al lenguaje maquina y eso es precisamente lo que hace la CLR del Framework .NET actua como traductor entre el lenguaje intermedio y el lenguaje maquina.

Cuando compilas una aplicación .NET, el código fuente es traducido a código IL de una manera bastante sencilla, o sea hay una simetría muy aproximada entre cada línea del código de alto nivel (C# o VB .NET) y el código IL resultante. Puesto que hay una correlación aproximada entre el código de alto nivel y el código IL, es posible tomar el código IL de un ensamblaje y convertirlo en el código equivalente de C# o VB.NET, a la fecha ya hay varios programas gratuitos y de paga que logran hacer esto. .NET Reflector, Telerik JustDecompile, JetBrains dotPeek por mencionar algunos.

En este artículo mostrare como usar uno de estos programas, usare .NET Reflector, con este programa puedes examinar el código fuente de cualquier aplicación .NET ya sea, ASP.NET, WinForms, de consola, librerias de clases, e incluso aplicaciones Silverlight, para las aplicaciones Silverlight solo es necesario descomprimir el archivo XAP que no es mas que un archivo ZIP que contiene los archivos binarios. Incluso puedes ver el código de las librerias base del Framework .NET.

Nos descargamos el .NET Reflector de esta página http://www.red-gate.com/products/dotnet-development/reflector/, tiene una prueba gratuita de 14 dias.

Una vez descargado e instalado, seleccionamos la Framework 4.0, y el sistema nos agregara las librerías base del Framework 4.0, dejándonos esta pantalla.

Pantalla inicial de .NET Reflector

Pantalla inicial de .NET Reflector

 

En la barra lateral izquierda tenemos los ensamblados importados, por default nos agrega estas librerías base del Framework 4.0, de lado derecho muestra la información del ensamblado, si seleccionamos el ensamblado System, y expandimos su contenido, nos mostrara System.dll y un folder llamado Resources que contiene las imágenes y otros recursos importados al ensamblado. Al expandir el módulo System.dll, nos encontramos con todas las clases que hay dentro de esa librería. Al seleccionar una clase nos muestra su código fuente del lado derecho.

Hice un pequeño programa para hacer una demostración, este programita contiene una caja de texto pidiendo una contraseña y un botón para validar la contraseña escrita en la caja de texto, la contraseña esta dentro del código fuente como un string.

Mostrare unas screenshot de como importar el programa demo en el .NET Reflector.

File - Open assambly

File – Open assambly

Seleccionar nuestro ensamblado

Seleccionar nuestro ensamblado

Metadatos de nuestro ensamblaje

Esta informacion son los metadatos de nuestro ensamblaje

Visualizacion del código fuente del ensamblado

Visualizacion del código fuente del ensamblado, vemos que llama a la función ValidarContraseña() y dependiendo si devuelve true o false muestra el mensaje correspondiente.

Visualización de la funcion ValidarContraseña()

Aquí vemos que solo compara la caja de texto con el string potatoes

 

Anexo el programa de ejemplo por si quieren comprobarlo ustedes mismos.
Applicación de ejemplo

 
En próximas publicaciones hablaré de como proteger tus aplicaciones contra el decompilado, esto se logra mediante obfuscadores, que a resumidas cuentas hacen menos legible la lógica de la aplicación, renombrando los nombres de las clases y funciones y reemplazando las funciones por delegates, así que si te al tratar de descompilar una aplicación te topas con esta situación ya sabes que le aplicaron un obfuscator pero no te preocupes siempre existe alguna forma de aplicarle ingeniaría inversa a un proceso, para eso existen los deobfuscatores =P.

Etiquetado con: , , ,
Publicado en: Ingeniería inversa