
FLARE टीम की ओपन-सोर्स लाइब्रेरी जो Common Intermediate Language (CIL) निर्देशों को डिसअसेंबल करती है।

dncil एक Common Intermediate Language (CIL) डिसअसेंबली लाइब्रेरी है जो Python में लिखी गई है और .NET प्रबंधित विधियों के हेडर, निर्देशों, और अपवाद हैंडलर्स को पार्स करने का समर्थन करती है। पार्स किया गया डेटा एक ऑब्जेक्ट-ओरिएंटेड API के माध्यम से प्रदान किया जाता है, जिससे आप dncil का उपयोग करके CIL विश्लेषण उपकरण तेज़ी से विकसित कर सकते हैं।
Python क्यों? जो मौजूदा लाइब्रेरीज़ CIL डिसअसेंबली का समर्थन करती हैं, जैसे dnLib, वे C# में लिखी गई हैं। इन उपकरणों का लाभ उठाने के लिए, आपको C# एप्लिकेशन बनाने होंगे जिसके लिए C# विकास अनुभव आवश्यक है। dncil का उपयोग करके, जो एक शुद्ध Python विकल्प है, आप:
CIL का विश्लेषण करने के लिए C# अनुभव की आवश्यकता नहीं होती।CIL विश्लेषण उपकरणों को तेज़ी से विकसित और परीक्षण कर सकते हैं।CIL विश्लेषण उपकरणों को मौजूदा Python परियोजनाओं के साथ आसानी से एकीकृत कर सकते हैं।उदाहरण स्क्रिप्ट print_cil_from_dn_file.py एक .NET निष्पादन योग्य में पाई जाने वाली प्रबंधित विधियों को डिसअसेंबल करने के लिए dncil का उपयोग .NET विश्लेषण लाइब्रेरी dnfile के साथ करती है। आइए देखें कि यह क्या कर सकता है।
सबसे पहले, हम निम्नलिखित C# सोर्स कोड संकलित करते हैं:
using System;
public class HelloWorld
{
public static void Main(string[] args)
{
Console.WriteLine ("Hello World!");
}
}
संकलन से एक PE निष्पादन योग्य प्राप्त होता है जिसमें .NET मेटाडेटा होता है, जो Common Language Runtime (CLR) को बताता है कि हमारे कोड को कैसे निष्पादित करना है। हम इस मेटाडेटा को पार्स करने के लिए dnfile का उपयोग करते हैं, जो हमें हमारी प्रबंधित विधि Main का ऑफसेट देता है। फिर हम इस स्थान पर संग्रहीत CIL निर्देशों को डिसअसेंबल और प्रदर्शित करने के लिए dncil का उपयोग करते हैं।
आइए उपरोक्त को कार्य करते हुए देखें:
$ python scripts/print_cil_from_dn_file.py hello-world.exe
Method: Main
0000 00 nop
0001 72 01 00 00 70 ldstr "Hello World!"
0006 28 04 00 00 0a call System.Console::WriteLine
000B 00 nop
000C 2a ret
हमारी विधि Main को CilMethodBody क्लास द्वारा दर्शाया गया है। यह क्लास ऐसा डेटा रखती है जिसमें किसी दी गई प्रबंधित विधि के हेडर, CIL निर्देश और अपवाद हैंडलर शामिल होते हैं। यह विभिन्न सहायक फ़ंक्शन भी प्रदान करती है:
> main_method_body.flags
SmallFormat : false
TinyFormat : false
FatFormat : false
TinyFormat1 : true
MoreSects : false
InitLocals : false
CompressedIL : false
> main_method_body.size
14
> hexdump.hexdump(main_method_body.get_bytes())
00000000: 36 00 72 01 00 00 70 28 04 00 00 0A 00 2A 6.r...p(.....*
> hexdump.hexdump(main_method_body.get_header_bytes())
00000000: 36 6
> hexdump.hexdump(main_method_body.get_instruction_bytes())
00000000: 00 72 01 00 00 70 28 04 00 00 0A 00 2A .r...p(.....*
हमारी प्रबंधित विधि Main में पाया गया प्रत्येक CIL निर्देश Instruction क्लास द्वारा दर्शाया गया है। यह क्लास ऐसा डेटा रखती है जिसमें किसी दिए गए CIL निर्देश का ऑफसेट, मेमोनिक, ओपकोड और ऑपरेंड शामिल होते हैं। यह विभिन्न सहायक फ़ंक्शन भी प्रदान करती है:
> len(main_method_body.instructions)
5
> insn = main_method_body.instructions[1]
> insn.offset
1
> insn.mnemonic
'ldstr'
> insn.operand
token(0x70000001)
> insn.is_ldstr()
True
> insn.size
5
> hexdump.hexdump(insn.get_bytes())
00000000: 72 01 00 00 70 r...p
> hexdump.hexdump(insn.get_opcode_bytes())
00000000: 72 r
> hexdump.hexdump(insn.get_operand_bytes())
00000000: 01 00 00 70 ...p
dncil इंस्टॉल करने के लिए pip का उपयोग करके dncil मॉड्यूल प्राप्त करें:
$ pip install dncil
उदाहरण स्क्रिप्ट चलाने के लिए dnfile इंस्टॉल करना सुनिश्चित करें। वैकल्पिक रूप से, dncil को विकास निर्भरताओं के साथ इंस्टॉल करें, जैसा कि नीचे विकास अनुभाग में वर्णित है।
एक त्वरित उदाहरण के लिए print_cil_from_bytes.py देखें, जो .NET प्रबंधित विधि वाली बाइट स्ट्रीम में पाए जाने वाले CIL निर्देशों को प्रिंट करने के लिए dncil का उपयोग करता है।
यदि आप dncil सोर्स कोड की समीक्षा करना और संशोधित करना चाहते हैं, तो आपको इसे GitHub से डाउनलोड करके स्थानीय रूप से इंस्टॉल करना होगा।
विकास निर्भरताओं के साथ dncil को स्थानीय रूप से इंस्टॉल करने के लिए निम्नलिखित कमांड का उपयोग करें:
$ pip install /local/path/to/src[dev]
नीचे वर्णित परीक्षण और लिंटिंग चलाने के लिए आपको dncil की विकास निर्भरताओं की आवश्यकता होगी।
परीक्षण चलाने के लिए निम्नलिखित कमांड का उपयोग करें:
$ pytest /local/path/to/src/tests
प्रारूप त्रुटियों की पहचान करने के लिए निम्नलिखित कमांड का उपयोग करें:
$ black -l 120 -c /local/path/to/src
$ isort --profile black --length-sort --line-width 120 -c /local/path/to/src
$ mypy --config-file /local/path/to/src/.github/mypy/mypy.ini /local/path/to/src/dncil/ /local/path/to/src/scripts/ /local/path/to/src/tests/
dncil dnLib में पाए जाने वाले CIL पार्सिंग कोड पर आधारित है।