反汇编python字节码

时间:2016-05-09 01:50:55

标签: python pycharm disassembly

我使用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   

这些产出不同的原因是什么?其中一个似乎没有识别字符串文字。

1 个答案:

答案 0 :(得分:0)

好的,我实际上会自己回答我的问题。 正如python 2.x文档所说

  

dis.dis([bytesource])反汇编bytesource对象。 bytesource   可以表示模块,类,方法,函数或代码   宾语。对于模块,它会反汇编所有功能。对于一个类,它   拆解所有方法。对于单个代码序列,它会打印一个   每字节码指令行。如果没有提供对象,则为   拆解最后的追溯。

所以这个函数对&#34; raw&#34;进行了不同类型的反汇编。代码对象和模块,尽管字节码(.pyc文件)是相同的。