反编译器python等

时间:2012-11-19 02:22:37

标签: python language-agnostic decompiler

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

1 个答案:

答案 0 :(得分:0)

uncompyle6非常好,适用于Python 3.

至于你如何编写一般的这样做的问题,请参阅描述how it works的wiki。

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

您首先需要了解如何阅读"可执行文件"其中可能包含特定CPU类型的机器代码或虚拟机的字节码。 Uncompyle6 使用语法重建程序。在解析术语"令牌"中调用反汇编的机器指令。例如,代替"令牌:数字值为5"你有{" LOAD_CONST指令,价值为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 ,我现在说它在控制流分析部分非常弱,主要是临时的。

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

相关问题