1

对于 python3 到目前为止还没有一个稳定的工作反编译器。最接近的是 unpyc3,它充其量是错误的。我想创建一个适用于 python 的反编译器,但我该怎么做呢?虽然我想在 python 中创建它,是否有可能拥有一个适用于所有语言的全局反编译器?如果一个程序可以访问给定语言的所有库并获得一个编译文件,是否有可能将其分解为任何语言,计算机可以做到这一点吗?它正在使用机器语言,所以这应该在反编译中起作用吗?

4

1 回答 1

0

uncompyle6非常好,适用于 Python 3。

至于您一般如何编写来执行此操作的问题,请参阅描述其工作原理的 wiki 。

但是,我将概述以下步骤。

您首先需要了解如何读取可能包含特定 CPU 类型的机器代码或虚拟机的字节码的“可执行文件”。Uncompyle6使用语法来重构程序。反汇编的机器指令在解析术语中称为“令牌”。例如,您将使用“值为 5 的LOAD_CONST指令”而不是“token: number with value 5”。

在此之后,您可能想了解控制流。并为此确定了典型的基本块或直线代码。您现在可以执行此操作,因为您知道哪些标记是跳转指令。

uncompyle6 使用的基本思想是在语法中添加标记以允许语法检测控制流。所以大致它可能会看到:

SETUP_LOOP
JUMP_IF FALSE X
... 
X: 

并在 X 处添加一些内容以表示结束:

SETUP_LOOP
JUMP_IF_FALSE X
...
COME_FROM_LOOP # this is added

然后,您可以在每个基本块内为基本块内的表达式和语句构建抽象语法树 (AST)。uncompyle6中使用的方法是使用上下文无关文法。其他 Python3 程序,如pycdc或您引用的程序unpyc3不会这样做。然后使用堆栈和指令的线性扫描来构建树。给出一些想法

 LOAD a    # tree/stack: | a
 LOAD b    # tree/stack: | b, a
 LOAD c    # tree/stack: | c, b, a 
 ADD       # tree/stack: (c + b) |  a
 MULTIPLY  # tree/stack: (c + b) * a
 STORE d   # tree/stack: d = (c + b) * a |

也许您可以看到语法如何做同样的事情。

说了这么多并建议uncompyle6,我要说的是,现在它在很大程度上是临时的控制流分析部分相当薄弱。

既然您表达了对创建反编译器的兴趣,那么不如为现有的编译器做出贡献以使其变得更好呢?

于 2016-10-21T12:24:39.983 回答