我使用python 2.7并且我有一个非常简单的脚本
def simple():
print("It's simple!")
x = "Come on"
然后我在这样的一个项目中导入这个脚本以便反汇编他
import marshal
import dis
pyc_file = open('./simple.pyc', 'rb')
magic = pyc_file.read(4)
date = pyc_file.read(4)
code_object = marshal.load(pyc_file)
pyc_file.close()
dis.dis(code_object)
并获得输出
1 0 LOAD_CONST 0 (<code object simple at 0x7efc5d1bfc30, file "/home/svintsov/PycharmProjects/www.artour.com/simple.py", line 1>)
3 MAKE_FUNCTION 0
6 STORE_NAME 0 (simple)
4 9 LOAD_CONST 1 ('Come on')
12 STORE_NAME 1 (x)
15 LOAD_CONST 2 (None)
18 RETURN_VALUE
但我也尝试了另一种在另一个项目中拆解的方式:
import dis
s = __import__("simple")
dis.dis(s)
给出了另一个输出
Disassembly of simple:
2 0 LOAD_CONST 1 ("It's simple!")
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
这些产出不同的原因是什么?其中一个似乎没有识别字符串文字。
答案 0 :(得分:0)
好的,我实际上会自己回答我的问题。 正如python 2.x文档所说
dis.dis([bytesource])反汇编bytesource对象。 bytesource 可以表示模块,类,方法,函数或代码 宾语。对于模块,它会反汇编所有功能。对于一个类,它 拆解所有方法。对于单个代码序列,它会打印一个 每字节码指令行。如果没有提供对象,则为 拆解最后的追溯。
所以这个函数对&#34; raw&#34;进行了不同类型的反汇编。代码对象和模块,尽管字节码(.pyc文件)是相同的。