Python Bytecode decompilieren

Man hat ein altes Pythonprogramm nur noch in Bytecode (Dateien mit der Endung .pyc) vorliegen würde aber gerne noch etwas daran ändern. Was nun? Alles neu schreiben? Nein viel zu aufwändig. Aber es gibt eine Rettung….in Form der unpyclib Bibliothek von Dmitri Kornev. Diese kann man einfach über pip herunterladen.

pip install unpyclib

Dann lassen sich .pyc Dateien mit folgendem Aufruf wieder zurückübersetzen:

python -m unpyclib.application -Dq path/to/file.pyc

Wenn man jetzt aber ein Projekt hat, welches aus mehr als nur einer Datei besteht wird das über die Kommandozeile lästig.
Aus diesem Grund habe ich folgendes Script geschrieben, welches alle .pyc Dateien in einem Verzeichnis und dessen Unterverzeichnissen wieder zurück übersetzt.

import os
import sys
import unpyclib.parse
import unpyclib.disasm
import unpyclib.decompile

rootdir = sys.argv[1]

for dirPath, subFolders, files in os.walk(rootdir):
    for filename in files:
        if filename.endswith(".pyc"):
            bytecodefile = os.path.join(dirPath, filename)
            sourcefile = bytecodefile[:-1]
            print bytecodefile
            if os.path.isfile(sourcefile):
                print "skipped"
            else:
                print "-> " + sourcefile
                try:
                    parser = unpyclib.parse.Parser(bytecodefile, verboseDisasm=False, xrefDisasm=False)
                    disassembler = unpyclib.disasm.Disassembler(parser.co)
                    optimizingDisassembler = unpyclib.disasm.Disassembler(parser.co, optimizeJumps=True)
                    decompiler = unpyclib.decompile.Decompiler(optimizingDisassembler, False)
                    f = open(sourcefile, "w")
                    f.write(decompiler.decompile())
                    f.close()
                except (unpyclib.parse.ParseErrorException,
                        unpyclib.parse.IOErrorException,
                        unpyclib.parse.BadFirstObjectException), p:
                    print p

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.