如何从经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对象反编译为可读源码,步骤如下:
- 先安装工具:
pip install uncompyle6
- 修改逆向代码,将解码得到的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
相关产品推荐
相关产品推荐

