2008-10-23 11 views
7

ठीक है, मेरा कहना है कि मेरा एप्लिकेशन स्मृति में निर्देशों को उत्सर्जित कर रहा है, पृष्ठ निष्पादन योग्य बना रहा है, आदि। क्या मेरे उत्सर्जित निर्देश स्ट्रीम को इंगित करने के लिए एक गैर-जिटेड विधि के विधि स्टब को बदलने का कोई तरीका है?क्या किसी अन्य विधि को चलाने में .NET JIT कंपाइलर को ट्रिक करने का कोई तरीका है?

उदा .:

मान लीजिए मैं स्मृति में एक x86 निर्देश धारा है, जो कुछ मनमाने ढंग से करता है बनाया है। अब, आगे लगता है कि मेरे पास एक तरीका 'int लक्ष्य()' है। मैंने इसे अभी तक नहीं बुलाया है, इसलिए इसे संकलित नहीं किया गया है।

  1. लक्ष्य के ठूंठ को सूचक जाओ
  2. यह मेरी उत्सर्जित अनुदेश धारा की ओर इंगित कर: वहाँ किसी भी तरह से करने के लिए है।

मुझे लगता है कि व्यावहारिक रूप से नेट के हर एक सुरक्षा सुविधा अपहरण इस तरह रोकने के लिए बनाया गया है। लेकिन होस्टिंग एपीआई के माध्यम से यह संभव है?

उत्तर

6

हाँ आप कर सकते हैं!

mscorjit के हुक getJit विधि। और जब भी किसी भी विधि को जिंग की आवश्यकता होती है तो आपसे पूछा जाएगा। आप जो चाहें पास कर सकते हैं। कुछ .NET रक्षक इस तरह काम करते हैं।

10

यह प्रोफाइलिंग API के माध्यम से संभव है। मैंने इसका कभी भी उपयोग नहीं किया है, लेकिन इसका उपयोग टाइपमैक में इसी तरह के उद्देश्य के लिए किया जाता है।

संपादित करें: मुझे लगता है कि एमएसडीएन ब्लॉग पर एक अच्छी पोस्टिंग थी, इसके लिए शिकार की जाएगी।

संपादित 2: दोह, first hit!

+0

मुझे याद आया कि यह कहीं 'आईएल पुनर्लेखन' था। – leppie

+0

हाँ। मैं भी अभी यही कहने वाला था। ऐसा लगता है कि यह केवल आईएल है। – TraumaPony

1

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

मुझे नहीं लगता कि प्रोफाइलिंग एपीआई इस मामले में आपकी मदद करेगी (जैसा कि लेप्पी द्वारा सुझाया गया है), क्योंकि आप एमएसआईएल को संशोधित करने की कोशिश नहीं कर रहे हैं। यदि आपको लगता है कि अन्यथा this article उपयोग में हो सकता है क्योंकि यह वर्णन करता है कि टाइपमैक क्या कर रहा है, इसे लागू करने के लिए आपको क्या करना चाहिए।

0

आईसीओआरप्रोफाइलर का उपयोग करने में सक्षम होने और जूट से पहले अपनी विधि को फिर से लिखने के अलावा, आप ICorDebug (एमडीबीजी इंटरफेस प्रबंधित कर सकते हैं) का उपयोग कर सकते हैं। ब्रेकपॉइंट सेट करें, जब ब्रेकपॉइंट हिट आपके इंटरसेप्टिंग कोड पर अगला कथन सेट करता है। इस प्रक्रिया को कोड से किया जा सकता है लेकिन वास्तव में घुसपैठ कर रहा है और इसे समन्वयित करने के लिए आपको "वॉचर" प्रक्रिया की आवश्यकता होगी।

PostSharp प्रोजेक्ट देखने के लिए एक और चीज है जो आपको एट्रिब्यूट्स लागू करने पर प्रवेश और निकास विधियां देती है।

0

मैं स्मृति के साथ सीधे कोशिश नहीं करता और गड़बड़ नहीं करता हूं और मुझे यकीन नहीं है कि यह भी संभव है कि आप प्रोफाइलर एपीआई का उपयोग कर सकें - वहां कुछ उदाहरण हैं लेकिन कोई वास्तविक दस्तावेज नहीं है। एमएसडीएन पत्रिका लेख पर एक नज़र डालें - Rewrite MSIL Code on the Fly with the .NET Framework Profiling API

संबंधित मुद्दे

 संबंधित मुद्दे