2016-04-30 15:20:09 +00:00
|
|
|
|buildstatus|
|
2015-12-22 02:36:35 +00:00
|
|
|
|
2015-12-13 05:25:34 +00:00
|
|
|
uncompyle6
|
2012-10-26 13:50:38 +00:00
|
|
|
==========
|
2012-06-05 08:46:41 +00:00
|
|
|
|
2016-06-01 17:51:08 +00:00
|
|
|
A native Python cross-version Decompiler and Fragment Decompiler.
|
|
|
|
Follows in the tradition of decompyle, uncompyle, and uncompyle2.
|
2015-12-19 08:14:48 +00:00
|
|
|
|
2012-06-05 08:46:41 +00:00
|
|
|
|
|
|
|
Introduction
|
|
|
|
------------
|
|
|
|
|
2016-01-02 20:55:48 +00:00
|
|
|
*uncompyle6* translates Python bytecode back into equivalent Python
|
2016-08-13 11:08:48 +00:00
|
|
|
source code. It accepts bytecodes from Python version 2.2 to 3.6 or
|
2016-07-25 13:06:13 +00:00
|
|
|
so, including PyPy bytecode.
|
2012-06-05 08:46:41 +00:00
|
|
|
|
2015-12-19 22:52:04 +00:00
|
|
|
Why this?
|
|
|
|
---------
|
2012-06-05 08:46:41 +00:00
|
|
|
|
2016-05-02 16:19:57 +00:00
|
|
|
There were a number of decompyle, uncompile, uncompyle2, uncompyle3
|
2016-07-25 13:06:13 +00:00
|
|
|
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. This code pulls these
|
|
|
|
together and moves forward. It also addresses a number of open issues
|
|
|
|
in the previous forks.
|
2016-05-02 16:19:57 +00:00
|
|
|
|
2016-07-25 13:06:13 +00:00
|
|
|
What makes this different from other CPython bytecode decompilers?: its
|
2015-12-19 22:52:04 +00:00
|
|
|
ability to deparse just fragments and give source-code information
|
|
|
|
around a given bytecode offset.
|
2012-06-05 08:46:41 +00:00
|
|
|
|
2016-04-18 09:41:33 +00:00
|
|
|
I use this to deparse fragments of code inside my trepan_
|
2015-12-27 17:55:43 +00:00
|
|
|
debuggers_. For that, I need to record text fragments for all
|
2016-01-02 20:55:48 +00:00
|
|
|
bytecode offsets (of interest). This purpose although largely
|
2015-12-13 05:25:34 +00:00
|
|
|
compatible with the original intention is yet a little bit different.
|
2015-12-19 22:54:37 +00:00
|
|
|
See this_ for more information.
|
2015-12-13 05:25:34 +00:00
|
|
|
|
2015-12-25 05:35:11 +00:00
|
|
|
The idea of Python fragment deparsing given an instruction offset can
|
2015-12-22 02:36:35 +00:00
|
|
|
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.
|
|
|
|
|
2016-07-25 13:06:13 +00:00
|
|
|
Requirements
|
|
|
|
------------
|
|
|
|
|
2016-07-26 21:09:56 +00:00
|
|
|
This project requires Python 2.6 or later, PyPy 3-2.4, or PyPy-5.0.1.
|
2016-07-25 13:06:13 +00:00
|
|
|
The bytecode files it can read has been tested on Python bytecodes from
|
2016-08-13 11:08:48 +00:00
|
|
|
versions 2.2-2.7, and 3.2-3.6 and the above-mentioned PyPy versions.
|
2016-07-25 13:06:13 +00:00
|
|
|
|
2012-06-05 08:46:41 +00:00
|
|
|
Installation
|
|
|
|
------------
|
|
|
|
|
2015-12-13 05:25:34 +00:00
|
|
|
This uses setup.py, so it follows the standard Python routine:
|
2012-06-05 08:46:41 +00:00
|
|
|
|
2015-12-15 07:06:21 +00:00
|
|
|
::
|
|
|
|
|
2016-04-28 03:03:09 +00:00
|
|
|
pip install -r requirements.txt
|
2016-04-28 03:26:31 +00:00
|
|
|
pip install -r requirements-dev.txt
|
2015-12-13 05:25:34 +00:00
|
|
|
python setup.py install # may need sudo
|
|
|
|
# or if you have pyenv:
|
|
|
|
python setup.py develop
|
2012-06-05 08:46:41 +00:00
|
|
|
|
2016-05-22 22:12:42 +00:00
|
|
|
A GNU makefile is also provided so :code:`make install` (possibly as root or
|
2015-12-13 05:25:34 +00:00
|
|
|
sudo) will do the steps above.
|
2012-06-05 08:46:41 +00:00
|
|
|
|
2015-12-13 05:25:34 +00:00
|
|
|
Testing
|
|
|
|
-------
|
2012-06-05 08:46:41 +00:00
|
|
|
|
2015-12-19 08:14:48 +00:00
|
|
|
::
|
|
|
|
|
2015-12-20 17:07:49 +00:00
|
|
|
make check
|
2015-12-18 22:07:35 +00:00
|
|
|
|
2015-12-20 17:07:49 +00:00
|
|
|
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
|
2016-05-22 22:12:42 +00:00
|
|
|
including tests via :code:`remake --tasks`
|
2012-06-05 08:46:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
Usage
|
|
|
|
-----
|
|
|
|
|
2015-12-13 05:25:34 +00:00
|
|
|
Run
|
|
|
|
|
2015-12-15 07:06:21 +00:00
|
|
|
::
|
|
|
|
|
2016-07-16 14:48:05 +00:00
|
|
|
$ uncompyle6 *compiled-python-file-pyc-or-pyo*
|
2015-12-13 05:25:34 +00:00
|
|
|
|
2016-07-16 14:48:05 +00:00
|
|
|
For usage help:
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
$ uncompyle6 -h
|
2012-06-05 08:46:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
Known Bugs/Restrictions
|
|
|
|
-----------------------
|
|
|
|
|
2016-07-26 21:09:56 +00:00
|
|
|
Python 2 deparsing decompiles and about 90% verifies from Python 2.3.7 to Python
|
2016-07-15 16:12:19 +00:00
|
|
|
3.4.2 on the standard library packages I have on my system.
|
2016-07-15 06:50:45 +00:00
|
|
|
|
|
|
|
(Verification is the process of decompiling bytecode, compiling with a
|
|
|
|
Python for that byecode version, and then comparing the byetcode
|
|
|
|
produced by the decompiled/compiled program. Some allowance is made
|
|
|
|
for inessential differences.)
|
|
|
|
|
|
|
|
Later distributions average about 200 files. At this point, 2.7
|
|
|
|
decompilation is better than uncompyle2. A number of bugs have been
|
|
|
|
fixed.
|
|
|
|
|
2016-07-15 16:12:19 +00:00
|
|
|
Python 3.5 largely works, but still has some bugs in it.
|
2016-07-11 23:20:16 +00:00
|
|
|
Python 3.6 changes things drastically by using word codes rather than
|
2016-07-15 16:12:19 +00:00
|
|
|
byte codes, and that needs to be addressed.
|
2016-07-08 16:13:41 +00:00
|
|
|
|
2016-05-18 15:25:24 +00:00
|
|
|
There is lots to do, so please dig in and help.
|
2012-10-26 13:50:38 +00:00
|
|
|
|
2015-12-19 08:14:48 +00:00
|
|
|
See Also
|
|
|
|
--------
|
|
|
|
|
2016-05-02 16:19:57 +00:00
|
|
|
* https://github.com/zrax/pycdc : supports all versions of Python and is written in C++
|
2016-07-20 16:01:45 +00:00
|
|
|
* https://code.google.com/archive/p/unpyc3/ : supports Python 3.2 only. The above projects use a different decompiling technique what is used here.
|
|
|
|
* The HISTORY_ file.
|
2015-12-19 08:14:48 +00:00
|
|
|
|
2016-01-02 20:52:22 +00:00
|
|
|
.. |downloads| image:: https://img.shields.io/pypi/dd/uncompyle6.svg
|
2015-12-13 05:25:34 +00:00
|
|
|
.. _trepan: https://pypi.python.org/pypi/trepan
|
2016-07-20 16:01:45 +00:00
|
|
|
.. _HISTORY: https://github.com/rocky/python-uncompyle6/blob/master/HISTORY.md
|
2015-12-13 05:25:34 +00:00
|
|
|
.. _debuggers: https://pypi.python.org/pypi/trepan3k
|
|
|
|
.. _remake: https://bashdb.sf.net/remake
|
2015-12-19 08:14:48 +00:00
|
|
|
.. _pycdc: https://github.com/zrax/pycdc
|
2015-12-19 22:54:37 +00:00
|
|
|
.. _this: https://github.com/rocky/python-uncompyle6/wiki/Deparsing-technology-and-its-use-in-exact-location-reporting
|
2015-12-22 02:39:46 +00:00
|
|
|
.. |buildstatus| image:: https://travis-ci.org/rocky/python-uncompyle6.svg
|
2015-12-22 02:53:20 +00:00
|
|
|
:target: https://travis-ci.org/rocky/python-uncompyle6
|