python反编译初探

前言

python 中的反汇编指的是把机器码转为字节码(bytecode or opcode)的过程,python 给用户提供了 dis 模块,方便我们来进行反汇编,他以底层机器码为输入,字节码或者源代码为输出

查看字节码(byte code)

python 中的字节码(byte code)就是 操作码(opcode),因为是用一个字节表示,所以叫字节码,也有用多字节表示的,2 的 8 次方,可以表示 256 个字节码

dis opname 列表可以查看 python 中的字节码列表,一目了然,有点汇编的感觉了

直接 py 文件反汇编

1
2
3
4
import dis
s = open('3434.py').read()
co = compile(s, '3434.py', 'exec')
dis.dis(co)

用 pyc 文件反汇编

有一些网站提供了 pyc 文件的反汇编功能,可以试试

用代码字符串反汇编

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> dis.dis("a = 257; b=257; a is b")
0 STORE_GLOBAL 15648 (15648)
3 SLICE+2
4 DELETE_SLICE+0
5 DELETE_SLICE+3
6 INPLACE_ADD
7 INPLACE_MODULO
8 SLICE+2
9 DELETE_GLOBAL 12861 (12861)
12 DELETE_SLICE+3
13 INPLACE_ADD
14 INPLACE_MODULO
15 SLICE+2
16 STORE_GLOBAL 26912 (26912)
19 POP_JUMP_IF_TRUE 25120

python3 中查看字节码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from dis import dis


def func():
print(1)


dis(func)
print(list(func.__code__.co_code))

# 执行结果如下

5 0 LOAD_GLOBAL 0 (print)
2 LOAD_CONST 1 (1)
4 CALL_FUNCTION 1
6 POP_TOP
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
[116, 0, 100, 1, 131, 1, 1, 0, 100, 0, 83, 0]

挺有趣的,字节码 116 对应的就是 LOAD_GLOBAL,如果再结合他 PyCodeObject 对象类容查看就更好了,字节码执行过程一目了然

坚持原创技术分享,您的支持将鼓励我继续创作!