Microsoft如何从DLL中隐藏C#内部类';什么是元数据?

Microsoft如何从DLL中隐藏C#内部类';什么是元数据?,c#,reflection,reverse-engineering,cil,ilspy,C#,Reflection,Reverse Engineering,Cil,Ilspy,当我想分析CVE-2017-8759周围的代码时,一切都开始了。我知道CVE的修复程序位于System.Runtime.Remoting.dll中名为WsdlParser.cs的类中,该类是.Net Framework的一部分。您的计算机上可能有此dll,其位置类似于: C:\Program Files(x86)\Reference Assembly\Microsoft\Framework.NETFramework\v4.7\System.Runtime.Remoting.dll 我使用ilsp

当我想分析CVE-2017-8759周围的代码时,一切都开始了。我知道CVE的修复程序位于System.Runtime.Remoting.dll中名为WsdlParser.cs的类中,该类是.Net Framework的一部分。您的计算机上可能有此dll,其位置类似于:

C:\Program Files(x86)\Reference Assembly\Microsoft\Framework.NETFramework\v4.7\System.Runtime.Remoting.dll

我使用ilspycmd将代码重新组装回C#,并注意到输出目录中缺少WsdlParser.cs:

我后来使用了CFF Explorer,发现TypeDefs中的元数据中确实缺少此类型:

然而,我知道有一个事实,那就是这个类:

  • 它在Microsoft的文档中:
  • 使用反射和LoadAssembly()时,我能够找到类:

        Assembly assembly = Assembly.LoadFile(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7\System.Runtime.Remoting.dll");
    
        foreach (var type in assembly.GetTypes())
        {
            if (!type.FullName.EndsWith("WsdlParser"))
            {
                continue;
            }
    
            Console.WriteLine("Great Success");
        }
    
我注意到这种行为与这个dll中的所有内部类都是一致的,但我不明白它有什么意义。我猜可能有一个生成后过程来删除内部类型的数据,但是如果是这样,我如何通过加载程序集来找到类呢?我认为CIL使用TypeDef元数据加载类型,但是是否有额外的空间来存储这些数据

为了更好地理解它,我创建了一个带有内部类的C#测试项目,并使用CFF Explorer检查元数据。内部类在调试和发布版本中都应该存在

那么这个巫毒是什么

谢谢各位。

你们找到的是一个。在你找到它的路径上有一个很大的线索

引用程序集是一种特殊类型的程序集,它只包含表示库的公共API表面所需的最小元数据量。它们包括在构建工具中引用程序集时重要的所有成员的声明,但不包括对其API契约没有明显影响的所有成员实现和私有成员的声明

(我的重点)

以及:

当库使用者需要根据库的许多不同版本构建程序时,为库生成引用程序集非常有用。为所有这些版本分发实现程序集可能是不切实际的,因为它们太大了。引用程序集的大小较小,将它们作为库SDK的一部分分发可以减少下载大小并节省磁盘空间

没有魔法,只是一种公开记录的方法,在不需要完整文件时分发较小的文件


这些程序集在编译时使用,但不在运行时使用。为此,您需要一个实现程序集,该程序集将通过其他方式提供,例如它已放置在GAC中。

资源管理器正在使用数据类型的标题来查找对象。我不认为它是在检查可执行堆栈中的本地对象。如果没有构造对象,也找不到该对象(空时)。请查看加载类型的
Assembly
属性。它不是您认为已加载的程序集。它实际上是来自GAC的。(对我来说,
C:\Windows\Microsoft.NET\assembly\GAC\MSIL\System.Runtime.Remoting\v4.0\u 4.0.0.0\uu b77a5c561934e089\System.Runtime.Remoting.dll
)如果你把那个真实的文件放到反汇编程序中,你会找到
WsdlParser
类型。