【问题标题】:In Python how can I decompile something which compiled with compile() function?在 Python 中,我如何反编译用 compile() 函数编译的东西?
【发布时间】:2020-07-24 13:32:59
【问题描述】:

这是我的代码

script = """
a = 10
b = 20
print ('addition = ',a+b)
"""
code = compile(script, "script", "exec")

这个 compile() 函数将返回一个代码对象。但我想知道我怎样才能扭转它?在一些博客中,我听说它可以用uncompyle6 反编译。但是反编译它的过程是什么?或者有没有其他模块可以这样做?


  • 注意:请不要建议我使用 dis 模块并重建 源代码

【问题讨论】:

  • 为什么?这是一项不寻常的任务
  • 学习目的

标签: python serialization deserialization decompiling


【解决方案1】:

反编译过程与编译过程类似。在后者中,代码被转换为 Python 字节码,然后可以由解释器执行。在前一种情况下,它只是获取该字节码并将其转换为相关代码。

有许多模块支持这一点,包括您提到的那个。这样做的过程在模块的README.MD 文件中。我的建议是 Decompyle++ (pycdc) 因为它在很多场合都对我有用。

步骤很简单:

要运行 pycdas, PYC 反汇编程序:./pycdas [PATH TO PYC FILE] 字节码反汇编打印到标准输出。

要运行 pycdc, PYC 反编译器:./pycdc [PATH TO PYC FILE] 将反编译的 Python 源代码打印到标准输出。任何错误都会打印到 stderr。

【讨论】:

  • 用python内置compile()函数编译的代码对象是否可以解压缩
  • @SakibHossain 我认为这是不可能的,因为 python 没有内置的 decompile() 函数。 compile() 将其转换为 AST 对象,然后由 eval() or exec() 函数评估。然后简单地执行
  • 上面的答案在很多层面都是错误的。很明显,Python 可以在内置的 run 函数之上做一些事情。用 Python 编写的 Python 反编译器可以从代码对象而不是字节码文件开始。内置函数 compile() 生成字节码,而不是 AST 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多