Modificación e inyección de código en ensamblados .NET

Windows Técnico

Sindicación

Proximos HOLs

Loading...

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

clip_image002

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.

clip_image004

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.

clip_image006

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

 

clip_image008

LDSTR ‘c:\ruta\libreria.dll’

clip_image010

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

clip_image012

LDSTR ‘namespace.class’

clip_image014

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

clip_image016

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

clip_image018

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

clip_image020

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

clip_image022

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.

clip_image024

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

clip_image026

É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
Archivado en: ,,,

Comentarios

Anónimo escrito re: Modificación e inyección de código en ensamblados .NET
en 02-10-2010 23:07

¿Por qué es necesario sacar un dato de la pila al finalizar las llamadas con POP? ¿No has metido ningún dato en ella, no?

Manuel Fernandez escrito re: Modificación e inyección de código en ensamblados .NET
en 02-11-2010 9:54

Realmente no se el motivo por el cual debe estar la instrucción POP, pero sin ella no funciona.

Las instrucciones las saqué creando la carga de la librería en .NET, y pasando el código a IL

Anónipop escrito re: Modificación e inyección de código en ensamblados .NET
en 02-11-2010 12:10

Porque cuando haces pop ya no hay stop

Juan Antonio escrito re: Modificación e inyección de código en ensamblados .NET
en 02-13-2010 16:56

Gran post Manu, tiene buena pinta la técnica, y por gracia y/o desgracia muchas aplicaciones maliganas =). A ver si saco esta semana un ratito para probarlo, si te llega algun fichero mio adjunto en algun correo yo no lo abriria :P

un saludo!

Añadir un comentario

(requerido)  
(opcional)
(requerido)  
Recordarme
If you can't read this number refresh your screen
Enter the numbers above: