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例子。
答案 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)
希望这有帮助!