Python Language
Das dis-Modul
Suche…
Konstanten im dis-Modul
EXTENDED_ARG = 145 # All opcodes greater than this have 2 operands
HAVE_ARGUMENT = 90 # All opcodes greater than this have at least 1 operands
cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', 'is ...
# A list of comparator id's. The indecies are used as operands in some opcodes
# All opcodes in these lists have the respective types as there operands
hascompare = [107]
hasconst = [100]
hasfree = [135, 136, 137]
hasjabs = [111, 112, 113, 114, 115, 119]
hasjrel = [93, 110, 120, 121, 122, 143]
haslocal = [124, 125, 126]
hasname = [90, 91, 95, 96, 97, 98, 101, 106, 108, 109, 116]
# A map of opcodes to ids
opmap = {'BINARY_ADD': 23, 'BINARY_AND': 64, 'BINARY_DIVIDE': 21, 'BIN...
# A map of ids to opcodes
opname = ['STOP_CODE', 'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'DUP_TOP', '...
Was ist Python-Bytecode?
Python ist ein Hybridinterpreter. Wenn ein Programm ausgeführt wird, fügt es es zunächst in Bytecode zusammen, der dann im Python-Interpreter (auch als virtuelle Python-Maschine bezeichnet ) ausgeführt werden kann. Das Modul dis
in der Standardbibliothek kann verwendet werden, um den Python-Bytecode durch Disassemblieren von Klassen, Methoden, Funktionen und Codeobjekten lesbar zu machen.
>>> def hello():
... print "Hello, World"
...
>>> dis.dis(hello)
2 0 LOAD_CONST 1 ('Hello, World')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
Der Python-Interpreter ist stapelbasiert und verwendet ein First-In-Last-Out-System.
Jeder Operationscode (Opcode) in der Python-Assemblersprache (der Bytecode) nimmt eine feste Anzahl von Elementen aus dem Stapel und gibt eine feste Anzahl von Elementen an den Stapel zurück. Wenn auf dem Stack nicht genügend Elemente für einen Opcode vorhanden sind, stürzt der Python-Interpreter möglicherweise ohne Fehlermeldung ab.
Module demontieren
Um ein Python-Modul zu zerlegen, muss dieses zunächst in eine .pyc
Datei umgewandelt werden (Python kompiliert). Um dies zu tun, renne
python -m compileall <file>.py
Dann laufen Sie in einem Dolmetscher
import dis
import marshal
with open("<file>.pyc", "rb") as code_f:
code_f.read(8) # Magic number and modification time
code = marshal.load(code_f) # Returns a code object which can be disassembled
dis.dis(code) # Output the disassembly
Dadurch wird ein Python-Modul kompiliert und die Bytecode-Anweisungen mit dis
ausgegeben. Das Modul wird niemals importiert, so dass die Verwendung mit nicht vertrauenswürdigem Code sicher ist.