Durante éste articulo se verá cómo es posible modificar los ensamblados en .NET, de modo que podamos inyectar nuestro propio código .NET o código no manejado en éstas aplicaciones, pudiendo dotarlas de nuevas características como plugins sin que la aplicación original disponga de soporte para ello.
· Reflector
· Reflexil
Para realizar esto se hará uso de un decompilador de .NET (Reflector), un plugin con el que inyectar código IL (Reflexil) y un mínimo de conocimientos del lenguaje .NET y IL.
Antes de comenzar, debemos instalar el plugin ‘Reflexil’ para ‘Reflector’. Para agregarlo, basta con ir a ‘View -> Add-ins -> Add’ y cargar la librería ‘reflexil.dll’ . Una vez cargado, es posible acceder a su menú haciendo clic en ‘Tools -> Reflexil’.

Cargando plugin Reflexil
Ahora, crearemos una pequeña librería en .NET que será la que la aplicación cargará, consiguiendo así la ejecución de código y accesibilidad a sus componentes internos a través de reflexión.
La Liberia será muy sencilla, únicamente cargará un formulario con una imagen y mostrará un mensaje.

Código que cargaremos en la aplicación como DLL.
Una vez tenemos nuestra librería, es necesaria la decompilación de la aplicación sobre la cual queremos realizar la inyección de código, basta con arrastrar el ejecutable sobre el panel de ‘Reflector’, y se nos mostrará un árbol con todas sus métodos, propiedades, etc.

Para saber donde realizar la inclusión de nuestro código se debe localizar el punto de entrada de la aplicación, o el método en el que se desea que se ejecute el código. En mi caso lo realizaré sobre la entrada a la aplicación, en Main(String[]) .
Una vez llegamos a éste punto, es hora de usar ‘Reflexil’ para la inclusión de código IL. Unicamente deberemos inyectar las instrucciones necesarias para que realice la carga de forma dinámica de la librería que hemos creado anteriormente.
No os asustéis, únicamente son cinco instrucciones, y una vez la aplicación esté parcheada no será necesaria volver a modificarla. Basta con hacer clic derecho sobre el panel de ‘Instructions’ del plugin y clic sobre ‘Create new’ para agregar las siguientes instrucciones:
· LDSTR ‘c:\ruta\libreria.dll’
· CALL System.Reflection.Assembly::LoadFile(System.String)
· LDSTR ‘namespace.class’
· CALLVIRT System.Reflection.Assembly::CreateInstance(System.String)
· POP

LDSTR ‘c:\ruta\libreria.dll’

CALL System.Reflection.Assembly::LoadFile(System.String)

LDSTR ‘namespace.class’

CALLVIRT System.Reflection.Assembly::CreateInstance(System.String)

POP
Cuando se busque el método CreateInstance() o LoadFile() en las instrucciones CALL y CALLVIRT, se encontrarán dentro del nodo ‘mscorlib -> CommonLanguajeRuntimeLibrary -> System.Reflection -> Assembly’.

Una vez finalizado, el método modificado debería quedar de forma similar a la siguiente captura de pantalla (En azul está el código inyectado que realiza la carga de la librería):

Una vez finalizado podemos guardar el ensamblado modificado haciendo clic en el nodo del ensamblado en Reflector, y a continuación en ‘Save As’.

Guardando el ensamblado modificado
Si todo se ha realizado correctamente, al ejecutar la aplicación se cargará y ejecutará nuestra librería, consiguiendo así nuestro objetivo, como se puede ver en la siguiente captura de pantalla, donde junto con la ejecución de la aplicación también se ha ejecutado el formulario que desarrollamos en la librería.

También aprovecho para hacer uso de ProcessExplorer, mediante el cual se puede ver como la aplicación tiene cargada en memoria la librería ‘dll.dll’.

Éste ha sido un sencillo ejemplo de los pasos necesarios para la posibilidad de ejecución de código por una aplicación. Esto, junto con conocimientos de reflexión en .NET abre un gran número de posibilidades, donde se puede obtener un gran control sobre la aplicación, ofreciendo la posibilidad de crear o agregar nuevas características a las mismas.
¡Hasta otra!
Enviado
feb 09 2010, 08:02
por
Manuel Fernandez