有关如何对 WinRT 内部结构进行逆向工程的一些说明。
在底层,WinRT 是纯 COM。您要在机器上查看的第一个位置是
C:\Program Files (x86)\Windows Kits\8.0\Include\WinRT
该目录包含 IDL 文件,或者Interface Description Language https://en.wikipedia.org/wiki/Interface_description_language。 IDL 是描述 COM 类型的起点。快速搜索ComboBox
会让你找到Windows.UI.Xaml.Controls.IDL
以及声明ComboBox
type:
[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
is a .winmd
文件。与旧的类型库类似但得到了很大的增强,底层格式采用了.NET 的程序集清单格式 http://msdn.microsoft.com/en-us/library/1w45z383%28v=vs.71%29.aspx。因此反编译 .winmd 文件没有用,您的计算机上已经有了源代码;)
正如 COM 中常见的那样,注册表用于查找包含 COM 服务器代码的可执行文件。开始regedit.exe
并导航至HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId
。您将找到应用程序可以创建的所有 WinRT 类型的列表。这Windows.UI.Xaml.Controls.ComboBox
key 是您感兴趣的。请注意DllPath
值,指向包含代码的 DLL:C:\Windows\System32\Windows.UI.Xaml.dll
在我的机器上。 CLSID 值是熟悉的 COM 类 guid,用于要求类工厂创建实例。
这就是你碰壁的地方; DLL 包含本机代码,就像大多数 COM 服务器一样。用 C++ 编写并编译为机器代码。它是一个 18 兆字节的怪物,无法被反编译。