如何将Python二进制文件转换为可读格式?
问题
我有一个应为Python函数的二进制文件,想要读取它。当前打开并打印数据时得到如下内容:
b'c\x00\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00C\x00\x00\x00s3\x03\x00\x00d\x01\x00\x01\x03\x03\x03\t\x02\x02\t\x03\x03\x03\t\x02\x02\td\x02\x00d\x00\x00l\x00\x00}\x01\x00d\x02\x00d\x00\x00l\x01\x00}\x02\x00t\x02\x00\x83\x00\x00}\x03\x00d\x03\x00}\x00\x00t\x03\x00|\x03\x00\x83...'
获取该输出的Python代码:
file = open('flag_function', 'rb') data = file.read() print(data) # convert the data to a readable format
请问如何将该格式转换为可读数据?
解决方案
你看到的是Python编译后的字节码,并非明文代码,需要用Python内置的dis模块反编译为可读的指令。具体步骤如下:
- 导入
dis和marshal模块(Python用marshal序列化字节码) - 根据文件类型处理:
- 如果是完整的
.pyc文件:需要先跳过文件头部(Python 3.7及以上版本头部长度为16字节),再加载为代码对象 - 如果仅包含函数的字节码片段:直接加载数据即可
- 如果是完整的
示例代码:
import dis import marshal with open('flag_function', 'rb') as f: # 若是完整pyc文件,取消下面一行注释跳过头部 # f.seek(16) code_obj = marshal.load(f) # 反编译为可读指令 dis.dis(code_obj)
执行后会输出类似如下的可读指令(示例):
1 0 LOAD_CONST 1 (1) 3 LOAD_CONST 2 (2) 6 BINARY_ADD 7 RETURN_VALUE
这些指令对应原Python代码的执行逻辑,你可以根据指令逆向推导出原函数的功能。
内容的提问来源于stack exchange,提问作者roee
相关产品推荐
相关产品推荐

