我有一个Python文件,内容为
def fun(x):
return 2 * x + 5
当导入文件时,我可以访问函数对象
from mymodule import fun
print(fun)
<function mymodule.fun(x)>
我现在可以使用dis来分解字节码并获得
import dis
dis.dis(fun)
2 0 LOAD_CONST 1 (2)
2 LOAD_FAST 0 (x)
4 BINARY_MULTIPLY
6 LOAD_CONST 2 (5)
8 BINARY_ADD
10 RETURN_VALUE
由此,我可以手动重建上面的函数源。这总是可能的吗?如果函数更复杂,我怎么能自动做到这一点?
来自维基百科
反编译器是一种计算机程序,它将可执行文件转换为可以成功重新编译的高级源文件。因此,它的作用与典型的编译器相反,后者将高级语言翻译为低级语言。解压缩程序通常无法完美地重构原始源代码,因此经常会产生混淆的代码。尽管如此,反编译器仍然是计算机软件逆向工程中的一个重要工具。
注意:
如果你阅读了wiki文章的其余部分,它的重点是对编译为机器语言的语言的机器指令反编译。Python的大多数实现都是解释器;然而,许多口译员并不是这样工作的。相反,它们通常编译为高级字节码。
上面引用的指令的高级性质反映在程序变量名称被保留的事实上。这与机器代码中使用的寄存器名称和机器位置形成对比。
这意味着像LOAD_CONST
、LOAD_FAST
或BINARY_MULTIPLY
这样的操作必须处理比CPU机器寄存器中更复杂的许多数据类型。以LOAD_CONST
为例;其操作数可以是列表、元组、字典、集值或其他不同的数据类型。
我在这里写了一些关于高级字节码解释器的反编译器:https://rocky.github.io/Deparsing-Paper.pdf
在Python中,字节码可能因版本而异。例如,在Python 3.6中,字节码的格式发生了变化,使得字节码指令(操作码加操作数(从1或3字节变为固定大小的2字节。在上面的示例中,由于偏移量总是增加2,因此您从Python 3.6或更高版本运行了该程序。
许多Python反编译器适用于特定版本,有些则适用于多个版本的Python。
以下是"有哪些工具或库可以反编译python和探索字节码?"中问题的答案?列出了一些Python反编译器。