2009-07-19 17 views
12

Diciamo che ho:esplorare e decompilazione pitone bytecode

>>> def test(a):  
>>> print a 

Ora, voglio esplorare vedere come prova assomiglia nella sua forma compilata.

>>> test.func_code.co_code 
'|\x00\x00GHd\x00\x00S' 

posso ottenere la forma smontata utilizzando il modulo dis:

>>> import dis 
>>> dis.dis(test) 
    2   0 LOAD_FAST    0 (a) 
       3 PRINT_ITEM 
       4 PRINT_NEWLINE 
       5 LOAD_CONST    0 (None) 
       8 RETURN_VALUE 

C'è un opensource e mantenuto decompilatore potrei usare per trasformare il bytecode nuovamente in codice python leggibile?

aggiornamento: grazie per aver suggerito la decompilazione, ma è obsoleto (python2.3) e nessuno lo mantiene più. C'è qualcosa per python2.5 o successivo?

risposta

3

decompyle

decompyle è un disassemblatore pitone e decompilatore che converte Python byte-code (.pyc o .pyo) resta in sorgente Python equivalente. La verifica del codice prodotto (ri-compilato) è disponibile pure.

+1

Sì. Per Python 2.3, qualsiasi cosa utilizzabile con Python 2.5+? –

7

UnPyc

http://sourceforge.net/projects/unpyc/

È una forchetta mantenuto del vecchio decompyle aggiornato per funzionare con 2.5 e 2.6.

+5

Dal file readme.txt del progetto: "D - decompilare (non ancora implementato)". Quindi no, questo è un povero sostituto per il decompyle. – Cerin

2

Uncompyle2 ha funzionato per me con Python 2.7.

https://github.com/wibiti/uncompyle2

rapido come utilizzare uncompyle2, installarlo e poi

>>>import uncompyle2 
>>> with open("decompiled.py","wb") as f: 
... uncompyle2.uncompyle_file("compiled.pyc",f) 

verrà generato il codice sorgente nel decompile.py

1

In aggiunta a quanto DevC ha scritto:

  1. Uncompyle2 funziona con Python 2.7

  2. con Uncompyle2, si può anche non-compilazione dalla riga di comando:

    $ uncompyle2 compiled.pyc >> source.uncompyle2.py

  3. installare Uncompyle2, fare

    $ git clone https://github.com/wibiti/uncompyle2

    $ cd uncompyle2

    $ sudo ./setup.py installare

1

C'è anche ora uncompyle6 che è scritto in Python e pycdc che è scritto in C++.

Entrambi gestiscono diverse versioni di bytecode Python, incluse le versioni Python 2 e Python 3.