【问题标题】:How do I decompile Python 3.5 .pyc?如何反编译 Python 3.5 .pyc?
【发布时间】:2016-06-14 14:58:40
【问题描述】:

我一直在四处寻找,但找不到任何可以帮助我反编译 Python 3.5 的东西。有人知道吗?

【问题讨论】:

  • 嗨,欢迎来到 SO。恐怕这个问题在这里被认为是题外话。根据网站规则:“要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决它所做的工作。”。抱歉,鉴于此,我认为这个问题将被关闭。
  • @FabioTurati 只要人们理解“反编译”这个词,我就会看到一个非常明显的问题描述。这不是推荐特定工具的问题,而是以尽可能最标准的方式理想地解决问题。
  • @PavelŠimerda 好吧,答案之一只是推荐工具。无论如何,所有这些都是 2 岁,并且有几个赞成票。我仍然认为我原来的评论是有效的,但我不会采取任何行动。
  • @FabioTurati 在我看来,推荐工具选择是对“如何实现”问题的有效回答的一部分。在我看来,被批评的问题是这样的……“我知道怎么做,但请告诉我这些已知工具中哪个更好。”因为那需要有自以为是的答案。这个问题没有。

标签: python-3.x python-3.5 decompiler


【解决方案1】:

我所知道的处理 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。因此,与 3.5 相比,新的操作码甚至出现在不使用 Python 3.5 或 3.6 中使用的任何新功能的代码中。 Python 3.7,又一次,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 块可以作为forwhiletry 结构的一部分出现;此外,还有finally 块。

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

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

最近使用 uncompyle6 和 decompyle3 的历史是,修复某些问题可能会破坏其他问题。让我解释。 uncompyle6decompyle3 模式匹配指令。可能存在 50% 的时间失败的特定模式。随着时间的推移,我会将模式改进为更复杂且失败率更低的模式,例如 25% 的时间,但特定实例使用之前使用的 50% 模式。

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

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

【讨论】:

  • uncompyle6 在我的笔记本电脑的一个可怕问题使我的 .py 文件出现乱码后,才救了我的命,但 .pyc 却干净了。一切似乎都正确反编译了! (assert 声明变成了if not x raise AssertionError,但其他都很好)
  • 很高兴 uncompyle6 提供了帮助。它确实有断言语句的规则,但另一方面,任何反编译器都必须对其产生等效代码感到满意,我猜这里就是这种情况。如果不是这种情况,请在阅读如何报告错误后随意打开一个问题。当您在 github 上时,请考虑支持该项目。虽然现在这是最高评级(除了 realgud 组中的 realgud),但我确实使用评级来帮助我决定在有选择时从事哪个项目。而且我注意到现在 uncompyle6 排在我钦佩的 pycdc 之后。
  • 我不确定这是否属于错误,并且可能无法从 pyc 中判断是否使用了 assert 语句。在 github 上点赞。
【解决方案2】:

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

(i)安装 uncompyle6: pip3 安装 uncompyle6

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

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

希望这会有所帮助。

【讨论】:

    【解决方案3】:

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

    • 例子:

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

      • originpy vs decompiledpy:

    【讨论】:

      猜你喜欢
      • 2022-08-24
      • 2012-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 2015-05-28
      相关资源
      最近更新 更多