本文共 1616 字,大约阅读时间需要 5 分钟。
uncompyle,这个库可以将代码反编译成字节码指令和源代码
简单的使用方法:
from uncompyle2 import *fp = open("code.txt","wb")uncompyle_file('test.pyc',fp,showasm=1,showast=0)fp.close()
当然,这只是其中一种方法,还有其他方法可以选择
这是从stackoverflow上看到的:
>>> import dis>>> def inplace_add():... a = 0... a += 1... >>> def add_and_assign():... a = 0... a = a + 1... >>> dis.dis(inplace_add) 2 0 LOAD_CONST 1 (0) 3 STORE_FAST 0 (a) 3 6 LOAD_FAST 0 (a) 9 LOAD_CONST 2 (1) 12 INPLACE_ADD 13 STORE_FAST 0 (a) 16 LOAD_CONST 0 (None) 19 RETURN_VALUE >>> dis.dis(add_and_assign) 2 0 LOAD_CONST 1 (0) 3 STORE_FAST 0 (a) 3 6 LOAD_FAST 0 (a) 9 LOAD_CONST 2 (1) 12 BINARY_ADD 13 STORE_FAST 0 (a) 16 LOAD_CONST 0 (None) 19 RETURN_VALUE
实际上Python每个函数都是一个对象,这个对象上面就直接带了编译好的字节码,函数中的常量,函数的变量等等信息,还是挺有趣的,大家可以试一试
>>> def add(a, b): return a + b>>> add.func_code.co_code'|\x00\x00|\x01\x00\x17S'>>> add.func_code.co_consts(None,)>>> add.func_code.co_varnames('a', 'b')>>> add.func_code.co_name'add'
然后具体的字节码的值Python也是自带了的,有一个包叫opcode,大家可以用idle去看看它的结构,我这里贴出一小部分
>>> import opcode>>> for i in range(len(opcode.opname)): print(i, opcode.opname[i]) (0, 'STOP_CODE')(1, 'POP_TOP')(2, 'ROT_TWO')(3, 'ROT_THREE')(4, 'DUP_TOP')(5, 'ROT_FOUR')......(255, '<255>')
转载地址:http://ituws.baihongyu.com/