
|buildstatus| |Pypi Installs| |Latest Version| |Supported Python Versions|
|packagestatus|
.. contents::
ネイティブなPythonクロスバージョンデコンパイラおよびフラグメントデコンパイラ。uncompyle6_ のリワーク。
これについて BlackHat Asia 2024 <https://youtu.be/H-7ZNrpsV50?si=nOaixgYHr7RbILVS>_ で講演しました。
decompyle3 はPythonバイトコードを同等のPythonソースコードに逆変換します。Pythonバージョン3.7以降のバイトコードを受け付けます。古いPythonバイトコードの逆コンパイルについては、uncompyle6_ を参照してください。
Uncompyle6は素晴らしいですが、制御フローの扱い方に根本的な問題があります。Pythonの初期の頃は最適化がほとんどなく、コードが非常にテンプレート指向で生成されていたため、コードパターンを見るだけで制御フロー構造を把握できました。
年月が経つにつれ、特にジャンプの扱いに関するコード最適化が増え、コードパターンから厳密に制御フローを検出することが難しくなりました。これはPython 2.4(2004年)の頃から気づかれていましたが、難しい問題であるため、これまでのところ満足のいく形で取り組まれていません。
この問題を修正する最初の試みは、命令ストリームにマーカーを追加することでした。最初は COME_FROM 命令で、その後パターン検出に使用されました。
長年にわたり、私はそれをより具体的に拡張し、COME_FROM_LOOP と COME_FROM_WITH が追加されました。また、文法還元時にチェックを追加して、ジャンプが想定される COME_FROM ターゲットと一致するようにしました。
しかし、これらすべては複雑で、堅牢ではなく、逆パースを大幅に遅くし、実際には持続可能ではありません。
このプロジェクトでは、文法の書き換えとリファクタリングを始めました。
しかし、これだけでは十分ではありません。制御フローは、python-control-flow_ プロジェクトが提供する支配関係と逆支配関係を使用して対処する必要があります。
これは私は ようやく 別の非公開プロジェクトでゆっくりと行っています。多くの作業です。スポンサーシップという形での資金提供は大変感謝していますが、努力に見合うものではなく、現在フルタイムの仕事を抱えています。そのため、公開されるまでには時間がかかるかもしれませんし、そもそも公開されないかもしれません。
ここにあるコードはPython 3.7または3.8で実行できます。読み取り可能なバイトコードファイルは、バージョン3.7および3.8のPythonバイトコードでテストされています。
PyPIから名前 decompyle3 を使用してインストールできます::
pip install decompyle3
ソースコードからインストールする場合、このプロジェクトはsetup.pyを使用しているため、標準的なPythonの手順に従います::
$ pip install -e . # set up to run from source tree
or::
$ python setup.py install # may need sudo
GNU Makefileも提供されているので、:code:make install (必要に応じてrootまたはsudoで)で上記の手順を行うことができます。
::
make check
GNU makefileが追加され、適切なコマンドの設定と実行、そしてテストを最速から最遅まで実行するのをスムーズにします。
remake_ がインストールされている場合、:code:remake --tasks ですべてのタスク(テストを含む)の一覧を表示できます。
実行
::
$ decompyle3 compiled-python-file-pyc-or-pyo
使用方法のヘルプ:
::
$ decompyle3 -h
逆コンパイルプロセスの正しさをPython構文で検証したい場合は、:code:--syntax-verify オプションを追加してください。ただし、Pythonの構文は変更されるため、バイトコードが構文をチェックするPythonインタプリタに適したバイトコードである場合にこのオプションを使用してください。
また、unpyc37_ のような別のPython逆コンパイラと結果を相互比較することもできます。動作が異なるため、こちらのバグはあちらにはなく、その逆も同様です。
より強力な検証を提供する、興味深いクラスのプログラムがあります。それは、実行時に自分自身をテストするプログラムです。私たちのテストスイートにはこれらが含まれています。
そしてPythonには、標準ライブラリのテストスイートという、このような別のプログラムセットが付属しています。:code:test/stdlib にもこの種のチェックを容易にするコードがあります。
リリース版のみをサポートしており、候補版はサポートしていません。 ただし、リリース版のマジックナンバーは通常、リリース前の最後の候補版と同じであることに注意してください。
また、PJOrion_ やその他の難読化コードは扱いません。PJOrion の場合は、このツールを試す前に PJOrion Deobfuscator_ を試してバイトコードを復元し、有効なバイトコードを取得してください。pydecipher_ が役立つかもしれません。
このプログラムは Py2EXE_ で作成されたMicrosoft Windows EXEファイルを逆コンパイルできませんが、バイトコードを適切に抽出した後であればコードを逆コンパイルできる可能性があります。Pydeinstaller <https://github.com/charles-dyfis-net/pydeinstaller>_ はPyinstallerバンドラーのアンパックに役立つかもしれません。
非常に長い式や文のリストの処理は遅くなります。バイトコードを使用しない Cython_ や MicroPython_ は扱いません。
逆コンパイルには多数のバグがあります。これは、私が遭遇した他のすべてのCPython逆コンパイラにも当てはまります。2.4のような特定のバージョンで「完璧」だと主張していたものでさえそうです。
Pythonが進化するにつれて、コンパイルがより洗練され、言語自体もより洗練されるため、逆コンパイルも難しくなります。unpyc37_(3.3用逆コンパイラに基づく)のようなアドホックな試みは、その難しさゆえに少なくなるだろうと推測しています。少なくとも私の立場から見た良いニュースは、より堅牢な方法で問題に対処するために必要なことを理解していると思うことです。しかし現時点では、プロジェクトへの資金がもっと増えるまで、Python 3.8や3.9をサポートするための真剣な努力をするつもりはありません。将来的には興味を持つかもしれません。
Pythonが自己チェックに使用する標準テストスイートに対してテストを実行することで、簡単にバグを見つけることができます。どの時点でも、かなり孤立した既知の問題が何十個もあり、時間をかければ解決できる可能性があります。問題は、バグ修正に取り組んでいる人がそれほど多くないことです。
バグを見つけたら報告してください。ただし、しばらく私の注意を引かない可能性があることを認識しておいてください。何らかの形でプロジェクトをスポンサーまたはサポートしていただける場合、他の作業のキューよりも優先してあなたのIssueを処理します。まれに、有料で手動によるバイトコードの逆コンパイルを行うこともできます。ただし、これは高額で、通常ほとんどの人が支払いたいと思う金額を超えています。
uncompyle および decompyle プログラムと同じ問題に悩まされています。.. |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