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

ffscu2ro  于 2023-05-05  发布在  Python
关注(0)|答案(9)|浏览(354)

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

jobtbby3

jobtbby31#

简介

Python反编译是一个很难的问题,特别是对于最近的3.x版本。这就是为什么有各种各样的工具,都有限制和错误。
然而,Python 2.7和更早的3.x版本应该工作得很好,即使是部分反编译也比失去一切要好。

试用工具

Uncompyle6可以在Python 3.8之前运行,但有一些bug,在Python 2.7中运行良好。

*推荐选项作为开始,因为它旨在统一早期的分支并专注于自动化单元测试。

如果这不起作用,最好接下来尝试一下-特别是对于Python 3.7+:

  • decompyle3是Uncompyle 6的一个分支,来自同一作者,应该在3.7和3.8中工作得更好。
    ***注意:**这个decompyle3包来自rocky/decompile3 repo -拼写不同但内容相同

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

限制

你可以恢复你的代码,包括变量名和文档字符串,但没有注解。
有些代码可能无法成功反编译,特别是使用不寻常的控制流或更新的Python 3.x版本。这是由于这些反编译器中的错误,Python随着时间的推移改变了它的字节码。

支持最新版本的Python

uncompyle6decompyle3都不支持Python 3.9或更高版本,对3.7或更高版本的支持也有限。
Python中的新优化使反编译变得更加困难,并且这两个项目都缺乏代码贡献和赞助。
您可以做些什么来帮助:

  • 在检查了类似的问题后,为这些有bug的项目提出GitHub问题-这两个项目都在一系列Python版本上运行单元测试套件。
  • 赞助这些项目,特别是如果他们帮助你

防止将来代码丢失

频繁的Git提交或备份显然是一个好主意。
一些编辑器/IDE具有帮助恢复已删除文件的功能,即使未提交到Git。请参阅this answer,了解一些可能在编辑器或IDE中工作的指针,包括VS Code和JetBrains IDE,如PyCharm,GoLand和IntelliJ。

iklwldmw

iklwldmw2#

您可以尝试***Easy Python Decompiler***。它基于Decompyle++和Uncompyle 2。它支持反编译python版本1.0-3.3
注:我是上述工具的作者。

368yc8dk

368yc8dk3#

我使用uncompyle6反编译(甚至支持最新的Python 3.8.0):
uncompyle6 utils.cpython-38.pyc > utils.py
原始python和反编译的python比较看起来像这样:

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

pvabu6sv

pvabu6sv4#

是的,你可以用unpyclib得到它,可以在 pypi 上找到。

$ pip install unpyclib

您可以反编译.pyc文件

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

up9lanfz5#

Decompyle++(pycdc)是唯一一个对我有效的:https://github.com/zrax/pycdc
在反编译Python 2.7.pyc中提出

flvlnr44

flvlnr446#

我已经花了几个小时,终于有了一个使用Decompyle++的解决方案:

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

我建议把你的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的源代码,其他的都不能用了。

dl5txlt9

dl5txlt97#

是的,有可能。
有一个完美的开源Python(.PYC)反编译器,叫做Decompyle++ https://github.com/zrax/pycdc/
Decompyle旨在将编译后的Python字节码转换回有效的、人类可读的Python源代码。虽然其他项目已经取得了不同的成功,但Decompyle的独特之处在于它寻求支持任何版本的Python的字节码。

xjreopfe

xjreopfe8#

使用pip install pycompyle6安装
pycompyle6文件名.pyc

pdkcd3nj

pdkcd3nj9#

如果你需要反编译一个pyc,但已经安装了python3.9,你可以强制uncompyle 6运行。它并不完美,但它确实有效。只需编辑site-packages\uncompyle 6\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)

只需添加您已安装的版本,并将其保存为与其他版本相同的格式。它至少会跑。

相关问题