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创建的文件,尽管我们可以反编译代码 正确提取字节码之后。在这种情况下,你 可能需要考虑一个反编译服务,如疯狂编译器。处理 从病理学上讲,冗长的表达或陈述列表是缓慢的。

有很多事情要做,请参与并提供帮助。

另请参见

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java什么会导致程序在它似乎拥有的监视器上被阻止?   java Android studio设置视图的背景色   java我可以保存一个文本文件而不给用户修改它的能力吗?   pdfbox PDFBOX2。0:java堆堆栈错误   java是维护和操作AllowList的有效方法   JAVAsql。SQLException:找不到适合jdbc的驱动程序:mysql://localhost:3306/asd性爱   如何使用java。lang.NullPointerException:void 安卓。支持v7。应用程序。ActionBar。setElevation(float)“”在空对象引用上'   java调试空指针异常   java正则表达式,以按令牌的特定匹配项拆分,同时忽略其他匹配项   java为JPanel设置边框上的笔划   并发@Schedule方法的java行为   如何在Java中使用泛型与语言运算符和泛型类扩展数   java Rhino Javascript如何为异常堆栈跟踪标记字符串源   运行可执行jar时发生java错误,无法找到或加载主类