如何将Python Marshal格式的代码还原为原始源代码?
Python 3.11 Marshal格式代码还原方法
Marshal是Python用于序列化代码对象的格式,直接转pyc失败通常是因为缺少pyc文件的头部结构,以下是可行的还原方案:
方案一:构造合法pyc文件后反编译
pyc文件包含固定头部(魔术数、时间戳、大小字段等),仅用Marshal数据无法被反编译工具识别,需手动补全头部:
- 用以下Python代码生成标准pyc文件:
import marshal import struct import time # Python 3.11的魔术数(小端字节序) magic = b'\x0a\x0d\x0d\x33' # 生成时间戳(8字节小端) timestamp = struct.pack('<Q', int(time.time())) # 3.11+ pyc新增的size字段,填0即可 size = b'\x00' * 8 # 读取你的Marshal格式数据,替换成实际读取逻辑 with open('your_marshal_data.bin', 'rb') as f: marshal_data = f.read() # 写入完整pyc文件 with open('target.pyc', 'wb') as f: f.write(magic) f.write(timestamp) f.write(size) f.write(marshal_data) - 使用支持Python 3.11的反编译工具处理生成的
target.pyc,比如:- 确保pycdc为最新版本(旧版不支持3.11字节码),执行
pycdc target.pyc - 或使用decompyle3,执行
decompyle3 target.pyc
- 确保pycdc为最新版本(旧版不支持3.11字节码),执行
方案二:直接加载代码对象并反汇编
通过Python内置模块加载Marshal数据得到代码对象,再反汇编字节码后手动还原:
- 加载并反汇编:
import marshal import dis with open('your_marshal_data.bin', 'rb') as f: code_obj = marshal.load(f) # 输出字节码指令 dis.dis(code_obj) - 根据反汇编结果手动还原代码,比如
print("hello world")的反汇编会包含LOAD_NAME print、LOAD_CONST 'hello world'、CALL_FUNCTION 1等指令,对应逻辑很容易还原。
注意事项
- 旧版反编译工具(如pycdc旧版本)不支持Python 3.11新增的字节码指令,必须使用工具的最新版本。
- 如果Marshal数据是经过修改或混淆的,可能需要额外处理字节码逻辑。
内容的提问来源于stack exchange,提问作者3bd2lra7man
相关产品推荐
相关产品推荐

