使用unpyc3反编译Python 3.3 .pyc

时间:2014-02-28 13:38:00

标签: python python-3.x python-3.3

Accedentely我丢失了所有项目源代码。但我仍然有我的.pyc文件。我需要帮助反编译它们。我下载了可以反编译python 3.2文件的unpyc3脚本。并进行了更改,允许它正确读取python 3.3 pyc文件:

def read_code(stream): 
# This helper is needed in order for the PEP 302 emulation to 
# correctly handle compiled files
# Note: stream must be opened in "rb" mode
import marshal 
magic = stream.read(4) 
if magic != imp.get_magic(): 
    print("*** Warning: file has wrong magic number ***")
stream.read(8) # Skip timestamp and additional 4 bytes for python 3.3
return marshal.load(stream)         

通过运行此代码,我遇到以下错误:“'str'对象没有属性'co_cellvars'”这里:

class Code:
    def __init__(self, code_obj, parent=None):
        self.code_obj = code_obj
        self.parent = parent
        self.derefnames = [PyName(v)
                       for v in code_obj.co_cellvars + code_obj.co_freevars]

当代码类初始化时,代替代码对象时会出现code_obj,string。 我需要帮助弄清楚为什么会发生这种情况以及如何解决它。如果有人知道unpyc3如何工作并且可以提供帮助,请写信给我。我可以发送.pyc例子。

1 个答案:

答案 0 :(得分:5)

经过一些严肃的调试后,我发现从MAKE_FUNCTION修改代码应该可以解决问题:

def MAKE_FUNCTION(self, addr, argc, is_closure=False):
    testType = self.stack.pop().val
    if isinstance(testType, str) :
        code = Code(self.stack.pop().val, self.code)
    else :
        code = Code(testType, self.code)

希望这有帮助!