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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow