Wie zerlegt man den Python-Graal-Bytecode?Python

Python-Programme
Guest
 Wie zerlegt man den Python-Graal-Bytecode?

Post by Guest »

Ich habe darüber nachgedacht, den versionübergreifenden Python-Disassembler xdis für Python Graal zu erweitern.
GraalPython bietet einen Python-Codetyp, der dem Codetyp von Python ähnelt, aber die zugrunde liegenden Bytecode-Bytesco_code ist anders. In Python sind dies Bytecode-codierte Python-Bytecode-Anweisungen. In Graal wird mir mitgeteilt, dass dies JVM-Bytecode enthält, aber es scheint mehr als nur Anweisungen zu geben.
Denken Sie daran, dass Bytecode-Operanden normalerweise Indizes in eine andere Tabelle wie einen Konstantenpool sind oder eine Liste mit Variablennamen. Auch wenn der Codetyp von Graal diese Informationen in den anderen Teilen des Codetyps auf die Art und Weise speichert, wie Python es tut, vermute ich, dass es zusätzliche Tabellen im Byte-Array „co_code gibt.
Um eine Vorstellung davon zu geben, was sich im Bytearray co_code befindet, betrachten Sie hier seinen Wert dieser Datei
def five():
return 5

Mit GraalVM Python 3.8.5 (GraalVM CE Native 22.2.0) ergibt ein Hexdump von 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

Der obige Hexdump enthält Modulinformationen, den Hauptcode und sieht aus wie eingebetteter Quelltext. Der Bytecode für die Funktion five() könnte etwa 0x80 sein.
Änderung des Rückgabewerts von 5 auf 6 ändert Folgendes:
00000080: 6669 7665 724b cb05 0100 0000 0000 0000 fiverK..........

an:
00000080: 6669 7665 36c7 9bee 0100 0000 0000 0000 five6...........

Zusammengefasst: Wie kann man das entschlüsseln? Gibt es Tools, die dafür verwendet werden können?
Mir wurde ein Kopfgeld hinzugefügt, das ohne mögliche Antworten abgelaufen ist. Sollte in Zukunft jemand diese Frage ausreichend beantworten und ein Kopfgeld dafür verlangen, lassen Sie es mich wissen, nachdem die Antwort akzeptiert wurde.
Hinweis bearbeiten: I Ich hatte Probleme damit, einen Hex-Dump zu bekommen, der in Ordnung zu sein scheint. Erstellen Sie am besten Ihre eigene mit Compileall und verwenden Sie Ihre eigene Hex-Dump-Routine.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post