2009-07-19 41 views
12

phép nói rằng tôi có:khám phá và dịch ngược python bytecode

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

Bây giờ, tôi muốn khám phá xem làm thế nào kiểm tra trông giống như trong hình thức biên soạn của nó.

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

tôi có thể nhận dạng tháo rời bằng cách sử dụng dis mô-đun:

>>> 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ó một mã nguồn mở và duy trì decompiler tôi có thể sử dụng để biến bytecode trở thành mã python có thể đọc được?

cập nhật: cảm ơn vì đã đề xuất dịch ngược, nhưng đã lỗi thời (python2.3) và không ai duy trì nó nữa. Có bất cứ điều gì cho python2.5 hoặc sau đó?

Trả lời

3

decompyle

Decompyle là một disassembler python và decompiler mà chuyển đổi Python byte-code (pyc hay .pyo) trở lại vào nguồn Python tương đương. Xác minh của mã được sản xuất (được biên dịch lại) là cũng có sẵn.

+1

Có. Đối với trăn 2.3, bất cứ điều gì có thể sử dụng với Python 2.5+? –

7

UnPyc

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

Nó là một ngã ba duy trì của decompyle cũ được cập nhật để làm việc với 2,5 và 2,6.

+5

Từ readme.txt của dự án: "D - dịch ngược (chưa được triển khai)". Vì vậy, không, đây là một thay thế nghèo cho decompyle. – Cerin

2

Uncompyle2 đã làm việc cho tôi bằng Python 2.7.

https://github.com/wibiti/uncompyle2

nhanh cách sử dụng uncompyle2, Cài đặt nó và sau đó

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

Nó sẽ tạo ra mã nguồn trở lại trong decompile.py

1

Ngoài những gì DevC đã viết:

  1. Uncompyle2 hoạt động với Python 2.7

  2. với Uncompyle2, bạn cũng có thể un-biên dịch từ dòng lệnh:

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

  3. để cài đặt Uncompyle2, làm

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

    $ cd uncompyle2

    $ sudo ./setup.py install

1

Bây giờ cũng có uncompyle6 được viết bằng Python và pycdc được viết bằng C++.

Cả hai cách này xử lý một số phiên bản mã byte bytecode của Python bao gồm các phiên bản Python 2 và Python 3.

Các vấn đề liên quan