反编译的.winmd文件只包含外部调用

时间:2012-10-11 16:02:30

标签: reflection windows-8 microsoft-metro

我正在尝试将我的Windows应用商店应用的ComboBox控件反编译为C#,但是没有代码。相反,所有属性都是对单独程序集的调用。如何找到真实代码的存在位置,以及如何在C#中读取方法体?我无法读取装配,所以这对我没有好处

2 个答案:

答案 0 :(得分:14)

关于如何对WinRT内部进行逆向工程的一些注意事项 在引擎盖下,WinRT是纯粹的COM。你要在机器上看的第一个地方是

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

此目录包含IDL文件或Interface Description Language。 IDL是描述COM类型的起点。通过快速搜索ComboBox,您可以找到Windows.UI.Xaml.Controls.IDL以及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;
    }

它有点可读,类似于C#中的接口声明。如果您之前使用COM修改过,那么您将看到原始IDL语法中的新属性。额外的东西,以帮助构建到运行时支持库中的语言投影,以创建WinRT支持实现继承,泛型和静态类成员,纯COM没有的功能的错觉。

这些IDL文件由midlrt.exe编译为机器可读格式,可供编译器等工具使用。您已经知道该格式,midlrt.exe的输出是.winmd文件。类似于旧的类型库但大大增强,基础格式从.NET's assembly manifest format采用。因此,对.winmd文件进行反编译是没有用的,您已经拥有了计算机上的源代码;)

在COM中很常见,注册表用于查找包含COM服务器代码的可执行文件。开始regedit.exe并导航至HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId。您将找到应用可以创建的所有WinRT类型的列表。 Windows.UI.Xaml.Controls.ComboBox密钥是您感兴趣的密钥。请注意DllPath值,该值指向包含代码的DLL:C:\Windows\System32\Windows.UI.Xaml.dll在我的计算机上。 CLSID值是熟悉的COM类guid,用于请求类工厂创建实例。

这就是你撞墙的地方; DLL包含大多数COM服务器所做的本机代码。用C ++编写并编译成机器代码。非常不受反编译的影响,它是一个18兆字节的怪物。

答案 1 :(得分:1)

所以我找到了集会。您只需在系统上搜索.dll文件(例如,在我的情况下是Windows.XAML.UI.Controls.dll),但是无法将其反汇编为C#。事实证明WinRT程序集没有C#反汇编程序(至少,当我看上去时)