Как Microsoft скрывает C# внутренние классы от метаданных DLL? - PullRequest
1 голос
/ 28 апреля 2020

Все началось, когда я захотел проанализировать код в CVE-2017-8759. Я знал, что исправление для CVE было в классе с именем WsdlParser.cs внутри System.Runtime.Remoting.dll, который является частью. Net Framework. Возможно, у вас есть эта dll на вашем компьютере в месте, похожем на:

C: \ Program Files (x86) \ Справочные сборки \ Microsoft \ Framework.NETFramework \ v4.7 \ System.Runtime.Remoting. dll

Я использовал ilspycmd для повторной сборки кода обратно в C# и заметил, что в выходном каталоге отсутствует WsdlParser.cs:

enter image description here

Позже я использовал CFF Explorer и увидел, что этот тип действительно отсутствует в метаданных в TypeDefs:

enter image description here

Однако я точно знаю, что этот класс существует:

  • Это в документации Microsoft: https://referencesource.microsoft.com/System.Runtime.Remoting/metadata/wsdlparser.cs.html
  • При использовании отражений и LoadAssembly () I удалось найти класс:

        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. Внутренний класс был там, как и должно быть, в отладочной и сборочной версиях.

Так что же это за вуду?

Спасибо, ребята.

1 Ответ

3 голосов
/ 28 апреля 2020

То, что вы нашли, это Справочная сборка . В пути, по которому вы его нашли, есть большая подсказка.

Ссылочные сборки - это особый тип сборки, который содержит только минимальное количество метаданных, необходимое для представления библиотеки API библиотеки publi c. , Они включают в себя объявления для всех элементов, которые важны при обращении к сборке в инструментах сборки, но исключают все реализации элементов и объявления частных элементов, которые не оказывают заметного влияния на их контракт API.

(My выделяется )

И:

Генерация справочных сборок для ваших библиотек может быть полезна, когда потребителям вашей библиотеки нужно создавать свои программы для множества различных версии библиотеки. Распространение сборок реализации для всех этих версий может быть непрактичным из-за их большого размера. Эталонные сборки меньше по размеру, и их распределение в составе SDK вашей библиотеки уменьшает размер загружаемого файла и экономит дисковое пространство.

Нет волхвов c, просто документально подтвержденное средство распространения небольших файлов при полный файл не требуется.

Эти сборки используются в время компиляции , но не в время выполнения . Для этого вам понадобится сборка реализации, которая будет поставляться другими средствами, например, помещенными в GA C.

...