
Python डिकम्पाइलर 3.7-3.8 के लिए, uncompyle6 से छोटा किया गया ताकि हम refactor कर सकें और कुछ लंबे समय से चली आ रही समस्याओं को ठीक करना शुरू कर सकें।
|buildstatus| |Pypi Installs| |Latest Version| |Supported Python Versions|
|packagestatus|
.. contents::
एक मूल पायथन क्रॉस-संस्करण डीकंपाइलर और खंड डीकंपाइलर। uncompyle6_ का पुनर्कार्य।
मैंने इस पर BlackHat Asia 2024 <https://youtu.be/H-7ZNrpsV50?si=nOaixgYHr7RbILVS>_ में एक वार्ता दी।
decompyle3 पायथन बाइटकोड को वापस समतुल्य पायथन स्रोत कोड में अनुवादित करता है। यह पायथन संस्करण 3.7 से बाइटकोड स्वीकार करता है।
पुराने पायथन बाइटकोड के डीकंपाइलेशन के लिए, uncompyle6_ देखें।
Uncompyle6 शानदार है, लेकिन इसके नियंत्रण प्रवाह (control flow) को संभालने के तरीके में एक मूलभूत समस्या है। पायथन के शुरुआती दिनों में, जब बहुत कम अनुकूलन होता था और कोड बहुत टेम्पलेट-उन्मुख तरीके से उत्पन्न होता था, तो कोड पैटर्न को देखकर ही नियंत्रण प्रवाह संरचनाओं का पता लगाया जा सकता था।
वर्षों में, अधिक कोड अनुकूलन, विशेष रूप से जंप को संभालने के आसपास, ने कोड पैटर्न से सख्ती से नियंत्रण प्रवाह का पता लगाने का समर्थन करना कठिन बना दिया है। यह पायथन 2.4 (2004) जितनी पुरानी बात है, लेकिन चूंकि यह एक कठिन समस्या है, अब तक इसे संतोषजनक तरीके से नहीं सुलझाया गया है।
इस समस्या को ठीक करने का प्रारंभिक प्रयास निर्देश स्ट्रीम में मार्कर जोड़ना था, शुरू में यह एक COME_FROM निर्देश था, और फिर पैटर्न का पता लगाने में इसका उपयोग करना।
वर्षों में, मैंने इसे और अधिक विशिष्ट बनाने के लिए विस्तारित किया, इसलिए COME_FROM_LOOP और जोड़े गए। और मैंने व्याकरण-कमी समय पर जांच जोड़ी ताकि यह सुनिश्चित करने का प्रयास किया जा सके कि जंप कथित लक्ष्यों से मेल खाते हों।
COME_FROM_WITHCOME_FROMहालाँकि, यह सब जटिल है, मजबूत नहीं है, डीपार्सिंग को बहुत धीमा कर दिया है और वास्तव में टिकाऊ नहीं है।
इस परियोजना में, हमने व्याकरण को फिर से लिखना और रिफैक्टर करना शुरू किया।
हालाँकि, यह भी पर्याप्त नहीं है। नियंत्रण प्रवाह को डॉमिनेटर्स और रिवर्स-डॉमिनेटर्स का उपयोग करके संबोधित करने की आवश्यकता है, जो python-control-flow_ परियोजना प्रदान कर सकती है।
यह मैं अंततः धीरे-धीरे एक और गैर-सार्वजनिक परियोजना में कर रहा हूँ। यह बहुत काम है। प्रायोजन के रूप में वित्त पोषण की बहुत सराहना की जाती है, लेकिन यह प्रयास की मात्रा के अनुरूप नहीं है, और वर्तमान में मेरे पास एक पूर्णकालिक नौकरी है। इसलिए इसे सार्वजनिक रूप से उपलब्ध होने में समय लग सकता है, यदि बिल्कुल भी।
यहाँ का कोड पायथन संस्करण 3.7 या 3.8 पर चलाया जा सकता है। जो बाइटकोड फ़ाइलें यह पढ़ सकता है, उनका परीक्षण संस्करण 3.7 और 3.8 के पायथन बाइटकोड पर किया गया है।
आप PyPI से decompyle3 नाम का उपयोग करके स्थापित कर सकते हैं::
pip install decompyle3
स्रोत कोड से स्थापित करने के लिए, यह परियोजना setup.py का उपयोग करती है, इसलिए यह मानक पायथन प्रक्रिया का पालन करती है::
$ pip install -e . # set up to run from source tree
या::
$ python setup.py install # may need sudo
एक GNU Makefile भी प्रदान किया गया है, इसलिए :code:make install (संभवतः रूट या sudo के रूप में) उपरोक्त चरणों को करेगा।
::
make check
एक GNU makefile जोड़ा गया है ताकि सही कमांड सेट अप करने और चलाने, और सबसे तेज़ से सबसे धीमी गति से परीक्षण चलाने में आसानी हो।
यदि आपके पास remake_ स्थापित है, तो आप :code:remake --tasks के माध्यम से परीक्षणों सहित सभी कार्यों की सूची देख सकते हैं।
चलाएँ
::
$ decompyle3 compiled-python-file-pyc-or-pyo
उपयोग सहायता के लिए:
::
$ decompyle3 -h
यदि आप डीकंपाइलेशन प्रक्रिया की सटीकता का पायथन वाक्यविन्यास सत्यापन चाहते हैं, तो :code:--syntax-verify विकल्प जोड़ें। हालाँकि, चूंकि पायथन वाक्यविन्यास बदलता है। यदि बाइटकोड उस पायथन इंटरप्रेटर के लिए सही बाइटकोड है जो वाक्यविन्यास की जाँच करेगा, तो आपको इस विकल्प का उपयोग करना चाहिए।
आप परिणामों की तुलना unpyc37_ जैसे किसी अन्य पायथन डीकंपाइलर से भी कर सकते हैं। चूंकि वे अलग-अलग काम करते हैं, यहाँ की बग्स अक्सर उसमें नहीं होती हैं, और इसके विपरीत।
ऐसे प्रोग्रामों का एक दिलचस्प वर्ग है जो आसानी से उपलब्ध है जो मजबूत सत्यापन देता है: वे प्रोग्राम जो चलने पर स्वयं का परीक्षण करते हैं। हमारे परीक्षण सूट में ये शामिल हैं।
और पायथन इस तरह के प्रोग्रामों का एक और सेट लेकर आता है: मानक पुस्तकालय के लिए इसका परीक्षण सूट। इस प्रकार की जाँच को सुविधाजनक बनाने के लिए हमारे पास :code:test/stdlib में कुछ कोड भी है।
हम केवल जारी संस्करणों का समर्थन करते हैं, उम्मीदवार संस्करणों का नहीं। ध्यान दें कि जारी संस्करण का जादू आमतौर पर रिलीज़ से पहले अंतिम उम्मीदवार संस्करण के समान होता है।
हम PJOrion_ या अन्यथा अस्पष्ट कोड को भी नहीं संभालते हैं। PJOrion के लिए प्रयास करें: इस टूल का उपयोग करने से पहले बाइटकोड को डीस्क्रैम्बल करने के लिए PJOrion Deobfuscator_; pydecipher_ इसमें मदद कर सकता है।
यह प्रोग्राम Py2EXE_ द्वारा बनाई गई Microsoft Windows EXE फ़ाइलों को डीकंपाइल नहीं कर सकता, हालाँकि हम संभवतः बाइटकोड को ठीक से निकालने के बाद कोड को डीकंपाइल कर सकते हैं। Pyinstaller बंडलर्स को अनपैक करने में Pydeinstaller <https://github.com/charles-dyfis-net/pydeinstaller>_ मदद कर सकता है।
अभिव्यक्तियों या कथनों की पैथोलॉजिकल रूप से लंबी सूचियों को संभालना धीमा है। हम Cython_ या MicroPython को नहीं संभालते हैं, जो बाइटकोड का उपयोग नहीं करते हैं।
डीकंपाइलेशन में कई बग्स हैं। और यह हर दूसरे CPython डीकंपाइलर के लिए सच है जिसका मैंने सामना किया है, यहां तक कि वे भी जिन्होंने 2.4 जैसे किसी विशेष संस्करण पर "परफेक्ट" होने का दावा किया था।
जैसे-जैसे पायथन आगे बढ़ता है, डीकंपाइलेशन भी कठिन होता जाता है क्योंकि संकलन अधिक परिष्कृत है और भाषा स्वयं अधिक परिष्कृत है। मुझे संदेह है कि unpyc37_ (जो 3.3 डीकंपाइलर पर आधारित है) जैसे तदर्थ प्रयास कम होंगे, सिर्फ इसलिए कि ऐसा करना कठिन है। अच्छी खबर, कम से कम मेरे दृष्टिकोण से, यह है कि मुझे लगता है कि मैं समझता हूं कि समस्याओं को अधिक मजबूत तरीके से हल करने के लिए क्या आवश्यक है। लेकिन अभी, जब तक परियोजना को बेहतर वित्त पोषित नहीं किया जाता, मैं पायथन संस्करण 3.8 या 3.9 का समर्थन करने के लिए कोई गंभीर प्रयास नहीं करने का इरादा रखता हूं, जिसमें आने वाली बग्स भी शामिल हैं। मैं कल्पना करता हूं कि किसी बिंदु पर मुझे इसमें रुचि हो सकती है।
आप पायथन द्वारा स्वयं की जांच करने के लिए उपयोग किए जाने वाले मानक परीक्षण सूट के विरुद्ध परीक्षण चलाकर आसानी से बग्स ढूंढ सकते हैं। किसी भी समय, दर्जनों ज्ञात समस्याएं हैं जो काफी अलग-थलग हैं और जिन्हें हल किया जा सकता है यदि कोई ऐसा करने में समय लगाए। समस्या यह है कि बग फिक्सिंग पर काम करने वाले बहुत सारे लोग नहीं हैं।
आप एक बग पा सकते हैं, जिसे आप रिपोर्ट करना चाहते हैं। कृपया ऐसा करें। लेकिन ध्यान रखें कि हो सकता है कि इसे कुछ समय के लिए मेरा ध्यान न मिले। यदि आप किसी तरह से परियोजना को प्रायोजित या समर्थन करते हैं, तो मैं आपके मुद्दों को अन्य चीजों की कतार से ऊपर प्राथमिकता दूंगा जो मैं इसके बजाय कर रहा हूं। दुर्लभ स्थितियों में, मैं शुल्क के लिए बाइटकोड की हाथ से डीकंपाइलेशन कर सकता हूं। हालाँकि, यह महंगा है, आमतौर पर अधिकांश लोगों की खर्च करने की इच्छा से परे।
uncompyle और decompyle प्रोग्रामों के समान समस्याओं से ग्रस्त है।.. |buildstatus| image:: https://dl.circleci.com/status-badge/img/gh/rocky/python-decompile3/tree/master.svg?style=svg :target: https://dl.circleci.com/status-badge/redirect/gh/rocky/python-decompile3/tree/master .. |packagestatus| image:: https://repology.org/badge/vertical-allrepos/python:uncompyle6.svg :target: https://repology.org/project/python:decompyle3/versions .. _Cython: https://en.wikipedia.org/wiki/Cython .. _MicroPython: https://micropython.org .. _uncompyle6: https://pypi.python.org/pypi/uncompyle6 .. _python-control-flow: https://github.com/rocky/python-control-flow .. _trepan: https://pypi.python.org/pypi/trepan3k .. _compiler: https://pypi.python.org/pypi/spark_parser .. _HISTORY: https://github.com/rocky/python-decompile3/blob/master/HISTORY.md .. _debuggers: https://pypi.python.org/pypi/trepan3k .. _remake: https://bashdb.sf.net/remake .. _unpyc37: https://github.com/andrew-tavera/unpyc37/ .. _this: https://github.com/rocky/python-decompile3/wiki/Deparsing-technology-and-its-use-in-exact-location-reporting .. |TravisCI| image:: https://travis-ci.org/rocky/python-decompile3.svg :target: https://travis-ci.org/rocky/python-decompile3 .. |CircleCI| image:: https://circleci.com/gh/rocky/python-decompile3.svg?style=svg :target: https://circleci.com/gh/rocky/python-decompile3
.. _PJOrion: http://www.koreanrandom.com/forum/topic/15280-pjorion-%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-%D0%B4%D0%B5%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-%D0%BE%D0%B1%D1%84 .. _Deobfuscator: https://github.com/extremecoders-re/PjOrion-Deobfuscator .. _Py2EXE: https://en.wikipedia.org/wiki/Py2exe .. |Supported Python Versions| image:: https://img.shields.io/pypi/pyversions/decompyle3.svg .. |Latest Version| image:: https://badge.fury.io/py/decompyle3.svg :target: https://badge.fury.io/py/decompyle3 .. |PyPI Installs| image:: https://pepy.tech/badge/decompyle3/month .. _pydecipher: https://github.com/mitre/pydecipher