Python Language
ディスモジュール
サーチ…
disモジュールの定数
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', '...
Pythonバイトコードとは何ですか?
Pythonはハイブリッドインタプリタです。プログラムを実行するときは、最初にバイトコードにアセンブルし、Pythonインタプリタ( Python仮想マシンとも呼ばれます)で実行できます。標準ライブラリのdis
モジュールを使用すると、クラス、メソッド、関数、コードオブジェクトを逆アセンブルすることで人間が読めるPythonバイトコードを作成できます。
>>> 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
Pythonインタープリタはスタックベースであり、先入れ先出しシステムを使用します。
Pythonアセンブリ言語(バイトコード)の各オペレーションコード(opcode)は、スタックから固定数の項目を取り出し、固定数の項目をスタックに返します。オペコードのスタックに十分な項目がない場合、Pythonインタプリタがクラッシュする可能性があります。エラーメッセージは表示されません。
モジュールの分解
Pythonモジュールを逆アセンブルするには、まずこれを.pyc
ファイル(Pythonコンパイル済み)に変換する必要があります。これを行うには、
python -m compileall <file>.py
次に通訳で、
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
これは、Pythonモジュールをコンパイルし、 dis
バイトコード命令を出力します。モジュールは決してインポートされないので、信頼できないコードでも安全に使用できます。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow