Как дизассемблировать байт-код Грааля Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как дизассемблировать байт-код Грааля Python?

Сообщение Anonymous »

Я подумывал о расширении кросс-версии дизассемблера Python xdis для Python Graal.
GraalPython предоставляет тип кода Python, который похож на тип кода Python, но базовые байты байт-кода — это другое. В Python это инструкции байт-кода Python, закодированные в байт-коде. В Graal мне дано понять, что это содержит байт-код JVM, но, похоже, это нечто большее, чем просто инструкции.
Напомним, что операнды байт-кода обычно являются индексами в какую-то другую таблицу, например пул констант. или список имен переменных. Несмотря на то, что тип кода Graal хранит эту информацию в других частях типа кода так же, как это делает Python, я подозреваю, что в массиве байтов co_code есть дополнительные таблицы.
Чтобы дать некоторое представление о том, что находится в байтовом массиве co_code, вот его значение внутри функции five() для приведенного ниже примера:

Код: Выделить всё

def five():
return 5

Код: Выделить всё

87654321  0011 2233 4455 6677 8899 aabb ccdd eeff  01234567689abcdf
-------------------------------------------------------------------
00000000: 2062 275c 7831 635c 7830 345c 7830 305c   b'\x1c\x04\x00\
00000010: 7830 305c 7830 3066 6976 655c 7830 345c  x00\x00five\x04\
00000020: 7830 305c 7830 305c 7830 3066 6976 655c  x00\x00\x00five\
00000030: 7830 305c 7830 305c 7830 305c 7830 305c  x00\x00\x00\x00\
00000040: 7830 305c 7830 305c 7830 305c 7830 305c  x00\x00\x00\x00\
00000050: 7830 305c 7830 305c 7830 305c 7830 305c  x00\x00\x00\x00\
00000060: 7830 315c 7830 305c 7830 305c 7830 305c  x01\x00\x00\x00\
00000070: 7830 335c 7830 305c 7830 305c 7830 3070  x03\x00\x00\x00p
00000080: 5c78 3035 5c78 3132 5c78 3035 5c78 3030  \x05\x12\x05\x00
00000090: 5c78 3030 5c78 3030 5c78 3831 5c78 3062  \x00\x00\x81\x0b
000000a0: 5c78 3031 5c78 6639 5c78 3038 435c 7830  \x01\xf9\x08C\x0
000000b0: 305c 7830 305c 7830 305c 7830 305c 7830  0\x00\x00\x00\x0
000000c0: 305c 7830 305c 7830 305c 7830 305c 7830  0\x00\x00\x00\x0
000000d0: 305c 7830 305c 7830 305c 7830 305c 7830  0\x00\x00\x00\x0
000000e0: 305c 7830 305c 7830 305c 7830 305c 7830  0\x00\x00\x00\x0
000000f0: 305c 7830 305c 7830 305c 7830 305c 7830  0\x00\x00\x00\x0
00000100: 305c 7830 305c 7830 305c 7830 315c 7830  0\x00\x00\x01\x0
00000110: 305c 7830 305c 7830 304e 5c78 3030 5c78  0\x00\x00N\x00\x
00000120: 3030 5c78 3030 5c78 3030 5c78 3030 5c78  00\x00\x00\x00\x
00000130: 3030 5c78 3030 5c78 3030 5c78 3030 5c78  00\x00\x00\x00\x
00000140: 3030 5c78 3030 5c78 3030 5c78 3031 5c78  00\x00\x00\x01\x
00000150: 3030 5c78 3030 5c78 3030 5c78 3030 5c78  00\x00\x00\x00\x
00000160: 3030 5c78 3030 5c78 3030 5c78 3032 5c78  00\x00\x00\x02\x
00000170: 3030 5c78 3030 5c78 3030 5c78 3063 5c78  00\x00\x00\x0c\x
00000180: 3030 5c78 3030 5c78 3030 5c78 3033 5c78  00\x00\x00\x03\x
00000190: 3030 5c78 3030 5c78 3030 5c78 3030 5c78  00\x00\x00\x00\x
000001a0: 3030 5c78 3030 5c78 3030 5c78 3030 5c78  00\x00\x00\x00\x
000001b0: 3030 5c78 3030 5c78 3033 5c78 3030 5c78  00\x00\x03\x00\x
000001c0: 3030 5c78 3030 5c78 6666 5c78 6666 5c78  00\x00\xff\xff\x
000001d0: 6666 5c78 6666 5c78 3030 5c78 3030 5c78  ff\xff\x00\x00\x
000001e0: 3030 5c78 3030 5c78 6666 5c78 6666 5c78  00\x00\xff\xff\x
000001f0: 6666 5c78 6666 270a 6573                 ff\xff'.e
Обратите внимание, что это немного велико, если оно содержало только часть инструкции
без этих дополнительных таблиц.
Изменение возвращаемого значения с 5 на 4 меняет всего один байт:

Код: Выделить всё

00000080: 5c78 3035 5c78 3132 5c78 3035 5c78 3030  \x05\x12\x05\x00
^^
становится:

Код: Выделить всё

00000080: 5c78 3034 5c78 3132 5c78 3035 5c78 3030  \x04\x12\x05\x00
^^
Итак, как это расшифровать? Существуют ли инструменты, которые можно использовать для этого?

Подробнее здесь: https://stackoverflow.com/questions/785 ... l-bytecode
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»