7

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

4

2 回答 2

15

关于如何对 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 的程序集清单格式。所以反编译 .winmd 文件没有用,你的机器上已经有了源代码;)

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

那就是你碰壁的地方;DLL 包含本机代码,就像大多数 COM 服务器一样。用 C++ 编写并编译为机器代码。完全不受反编译的影响,它是一个 18 兆字节的怪物。

于 2013-02-04T02:04:32.233 回答
1

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

于 2013-02-03T14:37:36.097 回答