|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 版本上测试通过。
您可以从 PyPI 使用名称 decompyle3 安装::
pip install decompyle3
要从源代码安装,本项目使用 setup.py,因此遵循标准 Python 步骤::
$ pip install -e . # 设置从源码树运行
或者:::
$ python setup.py install # 可能需要 sudo
还提供了 GNU Makefile,因此 :code:make install(可能以 root 或 sudo 身份)将完成上述步骤。
::
make check
已添加一个 GNU makefile 来简化设置和运行正确的命令,并从最快到最慢运行测试。
如果您安装了 remake_,可以通过 :code:remake --tasks 查看所有任务列表(包括测试)。
运行
::
$ decompyle3 编译后的-python-文件-pyc-或-pyo
查看使用帮助:
::
$ decompyle3 -h
如果您希望验证反编译过程的正确性(通过 Python 语法验证),请添加 :code:--syntax-verify 选项。但由于 Python 语法会变化,您应该仅在字节码与将要检查语法的 Python 解释器的字节码版本匹配时使用此选项。
您还可以将结果与另一个 Python 反编译器(如 unpyc37_)进行交叉对比。由于它们的工作方式不同,此处的 bug 通常不会出现在那里,反之亦然。
有一类有趣的程序可用于提供更强的验证:那些运行时会自测的程序。我们的测试套件包含这些程序。
Python 本身也提供了另一组此类程序:其标准库的测试套件。我们在 :code:test/stdlib 中也有代码用于促进这种检查。
我们只支持已发布的版本,不支持候选版本。 但请注意,已发布版本的 magic 数字通常与发布前的最后一个候选版本相同。
我们也不处理 PJOrion_ 或其他混淆代码。对于 PJOrion,请尝试:PJOrion Deobfuscator_ 来还原字节码以获得有效字节码,然后再使用此工具;pydecipher_ 可能对此有所帮助。
此程序无法反编译由 Py2EXE_ 创建的 Microsoft Windows EXE 文件,尽管在正确提取字节码后我们可能能够反编译代码。Pydeinstaller <https://github.com/charles-dyfis-net/pydeinstaller>_ 可能有助于解包 Pyinstaller 打包的程序。
处理过长的表达式或语句列表时速度较慢。我们不处理 Cython_ 或 MicroPython_,因为它们不使用字节码。
反编译中存在大量 bug。对于我遇到过的所有其他 CPython 反编译器也是如此,即使是那些声称在特定版本(如 2.4)上“完美”的反编译器。
随着 Python 的发展,反编译也变得越来越困难,因为编译更加复杂,语言本身也更加复杂。我怀疑像 unpyc37_(基于 3.3 反编译器)这样的临时尝试将会减少,因为这更难做到。至少从我的角度来看,好消息是我理解需要以更健壮的方式解决问题所需的内容。但就目前而言,在项目获得更好资助之前,我不打算认真支持 Python 3.8 或 3.9,包括可能出现的 bug。我想未来某个时候我可能会对此感兴趣。
通过运行 Python 用于自检的标准测试套件,您可以很容易地发现 bug。在任何给定时间,都有数十个已知问题,这些问题相当孤立,只要投入时间就可以解决。问题在于,致力于修复 bug 的人并不多。
您可能会遇到一个 bug,并希望报告它。请报告。但要知道,它可能不会立即引起我的注意。如果您以某种方式赞助或支持该项目,我会优先处理您的问题,而不是我可能正在做的其他事情。在极少情况下,我可以收费进行手动字节码反编译。但这很昂贵,通常超出大多数人的承受范围。
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