2012-11-19 49 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,我會說,現在它是這在很大程度上是特設的控制流分析部分相當薄弱。

既然您表達了對創建反編譯器的興趣,那麼如何改進現有編譯器以使其更好?