微软如何从DLL的元数据中隐藏C#内部类?

问题描述 投票:1回答:1

这一切都源于我想分析CVE-2017-8759周围的代码。我知道CVE的修复是在System.Runtime.Remoting.dll内部一个名为WsdlParser.cs的类中,它是.Net框架的一部分。你的电脑上可能有这个dll,位置类似于。

C:Program Files (x86)Reference Assemblies/Microsoft/Framework.NETFramework/v4.7/System.Runtime.Remoting.dll。

我用ilspycmd把代码重新组装回C#,发现输出目录中缺少WsdlParser.cs。

enter image description here

后来我用CFF资源管理器看到这个类型在TypeDefs的元数据中确实没有。

enter image description here

但是,我知道这个类是存在的。

  • 在微软的文档中就有 https:/referencesource.microsoft.comSystem.Runtime.Remotingmetadatawsdlparser.cs. html
  • 当使用反射和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检查元数据。内部类在调试中和发布版构建中都有,因为它应该在那里。

那么,这到底是什么巫术?

谢谢大家。

c# reflection reverse-engineering cil ilspy
1个回答
4
投票

你所发现的是一个 参照组. 在你找到的路径中,有一个很大的线索。

参考汇编是一种特殊类型的汇编,它只包含表示库的公共API表面所需的最低数量的元数据。它们包含了所有成员的声明,这些声明在构建工具中引用汇编时是重要的,但是 排除所有对其API合约没有明显影响的成员实现和私有成员的声明。

(我的 重音)

而且。

当你的库的消费者需要根据许多不同版本的库来构建他们的程序时,为你的库生成参考汇编是很有用的。分发所有这些版本的实现程序集可能是不切实际的,因为它们的体积很大。参考程序集的大小较小,将它们作为你的库的SDK的一部分发布,可以减少下载大小,节省磁盘空间。

没有什么魔法,只是在不需要完整文件的情况下,用一种公开文档的方式来分发较小的文件。

这些程序集被用于 编译时间但不是在 运行时. 为此,你需要一个实现组件,它将通过其他方式提供,例如它已经被放置在GAC中。

© www.soinside.com 2019 - 2024. All rights reserved.