
Python-Dekompilierer für 3.7-3.8, abgespeckt von uncompyle6, damit wir es refaktorieren und anfangen können, einige langjährige Probleme zu beheben
|buildstatus| |Pypi Installs| |Latest Version| |Supported Python Versions|
|packagestatus|
.. contents::
Ein nativer Python-Cross-Version-Decompiler und Fragment-Decompiler. Eine Überarbeitung von uncompyle6_.
Ich habe auf der BlackHat Asia 2024 <https://youtu.be/H-7ZNrpsV50?si=nOaixgYHr7RbILVS>_ einen Vortrag darüber gehalten.
decompyle3 übersetzt Python-Bytecode zurück in äquivalenten Python-Quellcode. Es akzeptiert Bytecode ab Python-Version 3.7.
Für die Dekompilierung älteren Python-Bytecodes siehe uncompyle6_.
Uncompyle6 ist großartig, aber es hat ein grundlegendes Problem im Umgang mit Kontrollfluss. In den frühen Tagen von Python, als es wenig Optimierung gab und Code auf sehr schablonenhafte Weise generiert wurde, konnten Kontrollflussstrukturen durch einfaches Betrachten von Codemustern erkannt werden.
Im Laufe der Jahre hat die zunehmende Codeoptimierung, insbesondere im Umgang mit Sprüngen, die Unterstützung der Erkennung von Kontrollfluss rein anhand von Codemustern erschwert. Dies wurde bereits 2004 (Python 2.4) bemerkt, aber da es sich um ein schwieriges Problem handelt, wurde es bisher nicht zufriedenstellend gelöst.
Der erste Versuch, dieses Problem zu beheben, bestand darin, Markierungen im Instruktionsstrom hinzuzufügen – zunächst eine COME_FROM-Instruktion – und diese dann in der Mustererkennung zu verwenden.
Im Laufe der Zeit habe ich dies spezifischer erweitert, sodass COME_FROM_LOOP und COME_FROM_WITH hinzugefügt wurden. Und ich habe Prüfungen zur Grammatik-Reduktionszeit hinzugefügt, um sicherzustellen, dass Sprünge mit den vermeintlichen COME_FROM-Zielen übereinstimmen.
All dies ist jedoch kompliziert, nicht robust, hat die Deparsierung stark verlangsamt und ist nicht wirklich haltbar.
In diesem Projekt haben wir begonnen, die Grammatik neu zu schreiben und zu refaktorisieren.
Aber auch das reicht nicht aus. Der Kontrollfluss muss mithilfe von Dominatoren und inversen Dominatoren behandelt werden, was das python-control-flow_-Projekt ermöglichen kann.
Dies tue ich endlich langsam in einem weiteren nicht-öffentlichen Projekt. Es ist viel Arbeit. Finanzierung in Form von Sponsoring wird zwar sehr geschätzt, steht aber in keinem Verhältnis zum erforderlichen Aufwand, und derzeit habe ich eine Vollzeitstelle. Es könnte also einige Zeit dauern, bis es öffentlich verfügbar ist – falls überhaupt.
Der hier enthaltene Code kann mit Python-Versionen 3.7 oder 3.8 ausgeführt werden. Die Bytecode-Dateien, die gelesen werden können, wurden mit Python-Bytecodes der Versionen 3.7 und 3.8 getestet.
Sie können von PyPI unter dem Namen decompyle3 installieren::
pip install decompyle3
Für die Installation aus dem Quellcode verwendet dieses Projekt setup.py und folgt daher dem standardmäßigen Python-Ablauf::
$ pip install -e . # Einrichtung zur Ausführung aus dem Quellbaum
oder::
$ python setup.py install # möglicherweise sudo erforderlich
Ein GNU-Makefile ist ebenfalls vorhanden, sodass :code:make install (ggf. als root oder mit sudo) die obigen Schritte ausführt.
::
make check
Ein GNU-Makefile wurde hinzugefügt, um die Einrichtung und Ausführung des richtigen Befehls zu erleichtern und Tests von schnell nach langsam auszuführen.
Wenn Sie remake_ installiert haben, können Sie die Liste aller Aufgaben einschließlich Tests über :code:remake --tasks einsehen.
Führen Sie
::
$ decompyle3 compilierte-python-datei-pyc-oder-pyo
Aus. Für Hilfe zur Verwendung:
::
$ decompyle3 -h
Wenn Sie eine Python-Syntaxprüfung auf Korrektheit des Dekompilierungsprozesses wünschen, fügen Sie die Option :code:--syntax-verify hinzu. Da sich die Python-Syntax jedoch ändert, sollten Sie diese Option nur verwenden, wenn der Bytecode zum richtigen Bytecode für den Python-Interpreter gehört, der die Syntax überprüft.
Sie können die Ergebnisse auch mit einem anderen Python-Decompiler wie unpyc37_ kreuzvergleichen. Da diese unterschiedlich arbeiten, sind Fehler hier oft nicht in jenem und umgekehrt.
Es gibt eine interessante Klasse solcher Programme, die eine stärkere Verifizierung ermöglicht: Programme, die sich bei der Ausführung selbst testen. Unsere Testsuite enthält solche Programme.
Und Python enthält eine weitere Reihe solcher Programme: seine eigene Testsuite für die Standardbibliothek. Wir haben Code in :code:test/stdlib, um auch diese Art von Prüfung zu erleichtern.
Wir unterstützen nur veröffentlichte Versionen, keine Kandidatenversionen. Beachten Sie jedoch, dass die Magic einer veröffentlichten Version normalerweise mit der letzten Kandidatenversion vor der Veröffentlichung identisch ist.
Wir behandeln auch keine PJOrion_- oder anderweitig verschleierten Code. Für PJOrion versuchen Sie es mit dem PJOrion Deobfuscator_, um den Bytecode zu entschlüsseln und gültigen Bytecode zu erhalten, bevor Sie dieses Tool verwenden; pydecipher_ könnte dabei helfen.
Dieses Programm kann keine Microsoft Windows EXE-Dateien dekompilieren, die von Py2EXE_ erstellt wurden, obwohl wir den Code wahrscheinlich dekompilieren können, nachdem Sie den Bytecode korrekt extrahiert haben. Pydeinstaller <https://github.com/charles-dyfis-net/pydeinstaller>_ kann beim Entpacken von Pyinstaller-Bundlern helfen.
Die Verarbeitung pathologisch langer Listen von Ausdrücken oder Anweisungen ist langsam. Wir unterstützen weder Cython_ noch MicroPython_, da diese keinen Bytecode verwenden.
Es gibt zahlreiche Fehler bei der Dekompilierung. Das gilt für jeden anderen CPython-Decompiler, den ich gesehen habe, selbst für solche, die für eine bestimmte Version (z. B. 2.4) „perfekt“ sein sollten.
Mit dem Fortschritt von Python wird die Dekompilierung schwieriger, da die Kompilierung ausgefeilter und die Sprache selbst komplexer wird. Ich vermute, dass es weniger Ad-hoc-Versuche wie unpyc37_ geben wird (das auf einem 3.3-Decompiler basiert), einfach weil es schwieriger ist. Die gute Nachricht aus meiner Sicht ist, dass ich verstehe, was nötig ist, um die Probleme robuster zu lösen. Aber bis das Projekt besser finanziert ist, habe ich nicht vor, ernsthafte Anstrengungen zu unternehmen, um Python-Versionen 3.8 oder 3.9 zu unterstützen, einschließlich Fehler, die auftreten könnten. Irgendwann könnte ich mich dafür interessieren.
Sie können leicht Fehler finden, indem Sie die Tests gegen die standardmäßige Testsuite von Python ausführen, die Python selbst prüft. Zu jedem Zeitpunkt gibt es Dutzende bekannter Probleme, die recht gut isoliert sind und gelöst werden könnten, wenn man die Zeit investieren würde. Das Problem ist, dass nicht viele Leute an der Fehlerbehebung arbeiten.
Sie könnten auf einen Fehler stoßen, den Sie melden möchten. Bitte tun Sie das. Seien Sie sich jedoch bewusst, dass es eine Weile dauern kann, bis ich mich darum kümmere. Wenn Sie das Projekt sponsern oder anderweitig unterstützen, priorisiere ich Ihre Probleme gegenüber anderen Aufgaben, die ich stattdessen erledigen könnte. In seltenen Fällen kann ich gegen eine Gebühr eine manuelle Dekompilierung von Bytecode durchführen. Dies ist jedoch teuer und liegt normalerweise über dem, was die meisten bereit sind zu zahlen.
uncompyle- und decompyle-Programme... |buildstatus| image:: https://dl.circleci.com/status-badge/img/gh/rocky/python-decompile3/tree/master.svg?style=svg :target: https://dl.circleci.com/status-badge/redirect/gh/rocky/python-decompile3/tree/master .. |packagestatus| image:: https://repology.org/badge/vertical-allrepos/python:uncompyle6.svg :target: https://repology.org/project/python:decompyle3/versions .. _Cython: https://en.wikipedia.org/wiki/Cython .. _MicroPython: https://micropython.org .. _uncompyle6: https://pypi.python.org/pypi/uncompyle6 .. _python-control-flow: https://github.com/rocky/python-control-flow .. _trepan: https://pypi.python.org/pypi/trepan3k .. _compiler: https://pypi.python.org/pypi/spark_parser .. _HISTORY: https://github.com/rocky/python-decompile3/blob/master/HISTORY.md .. _debuggers: https://pypi.python.org/pypi/trepan3k .. _remake: https://bashdb.sf.net/remake .. _unpyc37: https://github.com/andrew-tavera/unpyc37/ .. _this: https://github.com/rocky/python-decompile3/wiki/Deparsing-technology-and-its-use-in-exact-location-reporting .. |TravisCI| image:: https://travis-ci.org/rocky/python-decompile3.svg :target: https://travis-ci.org/rocky/python-decompile3 .. |CircleCI| image:: https://circleci.com/gh/rocky/python-decompile3.svg?style=svg :target:
.. _PJOrion: http://www.koreanrandom.com/forum/topic/15280-pjorion-%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-%D0%B4%D0%B5%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-%D0%BE%D0%B1%D1%84 .. _Deobfuscator: https://github.com/extremecoders-re/PjOrion-Deobfuscator .. _Py2EXE: https://en.wikipedia.org/wiki/Py2exe .. |Supported Python Versions| image:: https://img.shields.io/pypi/pyversions/decompyle3.svg .. |Latest Version| image:: https://badge.fury.io/py/decompyle3.svg :target: https://badge.fury.io/py/decompyle3 .. |PyPI Installs| image:: https://pepy.tech/badge/decompyle3/month .. _pydecipher: https://github.com/mitre/pydecipher