यह सब तब शुरू हुआ जब मैंने CVE-2017-8759 के आसपास के कोड का विश्लेषण करना चाहा। मुझे पता था कि सीवीई के लिए फिक्स System.Runtime.Remoting.dll के अंदर WsdlParser.cs नामक एक वर्ग में था जो .Net Framework का हिस्सा है। संभवतः आपके कंप्यूटर पर यह dll निम्न के समान स्थान पर है:

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

मैंने कोड को वापस सी # में फिर से इकट्ठा करने के लिए ilspycmd का उपयोग किया, और देखा कि आउटपुट निर्देशिका में WsdlParser.cs गायब था:

enter image description here

मैंने बाद में सीएफएफ एक्सप्लोरर का इस्तेमाल किया और देखा कि टाइपडिफ्स में मेटाडेटा में यह प्रकार वास्तव में गायब है:

enter image description here

हालांकि, मैं इस तथ्य के लिए जानता हूं कि यह वर्ग वहां है:

  • यह माइक्रोसॉफ्ट के दस्तावेज में है: https://referencesource.microsoft.com /System.Runtime.Remoting/metadata/wsdlparser.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");
        }
    

मैंने देखा कि यह व्यवहार इस डीएल में सभी आंतरिक वर्गों के अनुरूप है, लेकिन मुझे समझ में नहीं आता कि यह कैसे समझ में आता है। मेरा अनुमान है कि आंतरिक प्रकार के डेटा को हटाने के लिए पोस्ट-बिल्ड प्रक्रिया हो सकती है, लेकिन यदि हां, तो मैं असेंबली लोड करके कक्षा को कैसे ढूंढ पा रहा था? मैंने सोचा था कि सीआईएल टाइपडिफ मेटाडेटा का उपयोग करके प्रकार लोड करता है, लेकिन क्या कोई अतिरिक्त स्थान है जहां यह डेटा संग्रहीत किया जाता है?

इसे बेहतर ढंग से समझने के लिए, मैंने एक आंतरिक वर्ग के साथ एक सी # परीक्षण परियोजना बनाई, और सीएफएफ एक्सप्लोरर का उपयोग करके मेटाडेटा का निरीक्षण किया। आंतरिक वर्ग वहाँ था, जैसा कि डिबग में और रिलीज़ बिल्ड में होना चाहिए।

तो यह वूडू क्या है?

धन्यवाद दोस्तों।

2
Alex 28 अप्रैल 2020, 17:54

1 उत्तर

सबसे बढ़िया उत्तर

आपको एक संदर्भ असेंबली मिली है। जिस रास्ते में आपने उसे पाया, उसमें इसका एक बड़ा सुराग है।

संदर्भ असेंबली एक विशेष प्रकार की असेंबली होती है जिसमें लाइब्रेरी की सार्वजनिक एपीआई सतह का प्रतिनिधित्व करने के लिए आवश्यक न्यूनतम मात्रा में मेटाडेटा होता है। उनमें उन सभी सदस्यों के लिए घोषणाएं शामिल हैं जो बिल्ड टूल में असेंबली का संदर्भ देते समय महत्वपूर्ण हैं, लेकिन उन सभी सदस्य कार्यान्वयन और निजी सदस्यों की घोषणाओं को शामिल नहीं करते हैं जिनका उनके API अनुबंध पर कोई ध्यान देने योग्य प्रभाव नहीं है।

(मेरा जोर)

और:

आपकी लाइब्रेरी के लिए संदर्भ असेंबली बनाना तब उपयोगी हो सकता है जब आपके लाइब्रेरी उपभोक्ताओं को लाइब्रेरी के कई अलग-अलग संस्करणों के विरुद्ध अपने प्रोग्राम बनाने की आवश्यकता हो। इन सभी संस्करणों के लिए कार्यान्वयन असेंबली वितरित करना उनके बड़े आकार के कारण अव्यावहारिक हो सकता है। संदर्भ संयोजन आकार में छोटे होते हैं, और उन्हें आपके पुस्तकालय के एसडीके के एक भाग के रूप में वितरित करने से डाउनलोड आकार कम हो जाता है और डिस्क स्थान की बचत होती है।

कोई जादू नहीं, पूर्ण फ़ाइल की आवश्यकता नहीं होने पर छोटी फ़ाइलों को वितरित करने का केवल एक सार्वजनिक रूप से प्रलेखित साधन।

इन असेंबली का उपयोग संकलन समय पर किया जाता है, लेकिन रनटाइम पर नहीं। इसके लिए आपको एक कार्यान्वयन असेंबली की आवश्यकता है, जिसे अन्य माध्यमों से आपूर्ति की जाएगी, जैसे कि इसे जीएसी में रखा गया है।

4
Damien_The_Unbeliever 28 अप्रैल 2020, 18:24