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

如何从经base64、zlib、gzip、marshal混淆的Python代码对象还原源码?

问题描述

我有一个经过base64、zlib、gzip、marshal多层编码压缩的混淆Python代码对象,目标是逆向提取原始源码。

生成混淆代码的流程如下:

import gzip, zlib, marshal, base64
pycode = "print('Hello world')"
obfuscated_code = base64.b64encode(zlib.compress(gzip.compress(marshal.dumps(compile(pycode, '<string>', "exec"))), level=zlib.Z_BEST_COMPRESSION))

运行混淆代码时使用的代码:

import gzip, zlib, marshal, base64

exec(marshal.loads(gzip.decompress(zlib.decompress(base64.b64decode(obfuscated_code)))))

我尝试把exec改成print,没有得到原始源码,只输出:

<code object <module> at 0x15034df59df0, file "Nice Try", line 1>

请问如何逆向该代码对象提取原始源码?是否有可行的恢复方法?


解决方案

你看到的输出是Python的code对象——这是代码编译后的字节码容器,直接打印只能得到对象描述,无法还原原始源码。以下是两种可行的恢复方法:

方法1:用uncompyle6反编译(推荐)

uncompyle6可以直接将Python code对象反编译为可读源码,步骤如下:

  1. 先安装工具:
pip install uncompyle6
  1. 修改逆向代码,将解码得到的code对象传入反编译函数:
import gzip, zlib, marshal, base64
import uncompyle6
import sys

# 解码解压得到code对象
code_obj = marshal.loads(gzip.decompress(zlib.decompress(base64.b64decode(obfuscated_code))))

# 反编译并输出原始源码
uncompyle6.decompile(code_obj, sys.stdout)

方法2:用dis模块分析字节码(适合逻辑分析)

如果仅需要了解代码执行逻辑,不需要完整还原源码,可以用Python内置的dis模块解析字节码:

import gzip, zlib, marshal, base64
import dis

code_obj = marshal.loads(gzip.decompress(zlib.decompress(base64.b64decode(obfuscated_code))))
# 输出字节码指令
dis.dis(code_obj)

你可以根据字节码指令手动还原代码逻辑,但效率远低于反编译工具。

注意事项

  • 反编译效果依赖Python版本:uncompyle6支持Python 2.7至3.8,更高版本可尝试decompyle3工具。
  • 你这种仅通过标准编译+压缩编码的混淆方式,反编译成功率接近100%;若原始代码经过字节码变形等深层混淆,可能会出现少量还原误差。

内容的提问来源于stack exchange,提问作者Dimuth De Zoysa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:01:19