从生成的 .pyc 文件中获取一些信息是否可行?
Python反编译是一个难题,特别是对于最近的3.x版本。这就是为什么有各种工具,都有其限制和缺陷。
然而,Python 2.7和早期的3.x版本应该能够很好地工作,即使是部分反编译也比失去所有东西要好。
Uncompyle6适用于Python 3.8及以下版本,有一些缺陷,但对于2.7来说效果很好。
如果这个不起作用,那么尝试下一个工具可能是最好的选择 - 特别是针对Python 3.7+:
decompyle3
包来自于rocky/decompile3
仓库 - 拼写不同但是相同的东西。如果你仍然有问题,请查看uncompyle6
和decompyle3
的README文件,其中链接到其他可能更适合您代码的工具。
您可以获取包括变量名和文档字符串在内的代码,但没有注释。
某些代码可能无法成功反编译,特别是具有不寻常控制流或较新的Python 3.x版本。这是由于这些反编译器中存在的错误,导致Python随着时间的推移改变了其字节码。
既不支持Python 3.9或更高版本,也不支持3.7或更高版本。
Python的新优化使得反编译更加困难,这两个项目都缺乏代码贡献和赞助。
你可以做些什么来帮助:
频繁进行Git提交或备份显然是一个好主意。
某些编辑器/IDE具有恢复已删除文件的功能,即使未提交到Git。参见this answer以获取一些适用于您的编辑器或IDE(包括VS Code和JetBrains IDE,如PyCharm、GoLand和IntelliJ)的指针。
是的。
我使用uncompyle6反编译(甚至支持最新的Python 3.8.0):
uncompyle6 utils.cpython-38.pyc > utils.py
原始Python和反编译后的Python进行比较,看起来像这样:
所以你可以看到,几乎相同,反编译的效果非常好。
uncompyle6
真是太棒了。 - Jealie是的,你可以使用可以在pypi上找到的unpyclib
获取它。
$ pip install unpyclib
你可以反编译你的 .pyc 文件。
$ python -m unpyclib.application -Dq path/to/file.pyc
print __copyright
行,为什么它使用没有括号的 Python 2.7 版本的 print
? - David Chingunpyclib
的第一个和最后一个版本是在 2009 年发布的,这意味着它只能在 Python 2 上运行。 - user3064538Decompyle++ (pycdc)是唯一适用于我个人的工具:https://github.com/zrax/pycdc
这个工具在 解编Python 2.7 .pyc文件问题中被提及。
我已经花了几个小时,最终使用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是的,这是可能的。
有一个完美的开源Python (.PYC)反编译器,名为Decompyle++ https://github.com/zrax/pycdc/
Decompyle++旨在将编译后的Python字节码转换回有效且易于阅读的Python源代码。 虽然其他项目已经在不同程度上实现了这一点,但Decompyle++独特之处在于它试图支持来自任何版本的Python的字节码。
使用pip install pycompyle6安装
pycompyle6 filename.pyc命令用于编译文件
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)
只需以与其他版本相同的格式添加您已安装的版本并保存。它至少会运行。
uncompyle6
也可以在线使用,网址为https://www.decompiler.com/。 - Leo