2012-11-19 52 views
1

对于python3到目前为止还没有一个稳定的工作反编译器。最接近的是unpyc3,它最好是buggy。我想创建一个可以为python工作的反编译器,但是我会怎么做呢?虽然我想在python中创建它,但有可能有一个可用于所有语言的全局反编译器?如果一个程序可以访问给定语言的所有库并且被赋予一个编译好的文件,那么可以将它分解成计算机可以执行的任何语言?它正在使用机器语言,所以在反编译中这个问题呢?反编译器python等

+0

python不编译... – mgilson

+1

你的意思是你正在寻找一种方法来将python字节码(pyc文件)转换为python源代码? – Michael0x2a

+0

是这就是我想要做的不是pyc文件编译python源? – user1775641

回答

0

uncompyle6是相当不错的工作为Python 3

至于你如何编写这样做一般,看到它的维基描述how it works问题。

但是我会概述下面的步骤。

您首先需要了解如何读取可执行文件,该文件可能包含特定CPU类型的机器代码或虚拟机的字节码。 Uncompyle6使用语法来重建程序。在解析术语“令牌”时调用反汇编的机器指令。例如,您可以使用“LOAD_CONST指令,其值为5”而不是“标记:值为5的数字”。

在此之后,你可能想了解控制流程。对于通常的基本块或直线代码是确定的。你现在可以做到这一点,因为你grok哪些令牌是跳转指令。

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,我会说,现在它是这在很大程度上是特设的控制流分析部分相当薄弱。

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