python跨版本字节码反编译程序
uncompyle6的Python项目详细描述
未压缩6
本机python跨版本反编译器和片段反编译器。 decompyle、uncompyle和uncompyle2的继承者。
简介
uncompyle6 将python字节码转换回等效的python 源代码。它接受从python 1.3到version的字节码 3.8,跨越了24年的python版本。我们包括Dropbox's python 2.5字节码和一些pypy字节码。
为什么这样?
好吧,我要说:这个软件太棒了。它比你的 普通的黑客反编译器。使用 编译器 技术,程序 根据指令创建程序的解析树;节点位于 上层看起来有点像来自python的内容 AST。所以我们可以真正的分类和理解 python字节码的部分。
在此基础上,另一件事使它不同于其他 cpython字节码反编译程序能够 源代码的片段并提供有关 给定字节码偏移量。
在运行时,我使用树片段来分解代码片段 。 在我的调试程序中。为此,会记录字节码偏移量 与源代码片段关联。这个目的, 虽然符合初衷,但还是有点 不同的。有关详细信息,请参见
给定指令偏移量的python片段分解在 显示堆栈跟踪,并可以合并到任何程序中 想更详细地显示位置而不仅仅是 运行时。当源代码信息 不存在,只有字节码。同样,我的调试器利用 这是
曾经(现在仍然)有很多解压,解压, 未压缩2,未压缩3分叉。基本上他们都来了 从相同的代码基,和(几乎?)他们都不再是 积极维护。其中一个非常擅长反编译Python1.5-2.3 或者说,另一个非常擅长python 2.7的人,但仅此而已。另一 只处理Python3.2;另一个修补了它,只处理3.3。 你明白了。这段代码将所有这些分叉组合在一起 向前移动 。这里有一些重要的重构和清理工作 旧叉子上的代码基。
显然,这在反编译python方面做得最好。 python版本。即使有其他公关仅此项目 为python版本的子集提供反编译,我们通常这样做 显然对那些人也更好。
我们怎么知道?通过采用随附的python字节码 那个版本的python并反编译它们。在那些 成功反编译后,我们可以确保生成的程序 在语法上是正确的,为此运行python解释器 字节码版本。最后,如果程序对 本身,我们可以对反编译的代码进行检查。
我们认真对待测试,并使用自动化流程来发现 漏洞。在其他反编译器的问题跟踪程序中,您将发现 一路上发现的虫子数量。几乎没有 在其他反编译器中修复。
要求
这里的代码可以在python 2.6或更高版本上运行,pypy 3-2.4, 或者Pypy-5.0.1。python版本2.4-2.7在 python-2.4分支。它可以读取的字节码文件已经过测试 1.4、2.1-2.7和3.0-3.8版本中的python字节码以及 上述pypy版本。
安装
它使用setup.py,因此遵循标准的python例程:
pip install -e . # set up to run from source tree # Or if you want to install instead python setup.py install # may need sudo
还提供了gnu makefile,因此
make install
(可能是根目录或
sudo)将执行上述步骤。
用法
运行
$ uncompyle6 *compiled-python-file-pyc-or-pyo*
使用帮助:
$ uncompyle6 -h
验证
在较旧版本的python中,可以通过
反编译字节码,然后使用python解释器编译
对于那个字节码版本。完成此操作后,字节码生成
可以与原始字节码进行比较。但是作为python的代码
一代人变得更好,这不再可行。
如果您希望python语法验证
反编译过程中,添加
--syntax verify
选项。但是自从
python语法更改,如果字节码是
将要检查的python解释器的正确字节码
语法。
您还可以将结果与另一个python反编译器进行交叉比较。
比如
pycdc
。由于它们的工作方式不同,这里的bug通常不在
反之亦然。
这些程序中有一个有趣的类
提供更强大的验证:运行时
测试他们自己。我们的测试套件包括这些。
python还附带了一组这样的程序:它的测试
标准库的套件。我们在
test/stdlib
中有一些代码
也方便这种检查。
已知错误/限制
最大的已知和可能解决的(但很难)问题必须做
有操作控制流程。(python可能是
我见过的一组奇怪的复合语句
是循环和try块上的"else"子句吗?
程序员不知道。)
我看到的所有python反编译器都有问题
反编译python的控制流。在某些情况下,我们可以检测到
错误的反编译并报告。
python支持在python 2 for 2.7中是最强的,并且随着
离那远点。支持也可能对
Python2.3-2.4的早期版本
那个时代的反编译器已经被保留了(python编译
那个时代是最小的)
t下面是一些关于低端python版本的工作
因为我们没有巨蟒,所以更难处理
版本1.6和2.0的解释器。
在python 3系列中,python支持在3.4或
3.3当你离那些版本越来越远的时候,它就会掉下来。蟒蛇
3.0很奇怪,因为它在某些方面比2.6更相似
3.1或2.7。python 3.6通过使用word代码彻底改变了一切
而不是字节码。因此,跳转中的跳转偏移字段
指令参数已减少。这使得
扩展的参数
指令现在在跳转指令中更为普遍;以前
它们很罕见。也许是为了补偿额外的
extended_arg
说明,额外的跳转优化已经完成
补充。因此,按目前的情况,通过特殊方式处理控制流
做得更糟。
在Python3.5、3.6和3.7之间,对
make_function
和
call_function
说明。
目前并不是所有的python幻数都受支持。特别是在
一些版本的python,特别是python 3.6,神奇的数字有
在一个版本中多次更改。
我们只支持发布版本,不支持候选版本。
但是请注意
发布版本的魔力通常与发布前的候选版本相同。
还有定制的python解释器,特别是dropbox,
它们使用自己的魔法并通过tcode加密。除了
Dropbox的旧Python2.5解释器这种东西不是
处理.
We also don’t handle
pjorion
混淆代码。尝试一下:pjorion
deobfouscator
在
试试这个工具。此程序无法反编译Microsoft Windows exe
由py2exe创建的文件,尽管我们可以反编译代码
正确提取字节码之后。在这种情况下,你
可能需要考虑一个反编译服务,如疯狂编译器。处理
从病理学上讲,冗长的表达或陈述列表是缓慢的。
有很多事情要做,请参与并提供帮助。
另请参见
-
https://github.com/zrax/pycdc
:声称支持所有版本的python。它是用C++编写的,对于代码比较活跃的Python版本,在2.7和3.3时最精确。尤其缺乏python 3的最新版本和python的早期版本的准确性。有关详细信息,请参阅其问题跟踪程序。目前保养很少。
-
https://code.google.com/archive/p/unpyc3/
:仅支持python 3.2。上面的项目使用的反编译技术与这里使用的不同。当前未维护。
-
https://github.com/figment/unpyc3/
:以上的fork,但仅支持python 3.3。包括一些修复,如支持函数注释。当前未维护。
-
https://github.com/wibiti/uncompyle2
:仅支持Python2.7,但效果相当不错。有些情况下
uncompyle6de>结果不正确,而uncompyle2
结果不正确,但更常见的情况是uncompyle6在uncompyle2不正确时是正确的。因为与惯用的python相比,
uncompyle6
坚持精确性,所以当正确时,
uncompyle2
可以生成更自然的代码。目前,
uncompyle2
的维护很简单。有关详细信息,请参见其问题
跟踪器
。
-
如何报告错误
-
历史文件。
-
https://github.com/rocky/python xdis
:跨python版本反汇编程序
-
https://github.com/rocky/python xasm
:跨python版本汇编程序
-
https://github.com/rocky/python-uncompyle6/wiki
:更详细地描述代码和内容的wiki文档