Cómo realizar ingeniería inversa en una aplicación de Windows C# sin el código fuente disponible
En algunos proyectos nos encontramos con la situación de tener que hacer cambios en una aplicación existente en C# para Windows, pero sin acceso al código fuente (el desarrollador anterior se negó a proporcionarlo). La mayoría de los desarrolladores han experimentado una situación similar en la que no se puede encontrar el código fuente; a veces, el código fuente desaparece o se pierde.
Empezando
El punto de partida para realizar una ingeniería inversa es obtener los archivos DLL o EXE de los que deseas aprender su funcionamiento interno. El siguiente paso es localizar una herramienta para descompilar los archivos (este puede ser el primer paso, pero ¿para qué necesitas una herramienta sin los archivos?). Existen varias herramientas disponibles, pero el Framework .NET incluye su propia herramienta llamada Ildasm (Desensamblador MSIL). Se instala como parte de Visual Studio y Windows SDK, por lo que puedes acceder a ella a través del símbolo de sistema de Visual Studio o el símbolo de sistema de Windows SDK.
Ildasm toma un archivo que contiene MSIL como entrada (un archivo DLL o EXE) y genera código fuente adecuado para la herramienta del ensamblador (Ildasm.exe). El siguiente comando toma el archivo dll como entrada y genera el archivo de salida especificado (que contiene MSIL).
Ildasm archivoCompilado.dll /output:TRTest.il
A continuación se muestra un fragmento de MSIL generado por el comando Ildasm anterior.
.module archivoCompilado.dll // MVID: {F5233C6F-701D-4E6B-BA37-ECCAA0B22083} .imagebase 0x11000000 .file alignment 0x00001000 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY // Image base: 0x03370000 // =============== CLASS MEMBERS DECLARATION =================== .class interface public abstract auto ansi archivoCompilado.IUpdatableControl { .method public hidebysig newslot specialname abstract virtual instance bool get_UpdateAfterCallBack() cil managed { } // end of method IUpdatableControl::get_UpdateAfterCallBack .method public hidebysig newslot specialname abstract virtual instance void set_UpdateAfterCallBack(bool 'value') cil managed { } // end of method IUpdatableControl::set_UpdateAfterCallBack .method public hidebysig newslot specialname abstract virtual instance bool get_AutoUpdateAfterCallBack() cil managed { } // end of method IUpdatableControl::get_AutoUpdateAfterCallBack .method public hidebysig newslot specialname abstract virtual instance void set_AutoUpdateAfterCallBack(bool 'value') cil managed { } // end of method IUpdatableControl::set_AutoUpdateAfterCallBack }
Esto puede resultar difícil de leer y analizar, pero es posible. Puedes realizar cambios en el MSIL y enviarlo al ensamblador (Ildasm.exe).
Explorando otras opciones
He utilizado otras herramientas que simplifican el proceso, como Red Gate's Reflector, pero ya no es gratuito: ahora se requiere su compra después de un período de prueba. Sin embargo, permite descompilar código y presenta los resultados en una interfaz fácil de leer. La Figura A muestra los resultados de un DLL. La parte inferior derecha de la interfaz muestra los resultados del análisis y las dependencias.
Figura A
La interfaz de Reflector simplifica la ingeniería inversa de código. (Haz clic en la imagen para ampliarla.)
Aquí hay tres opciones disponibles más, todas ellas gratuitas:
- Dotnet IL Editor (DILE) te permite desensamblar y depurar código .NET.
- dotPeek te permite descompilar y ver los resultados.
- ILSpy es un navegador de ensamblados y descompilador de código fuente abierto.
Estas son solo unas muestras de las herramientas disponibles.
Instalación de obstáculos
Aunque no puedes evitar por completo que otros desensamblen archivos o código de tu aplicación, puedes dificultarles el proceso utilizando diversas técnicas. Puedes:
- Utilizar ensamblados con nombre fuerte que incorporen firmas digitales y claves públicas.
- Utilizar Microsoft Authenticode.
- Alejarte de la práctica frecuente de enviar versiones de depuración de una aplicación. Estas versiones incluyen una gran cantidad de información relacionada con la depuración que es útil en el proceso de ingeniería inversa.
- Considerar el uso de ofuscación, que convierte tu código y símbolos en datos incoherentes pero mantiene la lógica. Microsoft ofrece la herramienta Dotfuscator para la ofuscación, pero las herramientas de terceros de proveedores como Red Gate son aún mejores.
Resumen
Independientemente de la razón empresarial para realizar una ingeniería inversa del código, es una habilidad útil para usar en tu trabajo diario según sea necesario.
¡Mantén tus habilidades de ingeniería actualizadas suscribiéndote al boletín gratuito de Ingeniero de Software de Newsmatic, que se envía todos los martes!
En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Desarrollo, allí encontraras muchos artículos similares a Cómo realizar ingeniería inversa en una aplicación de Windows C# sin el código fuente disponible , tenemos lo ultimo en tecnología 2023.
Artículos Relacionados