यह सब तब शुरू हुआ जब मैंने 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 गायब था:
मैंने बाद में सीएफएफ एक्सप्लोरर का इस्तेमाल किया और देखा कि टाइपडिफ्स में मेटाडेटा में यह प्रकार वास्तव में गायब है:
हालांकि, मैं इस तथ्य के लिए जानता हूं कि यह वर्ग वहां है:
- यह माइक्रोसॉफ्ट के दस्तावेज में है: 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"); }
मैंने देखा कि यह व्यवहार इस डीएल में सभी आंतरिक वर्गों के अनुरूप है, लेकिन मुझे समझ में नहीं आता कि यह कैसे समझ में आता है। मेरा अनुमान है कि आंतरिक प्रकार के डेटा को हटाने के लिए पोस्ट-बिल्ड प्रक्रिया हो सकती है, लेकिन यदि हां, तो मैं असेंबली लोड करके कक्षा को कैसे ढूंढ पा रहा था? मैंने सोचा था कि सीआईएल टाइपडिफ मेटाडेटा का उपयोग करके प्रकार लोड करता है, लेकिन क्या कोई अतिरिक्त स्थान है जहां यह डेटा संग्रहीत किया जाता है?
इसे बेहतर ढंग से समझने के लिए, मैंने एक आंतरिक वर्ग के साथ एक सी # परीक्षण परियोजना बनाई, और सीएफएफ एक्सप्लोरर का उपयोग करके मेटाडेटा का निरीक्षण किया। आंतरिक वर्ग वहाँ था, जैसा कि डिबग में और रिलीज़ बिल्ड में होना चाहिए।
तो यह वूडू क्या है?
धन्यवाद दोस्तों।
1 उत्तर
आपको एक संदर्भ असेंबली मिली है। जिस रास्ते में आपने उसे पाया, उसमें इसका एक बड़ा सुराग है।
संदर्भ असेंबली एक विशेष प्रकार की असेंबली होती है जिसमें लाइब्रेरी की सार्वजनिक एपीआई सतह का प्रतिनिधित्व करने के लिए आवश्यक न्यूनतम मात्रा में मेटाडेटा होता है। उनमें उन सभी सदस्यों के लिए घोषणाएं शामिल हैं जो बिल्ड टूल में असेंबली का संदर्भ देते समय महत्वपूर्ण हैं, लेकिन उन सभी सदस्य कार्यान्वयन और निजी सदस्यों की घोषणाओं को शामिल नहीं करते हैं जिनका उनके API अनुबंध पर कोई ध्यान देने योग्य प्रभाव नहीं है।
(मेरा जोर)
और:
आपकी लाइब्रेरी के लिए संदर्भ असेंबली बनाना तब उपयोगी हो सकता है जब आपके लाइब्रेरी उपभोक्ताओं को लाइब्रेरी के कई अलग-अलग संस्करणों के विरुद्ध अपने प्रोग्राम बनाने की आवश्यकता हो। इन सभी संस्करणों के लिए कार्यान्वयन असेंबली वितरित करना उनके बड़े आकार के कारण अव्यावहारिक हो सकता है। संदर्भ संयोजन आकार में छोटे होते हैं, और उन्हें आपके पुस्तकालय के एसडीके के एक भाग के रूप में वितरित करने से डाउनलोड आकार कम हो जाता है और डिस्क स्थान की बचत होती है।
कोई जादू नहीं, पूर्ण फ़ाइल की आवश्यकता नहीं होने पर छोटी फ़ाइलों को वितरित करने का केवल एक सार्वजनिक रूप से प्रलेखित साधन।
इन असेंबली का उपयोग संकलन समय पर किया जाता है, लेकिन रनटाइम पर नहीं। इसके लिए आपको एक कार्यान्वयन असेंबली की आवश्यकता है, जिसे अन्य माध्यमों से आपूर्ति की जाएगी, जैसे कि इसे जीएसी में रखा गया है।
संबंधित सवाल
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।