我正在尝试将我的Windows应用商店应用的ComboBox控件反编译为C#,但是没有代码。相反,所有属性都是对单独程序集的调用。如何找到真实代码的存在位置,以及如何在C#中读取方法体?我无法读取装配,所以这对我没有好处
答案 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#反汇编程序(至少,当我看上去时)