Python Language
De dis-module
Zoeken…
Constanten in de dis-module
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', '...
Wat is Python bytecode?
Python is een hybride tolk. Wanneer een programma wordt uitgevoerd, wordt het eerst in bytecode samengevoegd en vervolgens in de Python-interpreter uitgevoerd (ook een virtuele Python-machine genoemd ). De dis
module in de standaardbibliotheek kan worden gebruikt om de Python-bytecode leesbaar te maken door klassen, methoden, functies en code-objecten te demonteren.
>>> 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
De Python-interpreter is stack-gebaseerd en maakt gebruik van een first-in last-out systeem.
Elke operatiecode (opcode) in de Python-assembleertaal (de bytecode) neemt een vast aantal items uit de stapel en retourneert een vast aantal items naar de stapel. Als er onvoldoende items op de stapel staan voor een opcode, crasht de Python-interpreter, mogelijk zonder een foutmelding.
Demontage modules
Om een Python-module te demonteren, moet dit eerst worden omgezet in een .pyc
bestand (gecompileerd Python). Om dit te doen, ren
python -m compileall <file>.py
Ren dan in een tolk
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
Dit zal een Python-module compileren en de bytecode-instructies uitvoeren met dis
. De module wordt nooit geïmporteerd, dus het is veilig om te gebruiken met niet-vertrouwde code.