DimaReverse/nuitka-static-unpacker

GitHub: DimaReverse/nuitka-static-unpacker

一款针对 Nuitka 编译 Python 二进制文件的静态分析工具,可提取常量、模块、字节码并尝试破解商业版加密,适用于恶意软件分析和逆向工程场景。

Stars: 12 | Forks: 2

``` _ _ _ _ _ _ _ _ | \ | |_ _(_) |_| | ____ _| (_)______ _| |_ ___ _ __ | \| | | | | | __| |/ / _` | | |_ / _` | __/ _ \| '__| | |\ | |_| | | |_| < (_| | | |/ / (_| | || (_) | | |_| \_|\__,_|_|\__|_|\_\__,_|_|_/___\__,_|\__\___/|_| ``` **Nuitka Static Unpacker · Nuitka Commercial “data-hiding” 研究 · 纯 Python** [![Python](https://img.shields.io/badge/python-3.8%2B-blue?style=flat-square&logo=python)](https://python.org) [![License](https://img.shields.io/badge/license-MIT-green?style=flat-square)](LICENSE) [![Lines](https://img.shields.io/badge/lines%20of%20code-10%2C000%2B-orange?style=flat-square)](nuitka_decompiler.py) [![Status](https://img.shields.io/badge/status-active%20research-brightgreen?style=flat-square)]() *分析经 Nuitka 编译的 Python 二进制文件,并提取嵌入的常量/模块/字节码 —— 只需单个脚本。*
## 这是什么? **Nuitka Static Unpacker** 是一款针对使用 [Nuitka](https://nuitka.net/) 编译的 Python 二进制文件的*静态优先*分析工具。它可以从**开源** Nuitka 构建中提取常量、模块结构、代码对象元数据以及 `.pyc` 文件——并且包含一个研究级的实现,可以*尝试*解密由 Nuitka Commercial 的 `data-hiding` 插件使用的常量 blob(如果存在的话)。 它还可以选择通过 DLL 注入切换到**动态模式**,以在运行时捕获实时的 Python 源代码。 ## 使用场景 - **恶意软件分析 / DFIR**:从可疑的经 Nuitka 打包的样本中提取嵌入的 `.pyc`、字符串/常量以及模块结构。 - **授权安全审计**:快速盘点编译二进制文件中附带硬编码的 secrets、URL、token 和配置。 - **CTFs / crackmes**:针对使用 Nuitka 编译的逆向挑战,恢复字节码和高层结构。 - **互操作性研究**:了解 Nuitka 二进制文件如何映射回 Python 的包/模块和代码对象。 - **回归测试 / 构建验证**:比较不同构建之间提取的常量/模块,以检测意外变动。 - **深度逆向前的分流分析**:在打开 IDA/Ghidra 之前,获取快速的静态分析报告(`REPORT.json`,常量转储)。 ## 快速开始 ``` pip install -r requirements.txt python nuitka_decompiler.py --source target.exe ``` 更多示例及完整的标志(flag)参考请见:[`docs/usage.md`](docs/usage.md)。 ## 文档 - [`docs/usage.md`](docs/usage.md) — CLI 标志、示例、疑难解答 - [`docs/architecture.md`](docs/architecture.md) — 流水线及核心组件 - [`docs/nuitka_blob_format.md`](docs/nuitka_blob_format.md) — 常量 blob 格式说明 - [`docs/roadmap.md`](docs/roadmap.md) — 路线图 / 已知缺陷 ## 项目背后的故事 我在 2023 年开始开发这个项目,那是我人生中最艰难的一段时期。 当时,我承受着严重的孤立感,并时常感到不被理解。我被诊断为自闭症谱系障碍,但我并没有得到与我的实际能力相匹配的支持,反而常常被当成一个能力低下的人对待。 我被推入了一些为需求截然不同的人群设计的项目,被置于不属于我的环境中,并且反复被告知——无论是直接还是间接地——我将无法工作、无法独立生活,甚至连考个驾照都不行。 除此之外,我还不得不应对持续的医疗和行政流程(包括支持/监护式的安排),这让我觉得自己的自主权正在日复一日地被剥夺——通过施加压力、附条件的“帮助”,以及在那些让人觉得说“不”根本不是一个真实选项的情境下。 在学校里,情况也没有好转。我经历了严重且持续的欺凌,以至于正常上课变得极其困难。久而久之,我不再经常去学校,也无法以标准方式完成我的最后一年学业。 在校外,我的社交生活几乎消失殆尽。我失去了大部分朋友,长时间独自一人。许多个夜晚都在网上度过,和比我年长的人一起玩游戏,仅仅是因为他们比同龄人更尊重我。 在那段时间里,我拥有的不多——但我有一台电脑和一根网线。 我开始深入研究软件内部的工作原理。最初的好奇最终变成了一种痴迷:阅读 PE 格式、分析编译后的二进制文件、尝试逆向工程,并逐渐理解 Nuitka 是如何将 Python 代码转换成看起来几乎不可读的东西的。 这个项目并非源于某个有条理的计划。 它源于坚持。 每一个微小的进步——多提取一个常量,多理解一种结构,稍微改进一下工具——在其他一切都感觉停滞不前的时刻,都让我觉得这是一种进展。 随着时间的推移,这演变成了一项严肃的、跨越数年的努力。 无数次的重新编写、失败的尝试,以及漫长黑夜中的试错,最终造就了现在的 7.2 版本。 如今,我正处在人生的一个新阶段。 我正在努力完成我的学业,建立独立的生活,并继续在逆向工程和软件安全领域成长——尽管我曾被告知这些是我做不到的事情。 开源这个项目是这一过程的一部分。 这是一种方式,用来分享在困难时期孕育出的一些真实成果,并与那些有兴趣了解软件底层究竟是如何运作的人建立联系。 如果这个项目对你有所帮助,或者你基于它构建了其他东西,这其中的意义可能远超你的想象。 — dimareverse ## 功能特性 | 功能特性 | 开源版本 | 商业版本 | |---|---|---| | Python 版本检测 (PE imports) | ✅ | ✅ | | 常量 blob 提取 | ✅ | ✅ (已解密) | | 模块表解析 | ✅ | ✅ | | 商业版加密绕过 | — | ✅ | | `.pyc` 提取 | ✅ | ✅ | | 代码对象映射 (函数, 参数, 行号) | ✅ | ✅ | | Secrets 扫描器 (密码, 密钥, URLs) | ✅ | ✅ | | 多后端反编译流水线 | ✅ | ✅ | | JSON 报告 | ✅ | ✅ | | 动态 DLL 注入模式 | Windows | Windows | ### 商业版绕过的工作原理 Nuitka Commercial 的 `data-hiding` 插件使用以下方式加密常量 blob: - 使用硬编码在二进制文件中的 256 字节 `_mapping[]` 表进行**替换密码**加密 - 结合运行计数器与 MD5 摘要反馈(`d0`–`d7`,同样为硬编码)进行 **XOR** 运算 - 模块名使用以 `Random(27)` 作为种子的第二个映射表进行混淆——在没有二进制文件的情况下也总是可重构的 该工具会在 PE 的 `.text`/`.rdata` 节中定位这两个表,尝试所有带有 CRC32 验证的有效组合,并在解析前对 blob 进行解密。模块名总是可以独立恢复的。 ## 支持的反编译器后端 该工具按以下顺序尝试,并支持平滑回退: - [`pycdc`](https://github.com/zrax/pycdc) (外部 CLI) - [`pycdas`](https://github.com/zrax/pycdc) (反汇编回退) - [`decompyle3`](https://github.com/rocky/python-decompile3) - [`uncompyle6`](https://github.com/rocky/python-uncompyle6) - [`decompile3`](https://github.com/rocky/decompile3) - [`pylingual`](https://pylingual.io/) (基于 API) - 内置 `dis` 模块 (始终可用) ## 安装 ``` git clone https://github.com//nuitka-decompiler.git cd nuitka-decompiler pip install -r requirements.txt ``` 可选:安装外部反编译器后端以获得最佳效果: ``` pip install uncompyle6 decompyle3 decompile3 # 对于 pycdc/pycdas:从源码构建或从 https://github.com/zrax/pycdc 获取 release ``` 相关工具(嵌入式提取): - [Extreme Coder’s `nuitka-extractor`](https://github.com/extremecoders-re/nuitka-extractor) — 适用于 **onefile** 构建,可在深入分析之前从主可执行文件中提取嵌入的文件(例如 `.exe`、`.pyd`、`.dll`)。 ## 用法 ### 基本静态分析 ``` python nuitka_decompiler.py --source target.exe ``` ### 包含所有库模块(不仅限于主模块) ``` python nuitka_decompiler.py --source target.exe --all ``` ### 自定义输出目录 ``` python nuitka_decompiler.py --source target.exe --output ./unpacked ``` ### 限制为特定模块 ``` python nuitka_decompiler.py --source target.exe --only mypackage,mypackage.utils ``` ### 动态模式:注入到正在运行的进程中 ``` python nuitka_decompiler.py --source target.exe --inject --launch ``` 或者通过 PID 注入: ``` python nuitka_decompiler.py --source target.exe --inject --pid 1234 ``` ## 输出结构 ``` output/ ├── MODULE_NAME/ │ ├── constants.json # All extracted constants │ ├── code_objects.json # Function signatures, arg names, line numbers │ ├── module.pyc # Extracted bytecode │ └── module.py # Decompiled source (if backend available) ├── REPORT.json # Full extraction report ├── secrets.txt # Potential passwords, keys, tokens found └── DYNAMIC_SOURCE/ # (if --inject used) live-captured sources ``` ### 关于提取的 `.pyc` 的重要说明 在许多真实的 Nuitka 构建中,**大多数提取出的 `.pyc` 文件是捆绑的库 / stdlib 模块**,而不是应用程序的“核心”代码。这是正常现象。 提示: - 使用 `REPORT.json` 和每个模块的 `constants.json` / `code_objects.json` 来快速定位应用程序自身的模块。 - 如果您已经知道包名,可以带上 `--only myapp,myapp.*` 运行,以聚焦分析流水线,避免淹没在库的输出中。 ## 架构 代码库是一个约 10,000 行的单个 Python 文件。以下是主要组件的高层级映射: ``` CommercialBypass └── Detects encryption, extracts _mapping[] and d0-d7, decrypts blob NuitkaBlobDecoder └── Parses named module chunks, unpacks Nuitka constant tags NuitkaModuleTableParser └── Scans PE .data/.rdata for module name/flag/index table NuitkaCSourceRebuilder └── Reconstructs C-level structure from parsed data OmniDecompiler └── Orchestrates multi-backend decompilation with fallback chain NuitkaStaticDisassembler └── Walks code object trees, maps function signatures and metadata NuitkaCompactEmitter └── Writes per-module artifacts and structured output StaticalySmartReconstructor └── Higher-level reconstruction pipeline with heuristics NuitkalizatorPro └── Main engine: coordinates all phases, writes REPORT.json DllInjector └── Windows-only: injects hook DLL, waits for dynamic dump ``` 详情请参阅 [`docs/architecture.md`](docs/architecture.md)。 ## 需求 ``` pefile>=2023.2.7 capstone>=5.0.1 # optional: enhanced disassembly xdis>=6.1.1 # optional: cross-version .pyc support ``` 完整列表请参阅 [`requirements.txt`](requirements.txt)。 ## 负责任地使用 本工具旨在用于: - 安全研究与恶意软件分析 - 审计您拥有或已被授权分析的软件 - 编译型 Python 内部机制的教育研究 - CTF 挑战 **请勿在未获授权的情况下将其用于分析软件。** 请尊重许可证及相关法律。 本仓库出于合法的逆向工程、互操作性研究、恶意软件分析和防御性安全工作而发布——**而非**用于盗版、跟踪竞争对手或绕过许可证。如果您不确定您的使用是否被允许,请不要运行它。 ## 贡献 欢迎提交 Issues、Pull Requests 和反馈。请参阅 [`CONTRIBUTING.md`](CONTRIBUTING.md)。 如果您发现安全敏感问题,请先私下报告。请参阅 [`SECURITY.md`](SECURITY.md)。 ## 致谢 - 感谢 **OMΣGΛΛΛ** 分享参考资料和指导意见,帮助我理解了 Nuitka Commercial 的内部机制以供研究和分析。 - 感谢 **[@Siradankullanici](https://github.com/Siradankullanici)** 在最后阶段帮助我完成了这个项目。 ## 许可证 MIT — 见 [`LICENSE`](LICENSE)。 ## 赞助 如果您想支持这个项目: - **BTC**: `bc1qa36fz0726e858l6enj7pt3359j20z98npl3av0` - **LTC**: `ltc1qpszucslm3zyq2caemrrxr6dxx7kh28nx7xrgpc` - **ETH**: `0x8541027655a7DfC7150F9bc9E603300048AeE022`
*在一些艰难的岁月中打造。分享出来,希望能对他人有所帮助。* **⭐ 如果它为您节省了时间,点个 star 对我意义重大。**
标签:DAST, DLL注入, Nuitka, .pyc恢复, Python, Python反编译, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 互操作性研究, 代码解密, 加解密研究, 字节码提取, 常量提取, 恶意软件分析, 数据隐藏, 无后门, 模块提取, 流量审计, 源码恢复, 逆向工具, 逆向工程, 静态分析, 静态脱壳