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

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

Сообщение Anonymous »

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

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

def five():
return 5
При использовании GraalVM Python 3.8.5 (GraalVM CE Native 22.2.0) шестнадцатеричный дамп python -m compileall /tmp/five.py дает:

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

87654321  0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef
-------------------------------------------------
00000000: 9e52 0d0a 0000 0000 dd5b 6867 1900 0000  .R.......[hg....
00000010: c30c 0000 002f 746d 702f 6669 7665 2e70  ...../tmp/five.p
00000020: 7940 0000 009a 0000 000f 0007 6669 7665  y@..........five
00000030: 2e70 7900 0c2f 746d 702f 6669 7665 2e70  .py../tmp/five.p
00000040: 7900 0000 1964 6566 2066 6976 6528 293a  y....def five():
00000050: 0a20 2020 2072 6574 7572 6e20 350a 0000  .    return 5...
00000060: 025b 5d72 2fc8 0a00 0000 0000 0000 0000  .[]r/...........
00000070: 0000 0000 0000 0000 0000 0000 0101 0004  ................
00000080: 6669 7665 724b cb05 0100 0000 0000 0000 fiverK..........
00000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000a0: 0000 0702 1901 1501 724b cb05 0004 6669  ........rK....fi
000000b0: 7665 02ff ffff 0000 3007 1208 0120 011c  ve......0.... ..
000000c0: 1901 0501 0000 0000 0000 00
Приведенный выше шестнадцатеричный дамп содержит информацию о модуле, основной код и выглядит как встроенный исходный текст. Байт-код функции Five() может быть около 0x80.
При изменении возвращаемого значения с 5 на 6 изменения:

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

00000080: 6669 7665 724b cb05 0100 0000 0000 0000  fiverK..........
кому:

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

00000080: 6669 7665 36c7 9bee 0100 0000 0000 0000  five6...........
Итак, как это расшифровать? Существуют ли инструменты, которые можно использовать для этого?
Примечание к редактированию: У меня были проблемы с получением шестнадцатеричного дампа, который кажется нормальным. Лучше всего создать свою собственную программу с помощью compileall и использовать собственную процедуру шестнадцатеричного дампа.

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

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

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

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

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

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