
Исполняемые файлы Python, созданные через PyInstaller, cx_Freeze или py2exe, содержат скомпилированные *.pyc файлы, упакованные в архив. Для восстановления исходного кода необходимо извлечь содержимое exe, определить версию Python и версию упаковщика. PyInstaller применяет собственный формат архива, часто сжатый zlib, что требует предварительной распаковки перед декомпиляцией.
Для PyInstaller используется последовательность: pyinstxtractor извлекает архив, после чего *.pyc файлы обрабатываются декомпиляторами вроде uncompyle6 или decompyle3. Без учёта версии Python и упаковщика декомпиляция часто приводит к ошибкам синтаксиса или потерям функций. Для стабильного результата рекомендуется сначала тестировать процесс на копии файла.
Exe-файлы, собранные с cx_Freeze или py2exe, формируют структуру с директориями и бинарными ресурсами. Рекомендуется предварительно анализировать структуру, идентифицировать *.pyc файлы и использовать декомпиляторы, совместимые с версией Python, применяемой при сборке. Дополнительно полезно проверять целостность байт-кода, чтобы избежать неполной декомпиляции.
Точность декомпиляции напрямую зависит от соответствия инструментов версии интерпретатора, упаковщика и формата байт-кода. Использование устаревших декомпиляторов приводит к потере методов и конструкций. Для сложных exe-файлов рекомендуется сохранять оригинал без изменений и вести поэтапную декомпиляцию с проверкой результатов на каждом шаге.
Определение типа упаковки exe-файла перед декомпиляцией

Перед декомпиляцией Python exe важно точно определить способ упаковки файла, так как от этого зависит выбор инструментов и методик восстановления исходного кода.
Наиболее распространённые упаковщики для Python exe:
- PyInstaller: создает exe с включенным Python-интерпретатором и пакетом библиотек. Признаки: наличие секций
PYZ,PKGв бинарном файле. - cx_Freeze: формирует exe с отдельными библиотечными файлами рядом с исполняемым файлом. Часто сопровождается папкой
lib. - py2exe: exe сопровождается
library.zipс исходными модулями. - Nuitka: компилирует Python в C, после чего создается стандартный exe без явных Python-библиотек.
Методы определения типа упаковки:
- Анализ структуры файла: открыть exe в hex-редакторе или PE-утилите (например, PEiD, CFF Explorer). PyInstaller и py2exe оставляют характерные подписи в секциях ресурсов.
- Проверка присутствия библиотек: наличие
library.zip,PKGилиPYZуказывает на конкретный упаковщик. - Использование утилит:
pyinstxtractor.pyавтоматически определяет PyInstaller и извлекает содержимое;unpy2exeдля py2exe.
После точного определения упаковки можно выбирать специализированные декомпиляторы и инструменты для извлечения Python-скриптов, минимизируя риск повреждения данных и упрощая последующую реконструкцию кода.
Использование pyinstxtractor для извлечения скриптов из PyInstaller
Pyinstxtractor позволяет извлекать содержимое exe-файлов, созданных с помощью PyInstaller. Этот инструмент работает с архивами, встроенными в exe, включая байткод Python и ресурсы.
Для начала необходимо скачать скрипт pyinstxtractor.py с официального репозитория. После этого выполнение происходит через командную строку:
python pyinstxtractor.py имя_файла.exe
В результате создается папка имя_файла.exe_extracted, в которой находятся:
| Файл/Папка | Назначение |
|---|---|
PYZ-00.pyz_extract |
Архив байткода Python, который необходимо дополнительно декомпилировать |
toc |
Список содержимого exe-файла с указанием типов и порядковых номеров |
| Другие файлы | Встроенные ресурсы, DLL-библиотеки, изображения и конфигурации |
Для восстановления исходного кода используется декомпилятор, например uncompyle6:
uncompyle6 -o output_dir PYZ-00.pyz_extract/имя_файла.pyc
Рекомендации при работе с pyinstxtractor:
| Совет | Описание |
|---|---|
| Версия Python | Использовать версию Python, совместимую с версией исходного exe. PyInstaller 3.x обычно требует Python 3.6–3.8 |
| Работа с пакетами | Если exe содержит дополнительные библиотеки, их байткод извлекается отдельно и требует декомпиляции поочередно |
| Резервное копирование | Перед декомпиляцией сохранить оригинальный exe, чтобы избежать повреждения данных |
| Автоматизация | Скрипт позволяет пакетно обрабатывать несколько файлов через цикл командной строки |
Pyinstxtractor не декомпилирует байткод автоматически, поэтому последующий шаг – применение Python-декомпилятора. Этот подход позволяет полностью восстановить структуру проекта, включая модули и ресурсы.
Применение uncompyle6 для восстановления исходного кода Python
uncompyle6 позволяет декомпилировать байт-код Python обратно в читаемый исходный код. Он поддерживает версии Python с 2.5 по 3.9 и способен обрабатывать как отдельные файлы .pyc, так и пакеты, упакованные в .exe с помощью PyInstaller или cx_Freeze.
Основные шаги работы с uncompyle6:
- Установка через pip:
pip install uncompyle6. Проверка установки:uncompyle6 --version. - Декомпиляция отдельного файла .pyc:
uncompyle6 -o ./output myfile.pyc. Параметр-oуказывает папку для сохранения восстановленного кода. - Обработка нескольких файлов одновременно:
uncompyle6 -r -o ./output_dir ./compiled_dir. Опция-rрекурсивно обрабатывает все файлы .pyc в указанной директории. - Автоматическая проверка версии Python: uncompyle6 анализирует заголовок байт-кода и выбирает корректный декомпилятор для соответствующей версии.
- Обработка сжатых пакетов: для файлов .exe сначала извлекаются .pyc из архива PyInstaller с помощью
pyi-archive_viewer, затем они декомпилируются uncompyle6.
Рекомендации при работе с uncompyle6:
- Всегда создавайте резервные копии исходных .pyc, чтобы избежать потери данных при ошибках декомпиляции.
- Для сложных проектов с множеством модулей используйте рекурсивную декомпиляцию и сохраняйте структуру папок.
- Если uncompyle6 не справляется с конкретной версией Python, попробуйте версию 3.x или альтернативные инструменты, например decompyle3.
- После декомпиляции проверяйте синтаксис и корректность восстановленного кода, так как возможны мелкие расхождения в форматировании или именах временных переменных.
- Для ускорения обработки больших пакетов рекомендуется параллельная декомпиляция с помощью скриптов Python, вызывающих uncompyle6 для каждого файла.
Работа с exe, созданными через cx_Freeze или py2exe
Файлы exe, созданные с помощью cx_Freeze, включают в себя архив Python-модулей в формате ZIP и основной исполняемый файл, который инициализирует интерпретатор. Для извлечения содержимого используйте утилиты типа 7-Zip или встроенный модуль zipfile в Python. Архив обычно находится в подпапке `library.zip` или рядом с exe, его можно открыть напрямую и получить доступ к pyc-файлам.
Py2exe формирует exe с включением всех зависимостей в отдельный каталог или в один самораспаковывающийся архив. В случае единого файла exe сначала требуется извлечь содержимое с помощью инструментов вроде InnoExtract или ExeinfoPE, чтобы получить pyc-модули. Путь к pyc может отличаться в зависимости от параметров `bundle_files` при сборке.
Для декомпиляции pyc-файлов обеих систем рекомендуется использовать uncompyle6 или decompyle3. Важно учитывать версию Python, использованную при сборке exe, так как несовпадение версий часто вызывает ошибки декомпиляции. Pyc-файлы cx_Freeze обычно соответствуют версии интерпретатора, указанной при сборке, тогда как py2exe может генерировать pyc разных версий для сторонних библиотек.
При работе с exe, собранными через cx_Freeze, полезно проверять наличие скрытых зависимостей, которые могут храниться в отдельных папках с именами вроде `lib` или `DLLs`. Py2exe может упаковывать системные DLL внутри exe, что требует их извлечения перед анализом. В обоих случаях рекомендуется использовать виртуальную среду с той же версией Python для корректного восстановления исходного кода.
Дополнительно для cx_Freeze и py2exe существуют специализированные скрипты, которые автоматически извлекают pyc и преобразуют их в исходники, минимизируя ручной поиск файлов. Эти инструменты анализируют структуру архива и создают соответствующую иерархию каталогов, что ускоряет процесс декомпиляции больших проектов.
Преобразование байткода.pyc в читаемый Python код

Файлы с расширением .pyc содержат байткод, скомпилированный интерпретатором Python. Для извлечения исходного кода используют декомпиляторы, способные преобразовать байткод обратно в Python. Наиболее распространённые инструменты – `uncompyle6` для Python 2.7–3.7 и `decompyle3` для версий 3.7–3.11.
Процесс начинается с идентификации версии Python, использованной для компиляции файла. Байткод разных версий несовместим, что делает критически важным корректное определение версии. Для этого можно использовать библиотеку `pycdc` или утилиту `fileheader`.
После определения версии выполняется декомпиляция. В командной строке для `uncompyle6` это выглядит так: uncompyle6 -o ./output file.pyc, где `-o` указывает директорию для сохранения декомпилированного файла. Для `decompyle3` синтаксис аналогичен: decompyle3 -o ./output file.pyc. Оба инструмента формируют текстовый файл с восстановленным Python-кодом, сохраняя структуру функций и классов.
При работе с защищёнными или оптимизированными `.pyc` файлами возможны ошибки декомпиляции, выражающиеся в пропущенных строках или некорректных идентификаторах. Для таких случаев рекомендуется использовать сочетание декомпиляторов: сначала `uncompyle6`, затем проверка и корректировка вручную, либо использование `pycdc` для отдельных сложных участков.
Для автоматизации анализа больших наборов `.pyc` файлов удобно писать скрипты на Python с вызовом декомпиляторов через `subprocess`, сохраняя исходный код в структуре каталогов, повторяющей исходные пакеты. Это ускоряет последующую проверку и редактирование кода.
После декомпиляции стоит провести статический анализ кода для выявления зависимостей, импортов и структуры функций. Инструменты типа `pylint` или `mypy` помогают оценить корректность и полноту восстановленного кода перед его дальнейшей модификацией или отладкой.
Отладка и проверка восстановленного кода на ошибки
Далее рекомендуется использовать статический анализатор кода, например pylint или flake8. Они обнаруживают неиспользуемые переменные, несоответствие стилей и потенциальные логические ошибки. Восстановленный код часто содержит некорректные имена функций и классов, которые необходимо исправлять вручную.
Для проверки выполнения функций применяют модуль unittest или pytest. Создание тестов для ключевых участков кода позволяет выявить расхождения между ожидаемым и фактическим поведением программы. Особое внимание уделяется обработке исключений и корректной работе с внешними файлами.
Использование отладчика (например, встроенного pdb или IDE отладчика) позволяет пошагово выполнять код, контролировать значения переменных и ловить ошибки исполнения. Восстановленный код часто содержит некорректные циклы и ветвления, которые проще выявить интерактивной отладкой.
Для сложных приложений целесообразно подключить логирование через модуль logging. Это помогает фиксировать реальное выполнение функций и параметры, которые могут вызывать сбои. Логирование особенно полезно при восстановлении сетевых или многопоточных программ.
После устранения синтаксических и логических ошибок рекомендуется повторить процесс декомпиляции на новых версиях exe, чтобы убедиться в корректности исправлений и отсутствии скрытых ошибок.
Вопрос-ответ:
Можно ли полностью восстановить исходный код из Python exe файла?
В большинстве случаев можно получить достаточно близкую к исходной структуру кода, но точная идентичность с исходником не гарантируется. При компиляции в exe могут происходить оптимизации и изменения имён переменных, что усложняет полное восстановление. Обычно декомпиляторы возвращают читаемый код с комментариями и логикой, но форматирование и исходные имена функций могут отличаться.
Какие инструменты чаще всего используют для декомпиляции Python exe?
Существуют несколько популярных решений. Среди них PyInstaller Extractor позволяет извлечь файлы из exe, а uncompyle6 и decompyle3 помогают восстановить Python-код из pyc-файлов. Иногда используют комбинацию этих инструментов: сначала извлекают pyc-файлы из exe, а затем декомпилируют их в читаемый Python-код.
Как влияет способ упаковки exe на процесс декомпиляции?
Если exe создан с использованием PyInstaller или cx_Freeze, внутри него находится архив с pyc-файлами. Декомпиляция будет проще, если структура пакета стандартная. Если же использованы обфускаторы или нестандартные упаковщики, извлечение pyc-файлов может стать сложным, и часть кода может быть недоступна или искажена.
Можно ли декомпилировать exe без установки Python на компьютере?
Да, это возможно. Некоторые декомпиляторы работают как автономные приложения и не требуют установленного интерпретатора Python. Также существуют онлайн-сервисы и инструменты на других платформах, которые позволяют загрузить exe и получить pyc или исходный код без локальной установки Python.
Существуют ли ограничения на декомпиляцию коммерческих Python приложений?
Да, существуют юридические и этические ограничения. Декомпиляция может нарушать авторские права или лицензионное соглашение. Использование восстановленного кода в своих целях без разрешения правообладателя может быть незаконным. Для изучения или исправления собственных программ декомпиляция обычно безопасна, но для чужих проектов следует соблюдать законы.
