對於python3到目前爲止還沒有一個穩定的工作反編譯器。最接近的是unpyc3,它最好是buggy。我想創建一個可以爲python工作的反編譯器,但是我會怎麼做呢?雖然我想在python中創建它,但有可能有一個可用於所有語言的全局反編譯器?如果一個程序可以訪問給定語言的所有庫並且被賦予一個編譯好的文件,那麼可以將它分解成計算機可以執行的任何語言?它正在使用機器語言,所以在反編譯中這個問題呢?反編譯器python等
1
A
回答
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,我會說,現在它是這在很大程度上是特設的控制流分析部分相當薄弱。
既然您表達了對創建反編譯器的興趣,那麼如何改進現有編譯器以使其更好?
相關問題
- 1. Java反編譯器
- 2. MIPS反編譯器
- 3. .dll反編譯器
- 4. java反編譯器
- 5. ANN反編譯器?
- 6. 反編譯Python 2.7 .pyc
- 7. Android L編譯器防止反編譯?
- 8. 關於編譯器和反編譯
- 9. 的Java反編譯器和Java反編譯
- 10. 如何理解我的vb反編譯器已經反編譯
- 11. Objective C反編譯器
- 12. 反編譯器在Xcode中?
- 13. java webstart反編譯器
- 14. Google Closure反編譯器?
- 15. Java,反編譯器故障
- 16. netbeans的Java反編譯器
- 17. Flash cs5反編譯器?
- 18. LLVM 5.0編譯器是否等同於GCC編譯器?
- 19. g ++等效的編譯器標誌到VC++編譯器標誌
- 20. 使用unpyc3反編譯Python 3.3 .pyc
- 21. 反編譯APK
- 22. 反編譯ipsw?
- 23. java反編譯
- 24. 反編譯IEnumerators
- 25. C#反編譯
- 26. BAML反編譯器/查看器
- 27. Exe&Dll分析器和反編譯器
- 28. 如何反編譯jd-gui反編譯器無法反編譯的Java類文件?
- 29. 如何我很感興趣,像ILSpy或.net反射等反編譯的C#反編譯工作
- 30. python編譯器包解釋
python不編譯... – mgilson
你的意思是你正在尋找一種方法來將python字節碼(pyc文件)轉換爲python源代碼? – Michael0x2a
是這就是我想要做的不是pyc文件編譯python源? – user1775641