是否可以将已编译的 .pyc 文件反编译为 .py 文件?

247

从生成的 .pyc 文件中获取一些信息是否可行?

9个回答

224

介绍

Python反编译是一个难题,特别是对于最近的3.x版本。这就是为什么有各种工具,都有其限制和缺陷。

然而,Python 2.7和早期的3.x版本应该能够很好地工作,即使是部分反编译也比失去所有东西要好。

尝试的工具

Uncompyle6适用于Python 3.8及以下版本,有一些缺陷,但对于2.7来说效果很好。

  • 推荐选项,因为它旨在统一早期的分支并专注于自动化单元测试。
  • uncompyle6 GitHub页面有更多详细信息。
  • 最适合早期的3.x版本,不是3.7+的最佳选择

如果这个不起作用,那么尝试下一个工具可能是最好的选择 - 特别是针对Python 3.7+:

  • decompyle3是Uncompyle6的一个分支,由同一作者开发,应该在3.7和3.8上运行更好。
  • 注意:这个decompyle3包来自于rocky/decompile3仓库 - 拼写不同但是相同的东西。

如果你仍然有问题,请查看uncompyle6decompyle3的README文件,其中链接到其他可能更适合您代码的工具。

限制

您可以获取包括变量名和文档字符串在内的代码,但没有注释。

某些代码可能无法成功反编译,特别是具有不寻常控制流或较新的Python 3.x版本。这是由于这些反编译器中存在的错误,导致Python随着时间的推移改变了其字节码。

支持最新的Python版本

既不支持Python 3.9或更高版本,也不支持3.7或更高版本。

Python的新优化使得反编译更加困难,这两个项目都缺乏代码贡献和赞助。

你可以做些什么来帮助:

  • 检查是否存在类似问题后,为这些项目提出GitHub问题报告 - 运行一系列Python版本的单元测试套件。
  • 赞助这些项目,特别是如果它们对您有所帮助

预防未来代码丢失

频繁进行Git提交或备份显然是一个好主意。

某些编辑器/IDE具有恢复已删除文件的功能,即使未提交到Git。参见this answer以获取一些适用于您的编辑器或IDE(包括VS Code和JetBrains IDE,如PyCharm、GoLand和IntelliJ)的指针。


10
非常感谢。我不小心删除了.py文件,而不是.pyc文件。这样做让我免于从头开始重写它。 - avmohan
60
如果你在这里是因为不小心删除了错误的文件,我_强烈_建议使用源代码控制! - Andrew Palmer
5
如果您使用的是PyCharm,您可以在项目窗口中右键单击文件/文件夹,然后选择“本地历史记录” > “显示历史记录”来撤销更改。这可以帮助您挽救生命。 - mattshu
4
uncompyle6也可以在线使用,网址为https://www.decompiler.com/。 - Leo
1
在本评论发布时,uncompyle6不支持Python 3.9。 - CodeMed
显示剩余2条评论

37
你可以尝试使用 Easy Python Decompiler。它基于Decompyle++和Uncompyle2,支持反编译Python版本1.0-3.3。
注意:我是上述工具的作者。

6
做得好,它完成了它的工作。顺便问一下,你是用Python编写这个工具的吗? - shinzou
2
对我来说很好用(易于拖放)。虽然Linux发行版会很不错,但打开Windows电脑也并不难。 - Brian Jackson
5
上次更新是在2015年,而且看起来它的源代码不公开? - user3064538
1
根据GIMP项目的说法,“SourceForge正在滥用我们和我们的用户过去对他们服务的信任。”自2013年以来,SourceForge一直在捆绑垃圾软件与他们的安装程序-有时甚至没有开发者的许可。如果可以避免,请不要从SourceForge下载软件。 - Entree
1
@MacGyver 抱歉,但现在你无法信任 SourceForge 的链接来源,即使它是一个众所周知的域名。这个答案是来自 2014 年,当时 HTTPS 还不是强制性的。是的,SourceForge 的记录确实变得越来越糟糕,我很久以前就停止使用 SourceForge 了。 - Extreme Coders
显示剩余4条评论

31

是的

我使用uncompyle6反编译(甚至支持最新的Python 3.8.0):

uncompyle6 utils.cpython-38.pyc > utils.py

原始Python和反编译后的Python进行比较,看起来像这样:

pyc uncompile utils

所以你可以看到,几乎相同,反编译的效果非常好。


1
我也有同样的经验。uncompyle6 真是太棒了。 - Jealie
2
目前不支持 > 3.9 版本的 Python :( - Oneiroi

29

是的,你可以使用可以在pypi上找到的unpyclib获取它。

$ pip install unpyclib

你可以反编译你的 .pyc 文件。

$ python -m unpyclib.application -Dq path/to/file.pyc

26
我尝试运行一个很小的文件,内容不复杂(Django settings.py),但是程序发生了异常崩溃。而使用uncompyle2工具则可以正常反编译该文件。因此,我给这个程序打了负分。 - RichVel
15
为什么在 Python 3.6 中会崩溃,错误出现在 lib\site-packages\unpyclib\application.py 文件中的 print __copyright 行,为什么它使用没有括号的 Python 2.7 版本的 print - David Ching
6
可以肯定地说,unpyclib 的第一个和最后一个版本是在 2009 年发布的,这意味着它只能在 Python 2 上运行。 - user3064538

15

1
这对我来说可行,因为它适用于使用Python 2.6编译的代码! - David Mertens

5

我已经花了几个小时,最终使用Decompyle++找到了解决方案:

  • 访问https://cmake.org/download/并安装CMake。
  • 访问https://github.com/zrax/pycdc并获取该repo的副本:pycdc-master
  • C:\ Program Files \ CMake \ bin添加到系统环境变量中的路径下。

建议将pycdc-master文件夹放入另一个文件夹中,例如anotherFolder

现在你可以在命令行中运行这些命令:

  • cd anotherFolder 进入包含pycdc-master的文件夹。
  • cmake pycdc-master
  • cd ../ 返回上一级文件夹,
  • 然后运行: cmake --build anotherFolder

然后pycdc.exe将位于anotherFolder \ Debug中。

在控制台中键入pycdc.exe onlyhopeofgettingmycodeback.pyc,它将打印出源代码。我有Python 3.9.6源代码,但其他方法都不起作用。


通常情况下,您会在存储库内创建 build 文件夹,然后在 build 文件夹内调用 cmake .. - Dmytro Ovdiienko

4

是的,这是可能的。

有一个完美的开源Python (.PYC)反编译器,名为Decompyle++ https://github.com/zrax/pycdc/

Decompyle++旨在将编译后的Python字节码转换回有效且易于阅读的Python源代码。 虽然其他项目已经在不同程度上实现了这一点,但Decompyle++独特之处在于它试图支持来自任何版本的Python的字节码。


3
虽然pycdc很好,但并不完美。如果你查看https://github.com/zrax/pycdc/issues,会发现它在反编译方面有50多种问题。这些问题分布在大约16个版本的Python中,而且语言和代码已经发生了巨大的变化。也许对于你尝试过的东西,你没有找到问题。然而,在我看来,要将某样东西归类为“完美”,就必须拿出每个版本的整个Python库进行反编译,并成功地通过其自身的测试。目前还没有反编译器能够做到这一点。 - rocky

3

使用pip install pycompyle6安装

pycompyle6 filename.pyc命令用于编译文件


0
如果你需要反编译一个PYC文件,但是你已经安装了Python 3.9,那么你可以强制运行uncompyle6。它不完美,但是可以工作。只需编辑site-packages\uncompyle6\bin\uncompile.py即可。
def main_bin():
if not (sys.version_info[0:2] in ((2, 6), (2, 7), (3, 0),
                                  (3, 1), (3, 2), (3, 3),
                                  (3, 4), (3, 5), (3, 6),
                                  (3, 7), (3, 8), (3, 9)

只需以与其他版本相同的格式添加您已安装的版本并保存。它至少会运行。


1
它无法反编译使用Python3.9创建的pyc文件。 - Anthony
目前不支持 > 3.9 版本的 Python :( 尽管可以“强制”运行,但遗憾的是无法正常执行。 - Oneiroi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接