Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
python-uncompyle6 — 跨版本 Python 字节码反编译器 | Kitploit
工具/GitHubGitHub/rocky/python-uncompyle6
静态分析逆向工程调试器二进制分析
GitHubrocky/python-uncompyle6

python-uncompyle6

跨版本 Python 字节码反编译器

查看仓库
4.3k46244个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

|buildstatus| |Pypi Installs| |Latest Version| |Supported Python Versions|

|packagestatus|

.. contents::

uncompyle6

一个原生的 Python 跨版本反编译器和片段反编译器。 它是 decompyle、uncompyle 和 uncompyle2 的继任者。

我在 2024 年亚洲黑帽大会上就此主题发表了演讲 https://youtu.be/H-7ZNrpsV50?si=nOaixgYHr7RbILVS。

简介

uncompyle6 将 Python 字节码翻译回等效的 Python 源代码。它接受从 Python 1.0 到 3.8 版本的字节码,横跨 24 年以上的 Python 发布版本。还包括 Dropbox 的 Python 2.5 字节码以及一些 PyPy 字节码。

为什么选择这个?

好吧,我要说:这个软件非常棒。它不仅仅是普通的黑客式反编译器。利用编译器_ 技术,该程序从指令中创建程序的语法树;上层节点看起来有点像 Python AST 可能产生的结构。因此,我们能够真正分类并理解 Python 字节码各部分的运行情况。

在此基础上,另一个使其与其它 CPython 字节码反编译器不同的特点是,它可以反解析源代码的 片段,并给出特定字节码偏移量周围的源代码信息。

我使用树片段在运行时反解析代码片段,用于我的 trepan_ 调试器_。为此,字节码偏移量被记录并与源代码片段关联。这一目的虽然与最初的意图一致,但又略有不同。更多信息请参见 this_。

给定指令偏移量的 Python 片段反解析在显示堆栈跟踪时很有用,并且可以集成到任何希望在运行时比仅仅显示行号更详细地显示位置的程序中。此代码也可用于源代码信息不存在而只有字节码的情况。我的调试器再次利用了这一特性。

曾经(并且现在仍有)几个 decompyle、uncompyle、uncompyle2、uncompyle3 的分支。它们多数来自同一个代码库,并且(几乎?)所有分支都已不再积极维护。一个分支非常擅长反编译 Python 1.5-2.3,另一个非常擅长 Python 2.7,但也仅此而已。另一个只处理 Python 3.2;还有一个打了补丁,只处理 3.3。你明白了吧。此代码将所有分支整合在一起,并 向前发展。相比那些旧分支,此代码库进行了大量的重构和清理。更多实验性的重构正在 decompyle3_ 中进行。

它在所有 Python 版本的反编译中表现最好。即使有其他项目只提供部分 Python 版本的反编译,我们通常也表现得更好。

我们如何判断?通过获取随该版本 Python 分发的字节码并进行反编译。在成功反编译的程序中,我们可以通过运行该字节码版本的 Python 解释器来确保生成程序在语法上是正确的。最后,在程序自带测试的情况下,我们可以在反编译后的代码上运行这些检查。

我们使用自动化流程来发现错误。在其他反编译器的问题跟踪器中,你会看到我们沿途发现的一些错误。这些错误中很少在其他反编译器中被修复。

要求

git 仓库中的代码可以在 Python 2.4 到最新 Python 版本上运行,但 Python 3.0 到 3.2 除外。如果愿意,欢迎志愿者解决这些不足。

它通过将连续的 Python 版本分隔到不同的 git 分支来实现这一点:

master Python 3.11 及以上(使用 poetry 安装和较新的 Python 惯用语法) python-3.6-to-3.10 Python 3.6 到 3.10(使用较新的 f-strings、更现代的惯用语法和类型注解) python-3.3-to-3.5 Python 3.3 到 3.5(通用 Python 3) python-3.0-to-3.2 Python 3.0 到 3.2(早期 Python 3;3.0 在某些方面更接近 Python 2.6,而非 Python 2.7) python-2.4-to-2.7 Python 2.4 到 2.7(通用 Python 2)

PyPy 从 2.4 版本起也能正常工作。

它可以读取的字节码文件已经在 Python 1.4、2.1-2.7、3.0-3.8 以及更高版本的 PyPy 字节码上进行了测试。

安装

对于较新的 Python 版本(Python 3.11+),您可以使用名称 uncompyle6 从 PyPI 安装:

root@kitploit:~
pip install uncompyle6

对于 Python 3.11 之前的版本,不要通过 PyPI 安装,而是使用 GitHub Releases 部分 中的文件进行安装。较老的 Python 曾经使用 easy_install <https://python101.pythonlibrary.org/chapter29_pip.html#using-easy-install>_。但这在 PyPi 或较新的 Python 版本上已不再支持。反之亦然,poetry 和 pip(较新的方式)在较老的 Python 上也不受支持。

如果您正在运行 uncompyle6 的 Python 版本介于 Python 2.4 到 2.7 之间,请使用名为 uncompyle6_24-x.y.z.tar.gz 的 tarball。

如果您正在运行 uncompyle6 的 Python 版本介于 Python 3.0 到 3.2 之间,请使用名为 uncompyle6_30-x.y.z.tar.gz 的 tarball。

如果您正在运行 uncompyle6 的 Python 版本介于 Python 3.3 到 3.5 之间,请使用名为 uncompyle6_33-x.y.z.tar.gz 的 tarball。

如果您正在运行 uncompyle6 的 Python 版本介于 Python 3.6 到 3.11 之间,请使用名为 uncompyle6_36-x.y.z.tar.gz 的 tarball。

如果您正在运行 uncompyle6 的 Python 版本是 3.11 或更高,请使用名为 uncompyle6-x.y.z.tar.gz 的 tarball。

您也可以尝试具有相同版本标识的 eggs 或 wheels,例如对于 Python 3.9 安装使用 uncompyle6-x.y.z-py39-none-any.whl。但请注意,没有标识的版本意味着 Python 3.11 或更高。

类似地,不包含 _xx 的 tarball 仅适用于 Python 3.11 或更高版本。

使用 Git 分支的理由 ++++++++++++++++++++++++++++++++

目前,要编写一个复杂度如此之高、功能如此之多的 Python 源代码,使其既能运行在 Python 2.7 上,又能运行在 Python 3.13+ 上,是不可能的(即使不是不切实际)。这些语言已经发生了巨大的分化,打包方式也大不相同。事实上,Python 3.11+ 的打包实践与 Python 2.7(以及之前追溯到 Python 2.4)不兼容,后者倾向于使用 "easy_install"。

从源码文本安装 ++++++++++++++++++++++

要从源代码安装,请确保您处于正确的 Git 分支。请参阅要求部分以获取 Git 分支名称。

设置好正确分支后:

root@kitploit:~
$ pip install -e .  # 设置为从源码树运行

还提供了一个 GNU Makefile,因此 :code:make install(可能需要以 root 或 sudo 身份运行)将执行上述步骤。

运行测试

::

make check

已添加一个 GNU makefile 以简化设置和运行正确的命令,并按从最快到最慢的顺序运行测试。

如果您已安装 remake_,则可以通过 :code:remake --tasks 查看所有任务列表,包括测试。

用法

运行

::

$ uncompyle6 已编译的-python-文件-pyc-或-pyo

需要帮助:

::

$ uncompyle6 -h

验证

在较老的 Python 版本中,可以通过反编译字节码,然后使用该字节码版本的 Python 解释器进行编译来验证。完成此操作后,可以将生成的字节码与原始字节码进行比较。然而,随着 Python 代码生成变得更好,这已不再可行。

如果您希望对反编译过程的正确性进行 Python 语法验证,请添加 :code:--syntax-verify 选项。但由于 Python 语法会变化,如果字节码与将要检查语法的 Python 解释器匹配,则应使用此选项。

您还可以将结果与另一版本的 uncompyle6 进行交叉比较,因为随着整体质量的提高,有时在反编译特定字节码时会出现回归。

对于 Python 3.7 和 3.8,decompyle3_ 中的代码通常更好。

或者尝试其他特定的 Python 反编译器,如 uncompyle2_、unpyc37_ 或 pycdc_。由于后两者的工作方式不同,此处的错误通常不在那里,反之亦然。

有一类有趣的程序可以更容易地进行更强的验证:那些运行时自我测试的程序。我们的测试套件包含了这些。

Python 还提供了另一组这样的程序:其标准库的测试套件。我们在 :code:test/stdlib 中有一些代码用于促进此类检查。

已知错误/限制

最大且可能可修复(但困难)的问题与处理控制流有关。(Python 可能拥有我所见过最多样和最离奇的复合语句集;循环和 try 块上有 "else" 子句,我怀疑许多程序员并不知道。)

我所见过的所有 Python 反编译器在反编译 Python 的控制流时都存在问题。在某些情况下,我们可以检测到错误的反编译并进行报告。

Python 2 的 Python 支持相当不错

在 Python 版本的较低端,反编译似乎相当不错,尽管我们没有针对 Python 发布的测试进行自动化测试。此外,我们没有 Python 1.6 和 2.0 的解释器。

在 Python 3 系列中,Python 支持在 3.4 或 3.3 附近最强,然后随着远离这些版本而下降。Python 3.0 很奇怪,在某些方面,它更像是 2.6 而不是 3.1 或 2.7。Python 3.6 通过使用字代码而不是字节码彻底改变了情况。因此,跳转指令参数中的跳转偏移字段减少了。这使得 :code:EXTENDED_ARG 指令在跳转指令中现在更加普遍;以前它们很少见。也许是为了补偿额外的 :code:EXTENDED_ARG 指令,添加了额外的跳转优化。因此,总的来说,像目前这样通过临时手段处理控制流更糟糕。

在 Python 3.5、3.6 和 3.7 之间,:code:MAKE_FUNCTION 和 :code:CALL_FUNCTION 指令发生了重大变化。

Python 3.8 移除了 :code:SETUP_LOOP、:code:SETUP_EXCEPT、:code:BREAK_LOOP 和 :code:CONTINUE_LOOP 指令,这可能会使控制流检测更加困难,缺乏计划中更复杂的控制流分析。我们拭目以待。

目前,并非所有 Python 幻数都受支持。特别是在某些 Python 版本中,尤其是 Python 3.6,幻数在一个版本内多次更改。

我们仅支持已发布版本,不支持候选版本。 但是请注意,已发布版本的幻数通常与发布前的最后一个候选版本的幻数相同。

还有一些自定义的 Python 解释器,特别是 Dropbox,它们使用自己的幻数并加密字节码。除了 Dropbox 旧的 Python 2.5 解释器外,此类情况未得到处理。

我们也不处理 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 用于自我检查的标准测试套件运行测试,您可以轻松地发现错误。在任何给定时间,都有数十个已知问题,这些问题相当孤立,如果投入时间就可以解决。问题在于,没有多少人一直在修复错误。

3.7 和 3.8 中的一些错误只是将 decompyle3 中的修复反向移植的问题。有志愿者吗?

您可能会遇到一个想要报告的错误。请在阅读 如何报告错误 <https://github.com/rocky/python-uncompyle6/blob/master/HOW-TO-REPORT-A-BUG.md>_ 后,并按照 打开 issue 时的说明 <https://github.com/rocky/python-uncompyle6/issues/new?assignees=&labels=&template=bug-report.md>_ 进行操作。

请注意,它可能不会立即引起我的注意。如果您以某种方式赞助或支持该项目,我会将您的 issues 优先于我可能正在做的其他事情。在极少数情况下,我可以收费对手动反编译字节码。但费用很高,通常超出大多数人愿意支付的范围。

另请参阅

  • https://rocky.github.io/blackhat-asia-2024-additional/all-notes-print.html : 如何阅读和编写高级字节码反编译器:uncompyle6 decompyle3 —— 2024 年亚洲黑帽大会(视频 <https://www.youtube.com/watch?v=NA77SFncppE>_)。非常感谢组织者和审稿人让我发言。这种事情鼓励我从事这类项目。
  • https://github.com/rocky/python-decompile3 : 更小、更现代的代码,专注于 3.7 和 3.8。其中的更改将迁移回这里。
  • https://code.google.com/archive/p/unpyc3/ : 仅支持 Python 3.2。上述项目使用了与这里不同的反编译技术。目前未维护。
  • https://github.com/figment/unpyc3/ : 上述项目的分支,但仅支持 Python 3.3。包含一些修复,如支持函数注解。目前未维护。
  • https://github.com/wibiti/uncompyle2 : 仅支持 Python 2.7,但做得相当好。存在一些情况,:code:uncompyle6 的结果不正确,而 :code:uncompyle2 的结果正确,但更常见的是 uncompyle6 正确而 uncompyle2 不正确。由于 :code:uncompyle6 追求准确性而非惯用 Python 风格,:code:uncompyle2 在正确时能产生更自然的代码。目前 :code:uncompyle2 得到轻度维护。有关更多详细信息,请参阅其 issue 跟踪器 <https://github.com/wibiti/uncompyle2/issues>_。

.. _Cython: https://en.wikipedia.org/wiki/Cython .. _trepan: https://pypi.python.org/pypi/trepan3k .. _compiler: https://github.com/rocky/python-uncompyle6/wiki/How-does-this-code-work%3F .. _HISTORY: https://github.com/rocky/python-uncompyle6/blob/master/HISTORY.md .. _report_bug: https://github.com/rocky/python-uncompyle6/blob/master/HOW-TO-REPORT-A-BUG.md .. _debuggers: https://pypi.python.org/pypi/trepan3k .. _remake: https://bashdb.sf.net/remake .. _pycdc: https://github.com/zrax/pycdc .. _decompyle3: https://github.com/rocky/python-decompile3 .. _uncompyle2: https://github.com/wibiti/uncompyle2 .. _unpyc37: https://github.com/andrew-tavera/unpyc37 .. _this: https://github.com/rocky/python-uncompyle6/wiki/Deparsing-technology-and-its-use-in-exact-location-reporting .. |buildstatus| image:: https://circleci.com/gh/rocky/python-uncompyle6.svg?style=svg :target: https://app.circleci.com/pipelines/github/rocky/python-uncompyle6 .. |packagestatus| image:: https://repology.org/badge/vertical-allrepos/python:uncompyle6.svg :target: https://repology.org/project/python:uncompyle6/versions .. _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 .. _pydecipher: .. _Deobfuscator: .. _Py2EXE: .. |Supported Python Versions| image:: .. |Latest Version| image:: :target: .. |Pypi Installs| image::

下载工具
  • 如何报告错误 <https://github.com/rocky/python-uncompyle6/blob/master/HOW-TO-REPORT-A-BUG.md>_
  • HISTORY_ 文件。
  • https://github.com/rocky/python-xdis : 跨 Python 版本反汇编器
  • https://github.com/rocky/python-xasm : 跨 Python 版本汇编器
  • https://github.com/rocky/python-uncompyle6/wiki : 更详细描述代码及其相关方面的 Wiki 文档
  • https://github.com/zrax/pycdc : 此 C++ 代码的 README 声称旨在支持所有 Python 版本。你也可以把弹弓瞄准月亮,但我怀疑你能否击中。此代码在最初开发时的 Python 2.7 和 3.3 版本附近表现最佳。对于当前 Python 3 版本和早期 Python 版本的准确性不足。没有重大努力,它不太可能被支持到当前的 Python 3。详见其 issue 跟踪器 <https://github.com/zrax/pycdc/issues>_。目前轻度维护。
  • https://github.com/mitre/pydecipher
    https://github.com/extremecoders-re/PjOrion-Deobfuscator
    https://en.wikipedia.org/wiki/Py2exe
    https://img.shields.io/pypi/pyversions/uncompyle6.svg
    https://badge.fury.io/py/uncompyle6.svg
    https://badge.fury.io/py/uncompyle6
    https://pepy.tech/badge/uncompyle6/month