如何反编译 Python 3.5 .pyc?

How do I decompile Python 3.5 .pyc?

我一直在搜索,但没能找到任何可以帮助我反编译 Python 3.5 的东西。有人知道吗?

我知道的关于 Python 3.5(和其他 Python 版本)的是:

  1. uncompyle6
  2. pycdc

[免责声明:我开发1]

uncompyle6(用Python编写)处理Python 3.5中引入的操作码,而pycdc(用C++编写)在这里仍然有点欠缺。但这些操作码仅在使用新的 Python 3.5 语言功能时出现。因此,如果底层程序在 Python.

的早期版本上运行,那么在 pycdc 中 运行 的可能性可能很小

Python 3.6 及更高版本的情况略有不同。 Python 3.6 adds some function-call opcodes and changes the semantics of other opcodes. So in contrast to 3.5, the new opcodes appear even with code that doesn't use any of the new features used in Python 3.5, or 3.6. Python 3.7, yet again, adds method opcodes 并改变其他人的语义;现在 pycdc 不支持。 3.8 通过删除 SETUP_LOOP.

对代码生成的更改比其他版本多一些

uncompyle6 正在解决其中的一些问题,并提出各种错误报告。随着 3.6 的推出,更多更新的 3.5 操作码和功能出现得更频繁。

uncompyle6 在处理控制流方面对于 3.7 来说很弱,对于 3.8 来说更弱,尽管它可能是当前的领跑者。因此,我在这里所做的是创建一个new project altogether just to handle Python control flow。由于 Python 丰富的控制结构,仅此一点很难。除了需要对控制流图中的边进行特殊处理的异常处理之外,还有 else 块可以作为 forwhile 和 [=14= 的一部分出现] 结构;此外,还有 finally 个方块。

当该项目可以相当好地处理事情时(现在还不能),我会首先将其放入项目 https://github.com/rocky/python-decompile3 的分支代码中。这是很难的事情;这里欢迎志愿者。

虽然 uncompyle6 和 pycdc 都没有认真跟上 Python 的变化,但就目前而言,uncompyle6 做得更彻底。您可以查看每个问题的问题跟踪器,以了解最新情况。

最近 uncompyle6 和 decompyle3 的历史是,解决一些问题可能会破坏其他问题。让我解释。 uncompyle6decompyle3 模式匹配指令。可能有一个特定的模式在 50% 的时间内失败。随着时间的推移,我会将模式细化为更复杂、失败更少的东西,比如 25% 的时间,但特定实例使用之前使用的 50% 模式。

最近我们在 decompyle3 和 uncompyle6 中添加了额外的检查,以便在语法缩减时进行额外的流程控制检查。然而,这再次表明需要使用控制流支配信息进行更好的重新思考。这可以在 decompyle3 的分支上完成。

鉴于此,我目前的建议是当uncompyle6出现问题时尝试不同的版本,使用pycdc,或者在可行的情况下比较不同反编译器的结果。

为了反编译已编译的 .pyc python3 文件,我在当前的 Ubuntu [=41] 中使用了 uncompyle6 =]如下:

(i)安装uncompyle6: pip3 安装 uncompyle6

(ii)从 .pyc 文件创建 .py 文件 运行: uncompyle6 -o 。 your_filename.pyc

(iii)将自动创建一个新的 .py 文件,并使用相同的现有 .pyc 文件名.

希望这会有所帮助。

目前是 2020-01-06,最新的 uncompyle6 支持 Python 3.8.0 well -> 应该也支持你的 Python 3.5 well.

  • 示例:

    • uncompyle6 ../pyc/utils.cpython-38.pyc > ../pyc/utils.py
  • 输出:

    • origin py 与 decompiled py: