Ingeniería inversa de una aplicación Metro: más fácil que nunca

Andaba yo esta mañana mirando mis fuentes de noticias cuando me encuentro con esta entrada: Your Metro-style app needs protection and here is why.

En principio no me lo creí, o pensé que el contenido venía de versiones anteriores a la última Release Preview de Windows 8. Pero no, es completamente cierto.

Todos debéis saber que realizar ingeniería inversa a un programa escrito en .NET es cosa de minutos y es una tarea enormemente sencilla incluso si la aplicación está ofuscada. Si no lo está, podemos obtener el código fuente completo tal y como lo escribió el autor, y encima en el lenguaje que queramos.

Esto nos da un truco muy sencillo para usar código de terceros escrito en un lenguaje .NET que no conocemos. Tomamos el código a copiar, creamos una aplicación, le aplicamos un Reflector (que es como se llaman a estos programas) y obtenemos el código fuente en el lenguaje deseado, ya sea VB.NET, C# o incluso C++/CLI.

Si el programa está ofuscado la ingeniería inversa es algo más difícil, pero con un poco de práctica es posible convertir el resultado en algo legible. No obstante, si queremos copiar un bloque de código o ver cómo está hecha una cosa, no necesitamos más. Copiamos, pegamos y listo. A ver, no es tan fácil, pero un ofuscador de código lo único que hace es cambiarle el nombre a todo y allí donde es posible, separar o juntar cosas. Nada que un experto medianamente espabilado no pueda deshacer.

Pues bien, las aplicaciones Metro en Windows 8 todavía son más fáciles de desensamblar. Estoy intentando instalarme un programa de demo, pero todavía no sé cómo se hace localmente pese a tener el paquete listo para su instalación.

Mientras averiguo eso, podéis jugar un ratín como he jugado yo. Lo primero de todo es hacer que la carpeta “C:Program FilesWindowsApps” esté visible. Para ello abrimos la ventana de Windows Explorer en el escritorio y en la opción “View” del menú, seleccionamos “Options”. Allí, en la pestaña “View”, marcamos “Show hidden files, folders and drives” y ya de paso, también “Hide extensions for known file types”, que no es imprescindible pero ayuda.

Ahora ya podemos ver la carpeta WindowsApps. Desde el explorador de Windows nos dice que no podemos entrar. Podríamos tomar control de la carpeta, pero al menos yo no lo he hecho, ya que abriendo una consola de comandos con permisos elevados podemos entrar y ver el contenido:

clip_image002

Vaya. Tenemos acceso a todas las aplicaciones Metro instaladas… Aunque podemos navegar por ellas desde la ventana de comandos, también podemos copiarlas a otro destino con el comando “xcopy <origen> <destino> /r/s”. Y eso es lo que he hecho. Me he movido el “Reader” de Microsoft.

Y ahora puedo entrar sin tocar nada de nada:

clip_image004

Interesante, ¿no? Tenemos archivos XAML, ejecutables, imágenes, metadatos, todos ellos al alcance de la mano. Dos pantallazos más:

clip_image006

clip_image008

Creo que es suficiente, ¿no?

Pues no, ahora vamos a abrir y desensamblar algún ejecutable. La aplicación Reader que hemos estado viendo parece ser que es binaria (luego volveremos sobre ello), pero por ejemplo la “BingFinance” es .NET pura y encima está sin ofuscar:

clip_image010

En la imagen de arriba vemos dos ficheros de dicha aplicación abiertos de… esto… piernas.

***

Pero todavía hay más. Vamos a echar un vistazo a un par de aplicaciones escritas por uno mismo. La primera es un SplitView en C++ tal y como sale del asistente de Visual Studio 2012RC. Entre otras cosas genera dos ficheros “ejecutables”. Un EXE tradicional, que es binario o al menos así lo parece, y otro con la extensión Winnmd y el mismo nombre. Este sí que es manejado, pero parece ser que sólo contiene las exportaciones a WinRT. Tampoco tengo claro qué es, aunque parece ser que WinRT necesita las exportaciones del programa y MS lo ha solucionado de esta manera. En fin, aquí esta:

clip_image012

Ahora veamos la misma aplicación tomada del asistente de C#. En este caso sólo hay un ejecutable, el propio programa que es desensamblable por completo:

clip_image014

***

¿Os mola? A mi nada de nada. Esperemos que Microsoft se ponga las pilas con esto, porque si no mal vamos.

6 comentarios sobre “Ingeniería inversa de una aplicación Metro: más fácil que nunca”

  1. Pues no le digo nada a los amantes de ClickOnce:

    C:UsersxxxxxAppDataLocalApps

    Ni que decir tiene la seguridad de las aplicaciones de Windows Phone….

    Creo que Microsoft hace años que tiene una tarea pendiente con la plataforma .Net y la seguridad del código…

  2. @Rafa, tal vez me he perdido de algo, pero … porqué te extrañas de esto? si es así de siempre. Eso sí, lo único que tiene un gustillo extraño es no ver Reflector en los screenshots del post, que mal que le ha hecho RedGate al mundo 😉

    Saludos

  3. Yo si que me he perdido algo…. desde luego…

    ¿Que es lo que te preocupa? Que no puedan ver tu código o que no lo puedan cambiar??? Con respecto a lo primero como en Java, o cualquier codigo intermedio, es lo que hay, pero desde luego en c++ también se pueden hacer cosillas por lo que no veo el problema, si no quieres enseñar tu código lo puedes ofuscar, pero siempre hay cosas, al igual que en Java y al igual que podemos hacer en c++ con algunos truquillos.

    Con respecto a la firma, tampering etc… no se que comentas la verdad, porque desde sus inicios tienes Authenticode para la firma tio, no te entiendo la verdad, para evitar tampering tienes sn etc… por lo que además del efecto «publi» no veo más problemas

    Unai

  4. @Unai, ni se te ocurra comparar hacer ingeniería inversa de C++ contra la de .NET… Como del día a la noche. Mientras que una cosa es trivial, la otra es, como poco, enormemente difícil.

    Los ofuscadores de .NET que he visto son, básicamente, una mierda porque lo único que hacen es reordenar el código y renombrar variables…

    Y sí, el tampering, certificados, todo eso no impide coger un exe o una dll de .net y ver su código fuente de manera más que trivial. No me mezcles churras con merinas.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *