DimaReverse/nuitka-static-unpacker
GitHub: DimaReverse/nuitka-static-unpacker
一款针对 Nuitka 编译 Python 二进制文件的静态分析工具,可提取常量、模块、字节码并尝试破解商业版加密,适用于恶意软件分析和逆向工程场景。
Stars: 12 | Forks: 2
```
_ _ _ _ _ _ _ _
| \ | |_ _(_) |_| | ____ _| (_)______ _| |_ ___ _ __
| \| | | | | | __| |/ / _` | | |_ / _` | __/ _ \| '__|
| |\ | |_| | | |_| < (_| | | |/ / (_| | || (_) | |
|_| \_|\__,_|_|\__|_|\_\__,_|_|_/___\__,_|\__\___/|_|
```
**Nuitka Static Unpacker · Nuitka Commercial “data-hiding” 研究 · 纯 Python**
[](https://python.org)
[](LICENSE)
[](nuitka_decompiler.py)
[]()
*分析经 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/
*在一些艰难的岁月中打造。分享出来,希望能对他人有所帮助。*
**⭐ 如果它为您节省了时间,点个 star 对我意义重大。**
标签:DAST, DLL注入, Nuitka, .pyc恢复, Python, Python反编译, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 互操作性研究, 代码解密, 加解密研究, 字节码提取, 常量提取, 恶意软件分析, 数据隐藏, 无后门, 模块提取, 流量审计, 源码恢复, 逆向工具, 逆向工程, 静态分析, 静态脱壳