2012-10-11 53 views
7

Estoy tratando de descompilar el control ComboBox para mi aplicación de la Tienda Windows en C#, pero no hay código. En cambio, parece que todas las propiedades son llamadas a un ensamblaje separado. ¿Cómo encuentro dónde existe el código real y cómo leo los cuerpos del método en C#? No puedo leer el ensamblaje, así que no me haría bienArchivo .winmd descompuesto no contiene nada más que llamadas externas

Respuesta

1

Así que encontré el ensamblaje. Simplemente tiene que buscar el archivo .dll en el sistema (por ejemplo, Windows.XAML.UI.Controls.dll en mi caso), pero no es posible desensamblarlo en C#. Resulta que no hay desensambladores de C# para los ensamblajes de WinRT (al menos, cuando miré por última vez)

+0

IDA debería funcionar si desea ver el código de ensamblado. – sarvesh

+0

@iaimtomisbehave me recuerda que olvidé mencionar que estaba buscando el código C#, no el código de ensamblaje. No intenté descompilar para ensamblar, y no puedo decir si eso funciona o no. He editado la pregunta para reflejar eso. – CamronBute

14

Algunas notas sobre cómo realizar ingeniería inversa en las partes internas de WinRT.
Debajo del capó, WinRT es puro COM. En primer lugar que desea buscar en su máquina es

C:\Program Files (x86)\Windows Kits\8.0\Include\WinRT 

Este directorio contiene archivos IDL, o Interface Description Language. IDL es el punto de partida para describir los tipos COM. Una búsqueda rápida de ComboBox le permitirá encontrar Windows.UI.Xaml.Controls.IDL y la declaración para el tipo ComboBox:

[marshaling_behavior(agile)] 
    [threading(both)] 
    [static(Windows.UI.Xaml.Controls.IComboBoxStatics, 0x06020000)] 
    [version(0x06020000)] 
    [composable(Windows.UI.Xaml.Controls.IComboBoxFactory, public, 0x06020000)] 
    runtimeclass ComboBox : Windows.UI.Xaml.Controls.Primitives.Selector 
    { 
     [default] interface Windows.UI.Xaml.Controls.IComboBox; 
     [overridable] interface Windows.UI.Xaml.Controls.IComboBoxOverrides; 
    } 

Es un poco legible como está, parecido a una declaración de interfaz en C#. Si ha jugado con COM antes, verá nuevos atributos a partir de la sintaxis original de IDL. Material adicional para ayudar a la proyección de lenguaje integrado en la biblioteca de soporte de tiempo de ejecución para crear la ilusión de que WinRT admite herencia de implementación, genéricos y miembros de clase estáticos, características que COM puro no tiene.

Estos archivos IDL están compilados por midlrt.exe en un formato legible por máquina que se puede utilizar con herramientas como los compiladores. Usted ya conoce ese formato, la salida de midlrt.exe es un archivo .winmd. De forma similar a las bibliotecas de tipos anteriores pero muy mejoradas, el formato subyacente se adoptó desde .NET's assembly manifest format. Descompilar el archivo .winmd no es útil, ya tiene el origen en su máquina;)

Como es común en COM, el registro se usa para encontrar el ejecutable que contiene el código para un servidor COM. Comience regedit.exe y navegue hasta HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId. Encontrará una lista de todos los tipos de WinRT que una aplicación puede crear. La clave Windows.UI.Xaml.Controls.ComboBox es la que le interesa. Tenga en cuenta el valor DllPath, que apunta a la DLL que contiene el código: C:\Windows\System32\Windows.UI.Xaml.dll en mi máquina. El valor de CLSID es el guid de clase COM familiar, que se usa para pedirle a la fábrica de la clase que cree la instancia.

Ahí es donde golpeas la pared; el archivo DLL contiene código nativo como lo hacen la mayoría de los servidores COM. Escrito en C++ y compilado a código máquina. Muy impermeable a la descompilación, es un monstruo de 18 megabytes.

Cuestiones relacionadas