
Декомпилятор Python для версий 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. Он принимает байт-коды начиная с версии Python 3.7.
Для декомпиляции более старых байт-кодов Python см. uncompyle6_.
Uncompyle6 — отличный инструмент, но у него есть фундаментальная проблема в том, как он обрабатывает поток управления. В ранние дни Python, когда было мало оптимизации и код генерировался шаблонным образом, определение структур потока управления можно было выполнять просто взглянув на паттерны кода.
С годами больше оптимизации кода, особенно касающейся обработки переходов, сделало поддержку обнаружения потока управления исключительно по паттернам кода труднее. Это было замечено ещё в Python 2.4 (2004), но поскольку это сложная проблема, до сих пор она не была решена удовлетворительным образом.
Первоначальная попытка исправить эту проблему заключалась в добавлении маркеров в поток инструкций. Первоначально это была инструкция COME_FROM, а затем её использовали в обнаружении паттернов.
С годами я расширил её, сделав более специфичной, поэтому были добавлены COME_FROM_LOOP и COME_FROM_WITH. И я добавил проверки во время сокращения грамматики, чтобы попытаться гарантировать, что переходы соответствуют предполагаемым целям COME_FROM.
Однако всё это сложно, ненадёжно, сильно замедлило декомпиляцию и, по сути, нежизнеспособно.
В этом проекте мы начали переписывать и рефакторить грамматику.
Однако даже этого недостаточно. Поток управления необходимо обрабатывать с помощью доминаторов и обратных доминаторов, что может дать проект python-control-flow_.
Я наконец-то медленно делаю это в ещё одном непубличном проекте. Это много работы. Финансирование в виде спонсорства, хотя и очень ценится, несоизмеримо с объёмом усилий, и в настоящее время у меня есть работа на полный день. Так что может пройти время, прежде чем это станет доступно публично, если вообще станет.
Код здесь можно запускать на Python версий 3.7 или 3.8. Файлы байт-кода, которые он может читать, были протестированы на байт-кодах Python версий 3.7 и 3.8.
Вы можете установить из PyPI, используя имя decompyle3::
pip install decompyle3
Для установки из исходного кода этот проект использует setup.py, поэтому следует стандартной процедуре Python::
$ pip install -e . # настройка для запуска из дерева исходников
или::
$ python setup.py install # может потребоваться sudo
Также предоставлен Makefile для GNU, поэтому :code:make install (возможно, с root или sudo) выполнит шаги выше.
::
make check
Был добавлен Makefile для GNU, чтобы упростить настройку и выполнение правильной команды, а также запуск тестов от самых быстрых до самых медленных.
Если у вас установлен remake_, вы можете увидеть список всех задач, включая тесты, через :code:remake --tasks
Запустите
::
$ decompyle3 скомпилированный-файл-python-расширения-pyc-или-pyo
Для справки по использованию:
::
$ decompyle3 -h
Если вы хотите проверку синтаксиса Python на корректность декомпиляции, добавьте опцию :code:--syntax-verify. Однако, поскольку синтаксис Python меняется, эту опцию следует использовать, если байт-код соответствует правильному байт-коду для интерпретатора Python, который будет проверять синтаксис.
Вы также можете сравнить результаты с другим декомпилятором Python, например unpyc37_. Поскольку они работают по-разному, ошибки здесь часто отсутствуют в нём, и наоборот.
Существует интересный класс таких программ, который легко доступен для более строгой проверки: те программы, которые при запуске тестируют себя. Наш набор тестов включает их.
И в Python есть ещё один набор таких программ: его собственный набор тестов для стандартной библиотеки. У нас также есть некоторый код в :code:test/stdlib для облегчения такого рода проверок.
Мы поддерживаем только релизные версии, не версии-кандидаты. Однако магическое число релизной версии обычно совпадает с последней версией-кандидатом перед релизом.
Мы также не обрабатываем PJOrion_ и другой обфусцированный код. Для PJOrion попробуйте: PJOrion Deobfuscator_ для распутывания байт-кода и получения валидного байт-кода перед использованием этого инструмента; pydecipher_ может помочь с этим.
Эта программа не может декомпилировать исполняемые файлы Microsoft Windows, созданные 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, который используется для самопроверки 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%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