是否可以将编译后的.pyc 文件反编译为.py 文件?
- 2025-01-16 08:37:00
- admin 原创
- 133
问题描述:
是否可以从.py 文件生成的.pyc 文件中获取一些信息?
解决方案 1:
简介
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
repo - 拼写不同,但含义相同
如果您仍然有问题,请检查uncompyle6
和decompyle3
README,它们链接到可能更适合您的代码的其他工具。
限制
您可以取回包含变量名和文档字符串但不包含注释的代码。
某些代码可能无法成功反编译,尤其是使用不寻常的控制流或较新的 Python 3.x 版本时。这是由于这些反编译器中存在错误,Python 会随着时间的推移更改其字节码。
支持最新的 Python 版本
都不支持 Python 3.9 或更高版本,uncompyle6
并且decompyle3
对 3.7 或更高版本的支持受到限制。
Python 中的新优化使反编译变得更加困难,并且这两个项目都缺乏代码贡献和赞助。
您可以采取以下措施来提供帮助:
在检查类似问题后,针对这些存在错误的项目提出 GitHub 问题 - 两者都在一系列 Python 版本上运行单元测试套件。
赞助这些项目,特别是如果它们对你有帮助的话
防止将来丢失代码
频繁的 Git 提交或备份显然是一个好主意。
某些编辑器/IDE 具有帮助恢复已删除文件的功能,即使未提交到 Git。请参阅此答案,了解可能适用于您的编辑器或 IDE 的一些指针,包括 VS Code 和 JetBrains IDE,例如 PyCharm、GoLand 和 IntelliJ。
解决方案 2:
您可以尝试Easy Python Decompiler。它基于 Decompyle++ 和 Uncompyle2。它支持反编译 Python 版本 1.0-3.3
注:我是上述工具的作者。
解决方案 3:
是的。
我使用uncompyle6反编译(甚至支持最新的Python 3.8.0):
uncompyle6 utils.cpython-38.pyc > utils.py
原始 Python 与反编译的 Python 比较如下:
所以你可以看到,几乎一样,反编译效果非常好。
解决方案 4:
是的,您可以通过pypiunpyclib
获得它。
$ pip install unpyclib
然后你就可以反编译你的 .pyc 文件
$ python -m unpyclib.application -Dq path/to/file.pyc
解决方案 5:
Decompyle++(pycdc)是唯一对我有用的: https: //github.com/zrax/pycdc
在Decompile Python 2.7 .pyc中建议
解决方案 6:
我已经研究了几个小时,最后使用 Decompyle++ 找到了解决方案:
访问
https://cmake.org/download/
并安装 CMake。访问
https://github.com/zrax/pycdc
并获取此 repo 的副本:pycdc-master
。添加
C:Program FilesCMakein
到系统环境变量的 PATH 下。
我建议将您的pycdc-master
文件夹放入另一个文件夹,例如anotherFolder
。
现在您可以在命令行中运行这些命令:
cd anotherFolder
进入pycdc-master
其中包含的文件夹。cmake pycdc-master
cd ../
转到上一个目录,然后:
cmake --build anotherFolder
pycdc.exe
将会在anotherFolderDebug
。
在控制台中执行类似操作pycdc.exe onlyhopeofgettingmycodeback.pyc
,它会打印出源代码。我有 Python 3.9.6 源代码,其他都不起作用。
解决方案 7:
是的,有可能。
有一个完美的开源 Python(.PYC)反编译器,叫做 Decompyle++ https://github.com/zrax/pycdc/
Decompyle++ 旨在将编译后的 Python 字节码重新翻译为有效且人类可读的 Python 源代码。虽然其他项目也取得了不同的成功,但 Decompyle++ 的独特之处在于它力求支持任何版本的 Python 字节码。
解决方案 8:
使用 pip install pycompyle6 安装
pycompyle6 文件名.pyc
解决方案 9:
如果您需要反编译 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)
只需以与其他版本相同的格式添加您已安装的版本并保存即可。它至少可以运行。
解决方案 10:
标题:从 PyInstaller 生成的可执行文件中提取文件
问题:
如何从 PyInstaller 创建的可执行文件中提取文件?
解决方案:
克隆pyinstxtractor-ng存储库:
git clone https://github.com/pyinstxtractor/pyinstxtractor-ng.git
提取可执行文件:
cd pyinstxtractor-ng
python pyinstxtractor-ng.py "<path_to_/dist/app>"
安装依赖项:
sudo yum install cmake make clang
克隆pycdc存储库:
git clone https://github.com/zrax/pycdc.git
构建并编译:
cd pycdc
cmake CMakeLists.txt
make
反编译字节码:
./pycdc "<path_to_/app_extracted/app.pyc>"
通过遵循这些步骤,您可以从 PyInstaller 生成的可执行文件中提取和反编译文件。