Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
python-uncompyle6 — Декомпилятор байт-кода Python для разных версий | Kitploit
Инструменты/GitHubGitHub/rocky/python-uncompyle6
Статический анализОбратная инженерияОтладчикиАнализ Бинарных Файлов
GitHubrocky/python-uncompyle6

python-uncompyle6

Декомпилятор байт-кода Python для разных версий

Репозиторий
4.3k462161 день назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

|buildstatus| |Pypi Installs| |Latest Version| |Supported Python Versions|

|packagestatus|

.. contents::

uncompyle6

Нативный кросc-версионный декомпилятор и декомпилятор фрагментов Python. Преемник decompyle, uncompyle и uncompyle2.

Я выступал с докладом об этом на BlackHat Asia 2024 <https://youtu.be/H-7ZNrpsV50?si=nOaixgYHr7RbILVS>_.

Введение

uncompyle6 преобразует байткод Python обратно в эквивалентный исходный код Python. Он принимает байткоды от Python версии 1.0 до версии 3.8, охватывая более 24 лет релизов Python. Мы включаем байткод Dropbox Python 2.5 и некоторые байткоды PyPy.

Зачем это?

Хорошо, я скажу: это программное обеспечение потрясающее. Это больше, чем обычный хакерский декомпилятор. Используя технологию compiler_, программа создает дерево разбора программы из инструкций; узлы на верхних уровнях выглядят немного похожими на то, что может получиться из Python AST. Так что мы действительно можем классифицировать и понимать, что происходит в секциях байткода Python.

Основываясь на этом, другая вещь, которая отличает это от других декомпиляторов байткода CPython, — это возможность депарсировать только фрагменты исходного кода и предоставлять информацию об исходном коде вокруг заданного смещения байткода.

Я использую фрагменты дерева для депарсинга фрагментов кода во время выполнения внутри моих trepan_ отладчиков_. Для этой цели записываются смещения байткода и связываются с фрагментами исходного кода. Эта цель, хотя и совместима с первоначальным замыслом, всё же немного отличается. См. this_ для получения дополнительной информации.

Депарсинг фрагментов Python, заданный смещением инструкции, полезен при показе стек-трейсов и может быть встроен в любую программу, которая хочет отображать местоположение более подробно, чем просто номер строки во время выполнения. Этот код также может использоваться, когда информация об исходном коде не существует, а есть только байткод. Опять же, мои отладчики используют это.

Существовало (и до сих пор существует) несколько форков decompyle, uncompyle, uncompyle2, uncompyle3. Многие из них происходят в основном из одной кодовой базы, и (почти?) все они больше не поддерживаются активно. Один был действительно хорош в декомпиляции Python 1.5-2.3, другой действительно хорош в Python 2.7, но только этом. Другой обрабатывает Python 3.2 только; другой пропатчил его и обрабатывал только 3.3. Вы поняли идею. Этот код объединяет все эти форки вместе и движется вперед. В этой кодовой базе проведен серьезный рефакторинг и очистка по сравнению с теми старыми форками. Еще более экспериментальный рефакторинг происходит в decompyle3_.

Этот демонстративно показывает лучшие результаты при декомпиляции Python во всех версиях Python. И даже когда есть другой проект, который предоставляет декомпиляцию только для подмножества версий Python, мы обычно демонстративно лучше и для них.

Как мы можем это сказать? Взяв байткод Python, который поставляется с этой версией Python, и декомпилируя его. Среди тех, кто успешно декомпилирует, мы можем затем убедиться, что результирующие программы синтаксически корректны, запустив интерпретатор Python для этой версии байткода. Наконец, в случаях, когда программа имеет тест для самой себя, мы можем запустить проверку на декомпилированном коде.

Мы используем автоматизированные процессы для поиска ошибок. В трекерах проблем для других декомпиляторов вы найдете несколько ошибок, которые мы обнаружили по пути. Очень немногие из них исправлены в других декомпиляторах.

Требования

Код в git-репозитории может быть запущен от Python 2.4 до последней версии Python, за исключением Python 3.0 до 3.2. Добровольцы приветствуются для устранения этих недостатков, если есть желание это сделать.

Однако способ, которым это делается, заключается в разделении последовательных версий Python на ветки git:

master Python 3.11 и выше (использует установку через poetry и более новые идиомы Python) python-3.6-to-3.10 Python 3.6 до 3.10 (использует более новые f-строки, более современные идиомы и более современные аннотации типов) python-3.3-to-3.5 Python 3.3 до 3.5 (общий Python 3) python-3.0-to-3.2 Python 3.0 до 3.2 (ранний Python 3; 3.0 в некоторых областях был ближе к Python 2.6, чем к Python 2.7) python-2.4-to-2.7 Python 2.4 до 2.7 (общий Python 2)

PyPy, начиная с версии 2.4, также работает.

Файлы байткода, которые он может читать, были протестированы на байткодах Python версий 1.4, 2.1-2.7, 3.0-3.8 и более поздних версиях PyPy.

Установка

Для последних релизов Python (Python 3.11+) вы можете установить из PyPI, используя имя uncompyle6::

pip install uncompyle6

Для релизов Python до 3.11 не устанавливайте через PyPI, а вместо этого установите, используя файл из секции релизов GitHub. Для более старых Python использовался easy_install <https://python101.pythonlibrary.org/chapter29_pip.html#using-easy-install>_. Но это больше не поддерживается на PyPi или более новых версиях Python. И наоборот, poetry и pip (новые способы) не поддерживаются на старых Python.

Если версия Python, на которой вы запускаете uncompyle6, находится между Python 2.4 и 2.7, используйте tarball с именем uncompyle6_24-x.y.z.tar.gz.

Если версия Python, на которой вы запускаете uncompyle6, находится между Python 3.0 и 3.2, используйте tarball с именем uncompyle6_30-x.y.z.tar.gz.

Если версия Python, на которой вы запускаете uncompyle6, находится между Python 3.3 и 3.5, используйте tarball с именем uncompyle6_33-x.y.z.tar.gz.

Если версия Python, на которой вы запускаете uncompyle6, находится между Python 3.6 и 3.11, используйте tarball с именем uncompyle6_36-x.y.z.tar.gz.

Если версия Python, на которой вы запускаете uncompyle6, 3.11 или новее, используйте tarball с именем uncompyle6-x.y.z.tar.gz.

Вы также можете попробовать eggs или wheels, которые имеют то же обозначение версии, например, uncompyle6-x.y.z-py39-none-any.whl для установки Python 3.9. Однако обратите внимание, что версия без обозначения означает Python 3.11 или более новую.

Аналогично, tarball без _xx работает только с Python 3.11 или новее.

Обоснование использования веток Git ++++++++++++++++++++++++++++++++

В настоящее время невозможно (если не непрактично) иметь один исходный код Python такой сложности и с таким количеством возможностей, который может работать как на Python 2.7, так и на Python 3.13+. Языки разошлись настолько, и упаковка сильно различается. Фактически, практика упаковки для Python 3.11+ несовместима с Python 2.7 (и более ранними версиями, начиная с Python 2.4), который предпочитал "easy_install".

Установка из исходного текста ++++++++++++++++++++++++++++++

Чтобы установить из исходного кода, убедитесь, что у вас правильная ветка Git. См. раздел Требования для названий веток Git.

После установки правильной ветки::

$ pip install -e .  # настроить для запуска из дерева исходников

Также предоставляется GNU Makefile, так что :code:make install (возможно, от root или через sudo) выполнит указанные выше шаги.

Запуск тестов

::

make check

GNU makefile был добавлен, чтобы упростить настройку и запуск правильной команды, а также запуск тестов от самых быстрых до самых медленных.

Если у вас установлен remake_, вы можете увидеть список всех задач, включая тесты, через :code:remake --tasks

Использование

Запустите

::

$ uncompyle6 сжатый-python-файл-pyc-или-pyo

Для справки по использованию:

::

$ uncompyle6 -h

Верификация

В старых версиях Python было возможно проверить байткод, декомпилировав его, а затем скомпилировав с помощью интерпретатора Python для этой версии байткода. Сделав это, полученный байткод можно было сравнить с оригинальным. Однако, по мере улучшения генерации кода в Python, это стало невозможным.

Скачать инструмент