2012-02-12 29 views
10

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

तो आप .NET पर प्रोग्रामेटिक रूप से सीआईएल को कैसे डिस्सेबल करते हैं?

ध्यान दें कि मैं परिणाम मानव-पठनीय रूप में नहीं चाहता हूं। मैं अन्य कार्यक्रमों से उत्पन्न सीआईएल में हेरफेर करने के लिए मेटाप्रोग्राम लिखना चाहता हूं।

+1

जैसा कि जॉन जॉल्मर अपने उत्तर में सुझाव देते हैं, [मोनो सेसिल] (http://www.mono-project.com/Cecil) इसके लिए एक अच्छा विकल्प है। [यहां] (http://plaureano.blogspot.com/2011/05/introduction-to-il-rewriting-with-cecil.html) आईएल रीराइटिंग पर चर्चा करने वाला एक अच्छा ब्लॉग है जो सहायक हो सकता है। –

उत्तर

8

आप यथोचित दूर पाने सिर्फ GetILAsByteArray विधि से बाइट सरणी का उपयोग कर सकते हैं, लेकिन आप ' आपको स्वयं बाइट्स के पार्सिंग लिखने की आवश्यकता होगी (यदि आप तीसरे पक्ष की लाइब्रेरी पर भरोसा नहीं करना चाहते हैं)।

सरणी की संरचना यह है कि निर्देश के लिए ऑपरेशन के बाद निर्देशों की पहचान करने वाले एक या दो बाइट्स हैं (जो कुछ भी नहीं है, कुछ 4 बाइट टोकन या 8 बाइट नंबर)।

कोड प्राप्त करने के लिए, आप से OpCodes संरचना (MSDN) देख सकते हैं। आप सभी क्षेत्रों से अधिक की गणना हैं, तो आप काफी आसानी से बाइट्स की पढ़ने के लिए एक लुकअप तालिका का निर्माण कर सकते हैं:

// Iterate over all byte codes to build lookup table 
for fld in typeof<OpCodes>.GetFields() do 
    let code = fld.GetValue(null) :?> OpCode 
    printfn "%A (%d + %A)" code.Name code.Size code.OperandType 

code.Value संपत्ति आप eithre byte या कोड का int16 मूल्य देता है। code.Size संपत्ति आपको बताती है कि यह 1 या 2 बाइट कोड है और OperandType संपत्ति निर्दिष्ट करती है कि कौन से तर्क कोड का पालन करते हैं (बाइट्स की संख्या और अर्थ explained on MSDN है)। मुझे याद नहीं है कि आपको टोकन जैसी चीजों को कैसे संसाधित करने की आवश्यकता है जो iee MethodInfo का संदर्भ लेते हैं, लेकिन मुझे लगता है कि आप इसे समझ पाएंगे!

9

मोनो सेसिल पुस्तकालय - http://www.mono-project.com/Cecil आपको क्या चाहिए, मुझे पता है कि यह कम से कम एक नेट प्रोफाइलर में प्रयोग किया जाता है क्या करना चाहिए

+4

'सेसिल' वास्तव में [ILSpy] (https://github.com/icsharpcode/ILSpy) में उपयोग किया जाता है। – pad

+0

आप इस ब्लॉग पोस्टिंग को देखना चाहेंगे http://plaureano.blogspot.com/2011/05/introduction-to-il-rewriting-with-cecil.html सेसिल का उपयोग करने के बारे में थोड़ी अधिक जानकारी के लिए जो आप ' करने की कोशिश कर रहे हैं। –

2

मैंने Mono Cecil प्रोजेक्ट के साथ कुछ आईएल मैनिपुलेशन किया था। यह काफी आसान एपीआई है।

5

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

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