最近做了一道pyc的逆向题,主要难点在于Python环境的opcode被置换,就简单记录一下相关知识。
opcode是什么
opcode其实是指Python源码的操作码,Python源代码*.py编译后可以得到二进制文件*.pyc,*.pyc文件中就含有opcode序列。对于不同版本的Python,其opcode是不完全相同的,这也就是为什么某一版本的Python虚拟机不能执行另一个版本的源码。
查看当前版本opcode的方式有很多种,最简单的是直接导入opcode库查看:
import opcode
for key in opcode.opmap.keys():
print (key, opcode.opmap[key])
或者在/Python/Include/opcode.h文件中查看。
一个简单源码的opcode查看如下:
import dis
def foo():
x = 20
y = 10
z = x - y
return z
dis.dis(foo)
输出如下:
3 0 LOAD_CONST 1 (20)
2 STORE_FAST 0 (x)
4 4 LOAD_CONST 2 (10)
6 STORE_FAST 1 (y)
5 8 LOAD_FAST