You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Python Marshal格式的代码还原为原始源代码?

Python 3.11 Marshal格式代码还原方法

Marshal是Python用于序列化代码对象的格式,直接转pyc失败通常是因为缺少pyc文件的头部结构,以下是可行的还原方案:

方案一:构造合法pyc文件后反编译

pyc文件包含固定头部(魔术数、时间戳、大小字段等),仅用Marshal数据无法被反编译工具识别,需手动补全头部:

  1. 用以下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)
    
  2. 使用支持Python 3.11的反编译工具处理生成的target.pyc,比如:
    • 确保pycdc为最新版本(旧版不支持3.11字节码),执行pycdc target.pyc
    • 或使用decompyle3,执行decompyle3 target.pyc

方案二:直接加载代码对象并反汇编

通过Python内置模块加载Marshal数据得到代码对象,再反汇编字节码后手动还原:

  1. 加载并反汇编:
    import marshal
    import dis
    
    with open('your_marshal_data.bin', 'rb') as f:
        code_obj = marshal.load(f)
    
    # 输出字节码指令
    dis.dis(code_obj)
    
  2. 根据反汇编结果手动还原代码,比如print("hello world")的反汇编会包含LOAD_NAME print、LOAD_CONST 'hello world'、CALL_FUNCTION 1等指令,对应逻辑很容易还原。

注意事项

  • 旧版反编译工具(如pycdc旧版本)不支持Python 3.11新增的字节码指令,必须使用工具的最新版本。
  • 如果Marshal数据是经过修改或混淆的,可能需要额外处理字节码逻辑。

内容的提问来源于stack exchange,提问作者3bd2lra7man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:25:23