
مفكك شيفرة بايثون للإصدارات 3.7-3.8، تم تجريده من uncompyle6 لإعادة هيكلته والبدء في إصلاح بعض المشاكل القديمة.
|buildstatus| |Pypi Installs| |Latest Version| |Supported Python Versions|
|packagestatus|
.. contents::
مفكك أصلي متعدد الإصدارات بلغة Python ومفكك أجزاء. إعادة صياغة لـ uncompyle6_.
قدمت حديثًا حول هذا الموضوع في BlackHat Asia 2024 <https://youtu.be/H-7ZNrpsV50?si=nOaixgYHr7RbILVS>_.
decompyle3 يترجم البايت كود الخاص بلغة Python مرة أخرى إلى شيفرة مصدرية مكافئة. يقبل البايت كود من إصدار Python 3.7 فصاعدًا.
لفك تجميع البايت كود الأقدم في Python، انظر uncompyle6_.
Uncompyle6 رائع، لكن لديه مشكلة أساسية في طريقة تعامله مع تدفق التحكم. في الأيام الأولى لـ Python، عندما كان التحسين قليلًا وكانت الشيفرة تُنشأ بطريقة موجهة نحو القوالب، كان يمكن معرفة هياكل تدفق التحكم ببساطة من خلال النظر إلى أنماط الشيفرة.
على مر السنين، أدى المزيد من تحسين الشيفرة، خاصة فيما يتعلق بمعالجة القفزات، إلى جعل دعم الكشف عن تدفق التحكم بشكل صارم من أنماط الشيفرة أكثر صعوبة. لوحظ هذا منذ Python 2.4 (2004)، ولكن نظرًا لأن هذه مشكلة صعبة، لم يتم معالجتها حتى الآن بطريقة مرضية.
المحاولة الأولى لإصلاح هذه المشكلة كانت بإضافة علامات في تيار التعليمات، وكانت هذه العلامة في البداية عبارة عن تعليمة COME_FROM، ثم استخدامها في اكتشاف الأنماط.
على مر السنين، قمت بتوسيع ذلك ليكون أكثر تحديدًا، فأضيفت COME_FROM_LOOP و COME_FROM_WITH. وأضفت فحوصات في وقت تقليل القواعد للتأكد من تطابق القفزات مع أهداف COME_FROM المفترضة.
ومع ذلك، كل هذا معقد وغير متين، وقد أبطأ عملية فك التحليل بشكل كبير، وهو غير قابل للاستمرار.
في هذا المشروع، بدأنا إعادة كتابة وإعادة هيكلة القواعد.
ومع ذلك، حتى هذا لا يكفي. يحتاج تدفق التحكم إلى المعالجة باستخدام المهيمنات (dominators) والمهيمنات العكسية (reverse-dominators)، وهو ما يمكن أن يقدمه مشروع python-control-flow_.
هذا ما أفعله أخيرًا ببطء في مشروع آخر غير عام. إنه الكثير من العمل. التمويل عبر الرعاية، على الرغم من تقديره الكبير، لا يتناسب مع حجم الجهد المبذول، وحاليًا لدي وظيفة بدوام كامل. لذلك قد يستغرق الأمر وقتًا قبل أن يصبح متاحًا للعامة، إن حدث أصلاً.
يمكن تشغيل الشيفرة هنا على إصدارات Python 3.7 أو 3.8. تم اختبار ملفات البايت كود التي يمكن قراءتها على بايت كود Python من الإصدارين 3.7 و 3.8.
يمكنك التثبيت من PyPI باستخدام الاسم decompyle3::
pip install decompyle3
للتثبيت من الشيفرة المصدرية، يستخدم هذا المشروع setup.py، لذا يتبع الروتين القياسي لـ Python::
$ pip install -e . # set up to run from source tree
أو::
$ python setup.py install # may need sudo
كما يتم توفير ملف GNU Makefile، لذا :code:make install (ربما كـ root أو باستخدام sudo) سيقوم بالخطوات المذكورة أعلاه.
::
make check
تمت إضافة ملف GNU makefile لتسهيل إعداد وتشغيل الأمر الصحيح، وتشغيل الاختبارات من الأسرع إلى الأبطأ.
إذا كان لديك remake_ مثبتًا، يمكنك رؤية قائمة بجميع المهام بما في ذلك الاختبارات عبر :code:remake --tasks
قم بتشغيل
::
$ decompyle3 compiled-python-file-pyc-or-pyo
لمعرفة تعليمات الاستخدام:
::
$ decompyle3 -h
إذا كنت تريد التحقق من صحة تركيب Python لعملية فك التجميع، أضف الخيار :code:--syntax-verify. ومع ذلك، يتغير تركيب Python. يجب استخدام هذا الخيار إذا كان البايت كود هو البايت كود الصحيح لمفسر Python الذي سيتحقق من التركيب.
يمكنك أيضًا مقارنة النتائج مع مفكك آخر مثل unpyc37_. نظرًا لأنهما يعملان بشكل مختلف، فإن الأخطاء هنا غالبًا ما لا توجد هناك، والعكس صحيح.
هناك فئة مثيرة للاهتمام من هذه البرامج متاحة بسهولة لتقديم تحقق أقوى: تلك البرامج التي، عند تشغيلها، تختبر نفسها. تتضمن مجموعة الاختبارات الخاصة بنا هذه البرامج.
ويأتي Python مع مجموعة أخرى من البرامج مثل هذا: مجموعة اختباراته للمكتبة القياسية. لدينا بعض الشيفرات في :code:test/stdlib لتسهيل هذا النوع من الفحص أيضًا.
نحن ندعم فقط الإصدارات المنشورة، وليس الإصدارات المرشحة. لاحظ مع ذلك أن السحر (magic number) للإصدار المنشور عادة ما يكون نفس آخر إصدار مرشح قبل الإصدار.
نحن أيضًا لا نتعامل مع كود PJOrion_ أو أي كود مشوش. بالنسبة لـ PJOrion جرب: PJOrion Deobfuscator_ لفك تشويش البايت كود والحصول على بايت كود صالح قبل استخدام هذه الأداة; قد يساعدك pydecipher_ في ذلك.
هذا البرنامج لا يمكنه فك تجميع ملفات Windows EXE التي تم إنشاؤها بواسطة Py2EXE_، على الرغم من أنه يمكننا على الأرجح فك تجميع الشيفرة بعد استخراج البايت كود بشكل صحيح. قد يساعد Pydeinstaller <https://github.com/charles-dyfis-net/pydeinstaller>_ في تفكيك مجمعات Pyinstaller.
معالجة قوائم طويلة مرضيًا من التعبيرات أو العبارات تكون بطيئة. نحن لا نتعامل مع Cython_ أو MicroPython، اللذان لا يستخدمان البايت كود.
هناك العديد من الأخطاء في فك التجميع. وهذا صحيح بالنسبة لأي مفكك CPython آخر واجهته، حتى تلك التي ادعت أنها "مثالية" على إصدار معين مثل 2.4.
مع تطور Python، يصبح فك التجميع أصعب أيضًا لأن التجميع أصبح أكثر تعقيدًا واللغة نفسها أكثر تعقيدًا. أظن أن المحاولات ستكون أقل عددًا من المحاولات المخصصة مثل unpyc37_ (الذي يعتمد على مفكك 3.3) ببساطة لأنه أصبح القيام بذلك أصعب. الخبر السار، على الأقل من وجهة نظري، هو أنني أعتقد أنني أفهم ما هو مطلوب لمعالجة المشكلات بطريقة أكثر متانة. لكن في الوقت الحالي، حتى يصبح المشروع أفضل تمويلًا، لا أنوي بذل أي جهد جاد لدعم إصدارات Python 3.8 أو 3.9، بما في ذلك الأخطاء التي قد تظهر. أتخيل أنني قد أكون مهتمًا بها في وقت ما.
يمكنك بسهولة العثور على أخطاء عن طريق تشغيل الاختبارات ضد مجموعة الاختبارات القياسية التي يستخدمها Python لفحص نفسه. في أي وقت، هناك العشرات من المشكلات المعروفة المعزولة بشكل جيد والتي يمكن حلها إذا تم تخصيص الوقت للقيام بذلك. المشكلة هي أنه ليس هناك العديد من الأشخاص الذين عملوا على إصلاح الأخطاء.
قد تصادف خطأً وترغب في الإبلاغ عنه. يرجى فعل ذلك. لكن كن على علم أنه قد لا يحظى باهتمامي لبعض الوقت. إذا قمت برعاية أو دعم المشروع بطريقة ما، سأعطي أولوية لمشاكلك فوق قائمة الأشياء الأخرى التي قد أفعلها بدلاً من ذلك. في حالات نادرة، يمكنني القيام بفك تجميع يدوي للبايت كود مقابل رسوم. ومع ذلك، هذا مكلف، وعادة ما يتجاوز ما يرغب معظم الناس في دفعه.
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:
.. _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%B eight%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