Skip to main content

Python cross-version byte-code deparser

Project description

buildstatus

uncompyle6

A native Python cross-version Decompiler and Fragment Decompiler. The successor to decompyle, uncompyle, and uncompyle2.

Introduction

uncompyle6 translates Python bytecode back into equivalent Python source code. It accepts bytecodes from Python version 1.5, and 2.1 to 3.7 or so, including PyPy bytecode and Dropbox’s Python 2.5 bytecode.

Why this?

There were a number of decompyle, uncompile, uncompyle2, uncompyle3 forks around. All of them came basically from the same code base, and almost all of them no were no longer actively maintained. Only one handled Python 3, and even there, only 3.2 or 3.3 depending on which code is used. This code pulls these together and moves forward. This project has the most complete support for Python 3.3 and above. It also addresses a number of open issues in the previous forks.

What makes this different from other CPython bytecode decompilers?: its ability to deparse just fragments and give source-code information around a given bytecode offset.

I use this to deparse fragments of code inside my trepan debuggers. For that, I need to record text fragments for all bytecode offsets (of interest). This purpose although largely compatible with the original intention is yet a little bit different. See this for more information.

The idea of Python fragment deparsing given an instruction offset can be used in showing stack traces or any program that wants to show a location in more detail than just a line number. It can be also used when source-code information does not exist and there is just bytecode information.

Requirements

This project requires Python 2.6 or later, PyPy 3-2.4, or PyPy-5.0.1. Python versions 2.4-2.7 are supported in the python-2.4 branch. The bytecode files it can read has been tested on Python bytecodes from versions 1.5, 2.1-2.7, and 3.0-3.6 and the above-mentioned PyPy versions.

Installation

This uses setup.py, so it follows the standard Python routine:

pip install -e .
pip install -r requirements-dev.txt
python setup.py install # may need sudo
# or if you have pyenv:
python setup.py develop

A GNU makefile is also provided so make install (possibly as root or sudo) will do the steps above.

Testing

make check

A GNU makefile has been added to smooth over setting running the right command, and running tests from fastest to slowest.

If you have remake installed, you can see the list of all tasks including tests via remake --tasks

Usage

Run

$ uncompyle6 *compiled-python-file-pyc-or-pyo*

For usage help:

$ uncompyle6 -h

If you want strong verification of the correctness of the decompilation process, add the –verify option. But there are situations where this will indicate a failure, although the generated program is semantically equivalent. Using option –weak-verify will tell you if there is something definitely wrong. Generally, large swaths of code are decompiled correctly, if not the entire program.

You can also cross compare the results with pycdc . Since they work differently, bugs here often aren’t in that, and vice versa.

Known Bugs/Restrictions

The biggest known and possibly fixable (but hard) problem has to do with handling control flow. All of the Python decompilers I have looked at have the same problem. In some cases we can detect an erroneous decompilation and report that.

Over 98% of the decompilation of Python standard library packages in Python 2.7.12 verifies correctly. Over 99% of Python 2.7 and 3.3-3.5 “weakly” verify. Python 2.6 drops down to 96% weakly verifying. Other versions drop off in quality too.

Verification is the process of decompiling bytecode, compiling with a Python for that bytecode version, and then comparing the bytecode produced by the decompiled/compiled program. Some allowance is made for inessential differences. But other semantically equivalent differences are not caught. For example 1 and 0 is decompiled to the equivalent 0; remnants of the first true evaluation (1) is lost when Python compiles this. When Python next compiles 0 the resulting code is simpler.

Weak Verification on the other hand doesn’t check bytecode for equivalence but does check to see if the resulting decompiled source is a valid Python program by running the Python interpreter. Because the Python language has changed so much, for best results you should use the same Python Version in checking as used in the bytecode.

Later distributions average about 200 files. There is some work to do on the lower end Python versions which is more difficult for us to handle since we don’t have a Python interpreter for versions 1.5, 1.6, and 2.0.

In the Python 3 series, Python support is is strongest around 3.4 or 3.3 and drops off as you move further away from those versions. Python 3.6 changes things drastically by using word codes rather than byte codes. That has been addressed, but then it also changes function call opcodes and its semantics and has more problems with control flow than 3.5 has.

Currently not all Python magic numbers are supported. Specifically in some versions of Python, notably Python 3.6, the magic number has changes several times within a version. We support only the released magic. There are also customized Python interpreters, notably Dropbox, which use their own magic and encrypt bytcode. With the exception of the Dropbox’s old Python 2.5 interpreter this kind of thing is not handled.

We also don’t handle PJOrion obfuscated code. For that try: PJOrion Deobfuscator to unscramble the bytecode to get valid bytecode before trying this tool.

Handling pathologically long lists of expressions or statements is slow.

There is lots to do, so please dig in and help.

See Also

Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

uncompyle6-2.13.2.tar.gz (1.5 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

uncompyle6-2.13.2-py35-none-any.whl (157.0 kB view details)

Uploaded Python 3.5

uncompyle6-2.13.2-py34-none-any.whl (157.0 kB view details)

Uploaded Python 3.4

uncompyle6-2.13.2-py33-none-any.whl (157.0 kB view details)

Uploaded Python 3.3

uncompyle6-2.13.2-py27-none-any.whl (157.0 kB view details)

Uploaded Python 2.7

uncompyle6-2.13.2-py26-none-any.whl (157.0 kB view details)

Uploaded Python 2.6

uncompyle6-2.13.2-py3.5.egg (338.1 kB view details)

Uploaded Egg

uncompyle6-2.13.2-py3.4.egg (339.6 kB view details)

Uploaded Egg

uncompyle6-2.13.2-py3.3.egg (343.8 kB view details)

Uploaded Egg

uncompyle6-2.13.2-py2.7.egg (333.3 kB view details)

Uploaded Egg

uncompyle6-2.13.2-py2.6.egg (334.0 kB view details)

Uploaded Egg

uncompyle6-2.13.2-py2.5.egg (332.7 kB view details)

Uploaded Egg

uncompyle6-2.13.2-py2.4.egg (336.5 kB view details)

Uploaded Egg

File details

Details for the file uncompyle6-2.13.2.tar.gz.

File metadata

  • Download URL: uncompyle6-2.13.2.tar.gz
  • Upload date:
  • Size: 1.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for uncompyle6-2.13.2.tar.gz
Algorithm Hash digest
SHA256 45878a43ed0bb000f56788cb7f3a4fb77a3ced928a87fc33c879fa31fe9b0d8d
MD5 c01a60d3677ef826674c4348ebe54039
BLAKE2b-256 6d068e96ad10fadb4a2bcb4aa4a5512135b4d201108bf6fc3d09ddfcc5b1af29

See more details on using hashes here.

File details

Details for the file uncompyle6-2.13.2-py35-none-any.whl.

File metadata

File hashes

Hashes for uncompyle6-2.13.2-py35-none-any.whl
Algorithm Hash digest
SHA256 1c234ea248e382120832bafe321181971d9cc7e66d965db398d2091dac912446
MD5 041f8acf09d0fbbfa5c5fe28f022a8c1
BLAKE2b-256 a865c860b0e74faa3430ed8d2f495b756cc0416be60727a00f15d073967fc926

See more details on using hashes here.

File details

Details for the file uncompyle6-2.13.2-py34-none-any.whl.

File metadata

File hashes

Hashes for uncompyle6-2.13.2-py34-none-any.whl
Algorithm Hash digest
SHA256 819507ea93f7ffaa754d763e48f0b64a0dcef42f00b1bb303ce03f48e3cf355c
MD5 d20425440ee52c8c4446872ec346cbf9
BLAKE2b-256 517d8a5deaae47100559cf4ca149afc5b4921b2f08a8ea4680d4675f967a9287

See more details on using hashes here.

File details

Details for the file uncompyle6-2.13.2-py33-none-any.whl.

File metadata

File hashes

Hashes for uncompyle6-2.13.2-py33-none-any.whl
Algorithm Hash digest
SHA256 a7d2801d9b96353ee3b398b216744c77be1376c3172a8d4b1c4ca0b9b515d727
MD5 0b870888ed53892afef318abab5fb03c
BLAKE2b-256 8dc29318cc7d23b7f743379b144c6a052f354f0eda0ea826e3ef9528f8d78cf2

See more details on using hashes here.

File details

Details for the file uncompyle6-2.13.2-py27-none-any.whl.

File metadata

File hashes

Hashes for uncompyle6-2.13.2-py27-none-any.whl
Algorithm Hash digest
SHA256 32fb78af2253c2481976464e466f40a773fafbc47b0a1ff20d15fde57b644669
MD5 a6ba382abf3cee8b6cf5d5b5124dd8b1
BLAKE2b-256 9cf8793067b3f6a14645d4944f42ee9cd6fc69e16bdad5c45ef7a6fd3d314876

See more details on using hashes here.

File details

Details for the file uncompyle6-2.13.2-py26-none-any.whl.

File metadata

File hashes

Hashes for uncompyle6-2.13.2-py26-none-any.whl
Algorithm Hash digest
SHA256 58e696c6dbf237eb82175505be1c8147f9c1f86767655bea54de30f102ba8c18
MD5 80d3e77ebd39947effc343c3a3c01d41
BLAKE2b-256 3806b53de781831df2b7fbdb1651012365f60bddfce4913afdf4a4bb0552fa4d

See more details on using hashes here.

File details

Details for the file uncompyle6-2.13.2-py3.5.egg.

File metadata

File hashes

Hashes for uncompyle6-2.13.2-py3.5.egg
Algorithm Hash digest
SHA256 cbcf81e36054e7043a63171e74d84bcc0f919c83ea1b70161d7c16030deaca94
MD5 5131834a93ded684639ac1ddc6ce9f88
BLAKE2b-256 8505889f9d7e286c34d55147d2095dfeb61b4e93ef4e5241136daaa1a4c9e16a

See more details on using hashes here.

File details

Details for the file uncompyle6-2.13.2-py3.4.egg.

File metadata

File hashes

Hashes for uncompyle6-2.13.2-py3.4.egg
Algorithm Hash digest
SHA256 ab723922a81dc3c6c24025a1a5da7a36a313a4a110515507096a60fb8a6d39cd
MD5 2599e9c7b89a15ef42dabe6f2d7a31f5
BLAKE2b-256 4c012efebcada84b9333dced47e0731a0947a607928d6d26a81e0b90cda26fb1

See more details on using hashes here.

File details

Details for the file uncompyle6-2.13.2-py3.3.egg.

File metadata

File hashes

Hashes for uncompyle6-2.13.2-py3.3.egg
Algorithm Hash digest
SHA256 110da5150fdef2aa870ba9a07a5d280ed414ccc9d478fd3ee8552bb081b0214c
MD5 3b77b9ee2e837f89658394a32c9846d5
BLAKE2b-256 5551c029df066f4d98d9a4061c3d6e03119f3a13dcb9d34fd77a7365b155255a

See more details on using hashes here.

File details

Details for the file uncompyle6-2.13.2-py2.7.egg.

File metadata

File hashes

Hashes for uncompyle6-2.13.2-py2.7.egg
Algorithm Hash digest
SHA256 36d382616314f1c2a23abf83aefc27bd2148ed2b8390b2ba54e8a0126303daaf
MD5 dbc99ece92c69b52237c7cc70f9576ab
BLAKE2b-256 231c0a75eaa87f43aa1b4f1ffd7334fda056059f3ea265fb49db5e1bd5145880

See more details on using hashes here.

File details

Details for the file uncompyle6-2.13.2-py2.6.egg.

File metadata

File hashes

Hashes for uncompyle6-2.13.2-py2.6.egg
Algorithm Hash digest
SHA256 52bac145a11cf694e450533b75f5984f2b7bf3810d30ae85f71c5e5c2cb9eb33
MD5 26e38764a2bca7d56e1307fb5e9df414
BLAKE2b-256 dad673e352f01934e7d501b4ffcf18142bfc3e0d7ec04a01881e96460f05b7e3

See more details on using hashes here.

File details

Details for the file uncompyle6-2.13.2-py2.5.egg.

File metadata

File hashes

Hashes for uncompyle6-2.13.2-py2.5.egg
Algorithm Hash digest
SHA256 c69ef717a8242ecf9ab259c41930db8ed868530b9e1e3af357843cda258edba3
MD5 b9ac127cdc4c0741bccc974de11f23fe
BLAKE2b-256 187438b891a73d058c5f58a6b6cae2af280e6594bd6f284243302d13e346634e

See more details on using hashes here.

File details

Details for the file uncompyle6-2.13.2-py2.4.egg.

File metadata

File hashes

Hashes for uncompyle6-2.13.2-py2.4.egg
Algorithm Hash digest
SHA256 9704cfc8150d477d09eaa40cd10824b364c189e02a8624bc73430967cfbdfd70
MD5 1c74c04b2aa069f1b7ed058b043cbb9c
BLAKE2b-256 ff5d9d05a43313e627fed190a1f3568a5d590461875419a36aa9d9e08d4cc67b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page