anpa1200/Unpacker
GitHub: anpa1200/Unpacker
面向恶意软件分析人员的模块化壳检测与脱包工作流工具,支持 UPX、ASPack、Themida、VMProtect 的自动化检测、脱壳与验证。
Stars: 20 | Forks: 6
# 解包器
面向恶意软件分析人员的壳检测与脱壳工作流:检测 UPX、ASPack、Themida、VMProtect 及相关加壳模式,以便进行静态分析时能触及真实的代码和字符串。
## CTI 用途
当样本疑似被加壳时,请在分析字符串、导入表、YARA 规则或进行深度逆向工程之前使用此工具。该工具的输出可用于恶意软件家族分诊、检测工程和分析人员备忘,但在得出结论前必须经过验证。
## 防御者输出
| 输出 | 用途 |
|---|---|
| 壳检测 | 分诊与分析人员分配 |
| 脱壳样本 | 后续静态分析 |
| 熵值/验证备注 | 置信度审查 |
| 多层工作流 | 加壳恶意软件处理 |
| 集成路径 | 供给 String Analyzer, PE Import Analyzer, AIDebug |
**模块化恶意软件壳检测与脱壳 (UPX、ASPack、Themida、VMProtect)。支持 PE 和 ELF。一条命令:检测 → 脱壳 → 验证。**
[](https://www.python.org/)
[](https://github.com/anpa1200/Unpacker/actions/workflows/tests.yml)
[](https://opensource.org/licenses/MIT)
[](https://github.com/anpa1200/Unpacker)
## 功能说明
加壳的恶意软件通过压缩或加密隐藏了真实代码。Unpacker 能够:
1. 通过节区名称、熵值、启发式扫描以及可选的路径/内容提示,**检测**加壳工具 (PE 和 ELF 格式)。
2. **调度**到匹配的脱壳器 (UPX 原生支持;32 位 ASPack/Themida/VMProtect 通过 [Unipacker](https://github.com/unipacker/unipacker),64 位 VMProtect 则通过 [Qiling](https://github.com/qilingframework/qiling))。
3. **输出**脱壳后的文件,您可以使用 [String Analyzer](https://github.com/anpa1200/String-Analyzer) 和 [Basic File Information Gathering Script](https://github.com/anpa1200/Basic-File-Information-Gathering-Script) 等工具进行分析或验证。
一条命令,一个流水线;支持**多层**脱壳 (例如多层 VMProtect 嵌套)。
## 特性
| 特性 | 描述 |
|--------|-------------|
| **多种检测方法** | 节区名称 (UPX0/UPX1, .aspack, .vmp0, Themida, …)、熵值、启发式算法;支持 PE + ELF。 |
| **可插拔的脱壳器** | UPX (原生),ASPack/Themida/VMProtect (32 位使用 Unipacker;64位 VMProtect 使用 Qiling),MPRESS/通用 (桩)。 |
| **路径/内容提示** | 位于 `.../vmprotect/` 或 `.../themida/` 路径下的样本,即使节区名称不匹配,也会分配到正确的脱壳器。 |
| **多层支持** | 重新检测并脱壳,最多支持 N 层 (可配置)。 |
| **易于验证** | 输出为静态转储;通过熵值/大小/字符串证明脱壳成功 (参见下方的[实际案例](#real-life-example-with-proof))。 |
## 代码库
- **GitHub:** [https://github.com/anpa1200/Unpacker](https://github.com/anpa1200/Unpacker)
- **克隆:**
git clone https://github.com/anpa1200/Unpacker.git
cd Unpacker
## 安装
**前置要求:** Python 3.10+,为获得完整的脱壳覆盖,可选安装系统级 UPX 和 Unipacker。
```
cd Unpacker
pip install -e .
# 或者:pip install -r requirements.txt
```
- **UPX (用于 UPX 脱壳):** 安装系统 UPX,例如执行 `apt install upx-ucl` 或访问 [upx.github.io](https://upx.github.io/)。
- **ASPack / Themida / VMProtect (32 位):** 执行 `pip install unipacker`。在 Python 3.12+ 环境下,您可能需要执行 `pip install 'setuptools<70'` 以支持 `pkg_resources`。
- **VMProtect (64 位):** 执行 `pip install qiling`,并将 **QILING_ROOTFS** 设置为包含 Windows x64 rootfs 的目录 (例如包含 DLL 文件的 `x8664_windows` 目录)。详见 [Qiling rootfs](https://github.com/qilingframework/rootfs)。可选:执行 `pip install -e ".[emulation]"` 以安装 Qiling。
## 使用方法
```
# 解压一个样本(默认输出到 ./unpacked 目录下)
python scripts/run_unpacker.py /path/to/sample.exe -o ./unpacked
# 带 timeout(推荐用于 Themida/VMProtect)
python scripts/run_unpacker.py /path/to/sample.exe -o ./unpacked --timeout 180
# 从 PyPI:
pip install 1200km-unpacker
# 安装 PyPI 或执行 pip install -e . 之后,你可以使用:
unpacker /path/to/sample.exe -o ./unpacked
```
**选项:** `--max-layers`, `--confidence`, `--timeout`。
**输出示例:**
```
Detected: aspack (confidence=0.9, method=sections)
Layer 1: packer=aspack -> ok
Final output: /path/to/unpacked/aspack/NotePad_aspack.unpacked.aspack.exe
```
## 脱壳技术 (工具工作原理)
工具会根据壳和二进制格式使用不同的**脱壳技术**。
### 检测 (脱壳前)
- **节区名称** — 将已知的节区名称模式映射到对应的加壳工具 (例如 `UPX0`/`UPX1` → UPX,`.aspack`/`.adata` → ASPack,`.vmp0`/`.vmp1` → VMProtect,`Themida` → Themida)。不区分大小写。
- **文件内容回退** — 如果节区名称不匹配,系统会扫描文件中与加壳相关的字符串 (如 `ASPack`, `VMProtect`, `.vmp0`) 以便分配加壳工具。
- **路径提示** — 如果样本路径包含 `vmprotect` 或 `themida`,将优先匹配该加壳工具,确保已知文件夹下的样本使用正确的脱壳器。
- **熵值** — 较高的节区熵值表明存在加壳/压缩数据;这可能会产生通用的“已加壳”或“未知”结果。
- **启发式扫描** — 例如入口点位于最后一个节区、导入表极少等情况,通常会被标记为“未知”。
检测支持 **PE 和 ELF**;系统会根据置信度选择最佳匹配的加壳工具,并运行相应的脱壳器。
### 根据技术进行脱壳
| 技术 | 适用对象 | 工作原理 |
|-----------|----------|--------------|
| **原生解压缩** | **UPX** (PE 和 ELF) | 调用系统命令 `upx -d`。该壳格式是公开的;UPX 会原地解码并写入解压后的映像。无需模拟。 |
| **模拟 + 转储 (Unipacker)** | **ASPack, Themida, VMProtect** (仅限 PE32) | 通过 [Unipacker](https://github.com/unipacker/unipacker) 在 [Unicorn](https://www.unicorn-engine.org/) 中加载 PE。从**入口点**开始模拟;引擎持续运行,直到检测到“脱壳完成”的条件 (例如节区跳转、写入+执行区域,或特定壳的逻辑)。然后它将进程内存 (映像基址 + 大小) **转储**到新的 PE 文件中。Unipacker 能识别 ASPack;对于 Themida/VMProtect,它使用**通用的“未知”策略** (模拟直到触发启发式条件,然后转储)。本工具对 Unipacker 应用了一些**补丁**:安全的逐页内存读取 (避免在未映射区域崩溃) 和稳健的转储机制 (如果导入表修复失败,则将 IAT 置零并依然写入转储文件)。 |
| **模拟 + 转储 (Qiling)** | **VMProtect** (仅限 PE32+ / 64位) | 当样本为 64 位时使用 (Unipacker 仅支持 32 位)。使用 Windows **rootfs** (模拟的 DLL) 在 [Qiling](https://github.com/qilingframework/qiling) 中加载 PE。在指定的**超时时间**内运行模拟。运行结束 (或超时) 后,从模拟内存中读取**已加载的映像** (基址 + `SizeOfImage`) 并写入磁盘。不包含特定壳的逻辑——采用通用的“运行后转储”策略,因此对于具有强保护措施的加壳工具,可能只能部分脱壳。 |
| **桩** | **MPRESS, 通用** | 检测可能会识别出该壳,但脱壳模块尚未实现;流水线将返回错误或“通用脱壳桩”。 |
#### 1. 原生解压缩 (UPX)
该壳格式是公开且可逆的。UPX 将压缩数据 (例如 NRV2B 或 LZMA) 存储在已知的节区 (`UPX0`, `UPX1`) 中;解压算法是固定的。该工具调用系统命令 **`upx -d`**:UPX 读取文件,进行解压,并写入一个恢复了原始代码和布局的新 PE/ELF 文件。不会执行加壳的二进制文件;适用于 PE 和 ELF 格式。
#### 2. 模拟 + 转储 — Unipacker (仅限 ASPack, Themida, VMProtect, PE32)
许多加壳工具会在入口点放置一个 **stub**,用于分配内存、将真实代码解压/解密到其中,然后跳转到该处 (即**原入口点**,OEP)。我们在 CPU 模拟器中**运行**该 stub,直到真实代码加载到内存中,然后将该内存**转储**到文件。
- **模拟:** [Unipacker](https://github.com/unipacker/unipacker) 在 [Unicorn](https://www.unicorn-engine.org/) 中加载 PE。从 PE 入口点 (加壳的 stub) 开始执行。Windows API (例如 `VirtualAlloc`, `VirtualProtect`) 会被打桩,以便 stub 能够分配内存并运行。当 stub 解压代码并跳转到解压后的代码时,我们会检测到这一行为并进行转储。
- **转储时机:** (1) **节区跳转** — 执行跳转到了在运行时写入的另一个节区。(2) **写入+执行 (W+X)** — 在模拟期间写入的区域变为可执行,并且执行流程进入了该区域。(3) **特定壳逻辑** — 对于 ASPack,Unipacker 具有内置逻辑;对于 Themida/VMProtect,则使用通用启发式算法。
- **转储:** 从映像基址开始读取大小为 SizeOfImage (或分配范围) 的模拟内存,构建 PE 文件,并修复导入表 (IAT)。**本仓库的补丁:** (1) **安全读取** — 逐页读取内存,未映射的页面用零填充,确保转储过程顺利完成。(2) **稳健转储** — 如果修复 IAT 时抛出异常,则将导入目录置零并依然写入转储文件。
- **仅限 32 位的原因:** Unipacker 的加载器仅适用于 PE32;对于 PE32+ (64位) 会失败,因此我们使用 Qiling 处理 64 位的 VMProtect。
#### 3. 模拟 + 转储 — Qiling (仅限 64 位 VMProtect)
[Qiling](https://github.com/qilingframework/qiling) 是一个全系统模拟器:它加载 PE 文件和 Windows **rootfs** (DLL 文件)。我们运行 **`ql.run(timeout=...)`**,没有针对特定壳的“脱壳完成”启发式判断——我们完全依赖**时间**。运行结束或超时后,我们从映像基址读取大小为 SizeOfImage 的内存并将其写入磁盘。结果是一个原始的内存快照 (此路径下 IAT 未修复)。强保护壳可能只能在超时时间内部分脱壳。
#### 4. 桩 (MPRESS, 通用)
未实现相应的脱壳器;流水线将返回明确的错误。
### 总结
- **UPX:** 直接解压;快速且确定。
- **ASPack / Themida / VMProtect (32 位):** 通过 Unipacker 在 Unicorn 中进行模拟;在发生节区跳转 / W+X 或触发特定壳逻辑时转储;包含用于安全读取和稳健转储的补丁。
- **VMProtect (64 位):** 在 Qiling 中使用 rootfs 进行模拟;超时运行后转储;不修复 IAT。
- **多层:** 重新检测并重复执行,最多达到 `max_layers` (默认为 5)。
### 在模拟器中运行真实 (加壳) 代码安全吗?
**简短回答:** 加壳代码是在**模拟器内部**运行的,而不是直接在您的 CPU 上原生执行,因此它比在宿主机上直接执行样本要安全得多——但您仍应该在隔离环境 (例如虚拟机或专用的分析机器) 中运行该工具。
**为什么模拟相对安全:**
- **Unipacker (Unicorn):** 样本的指令由模拟器**解释执行**。它们不会在宿主机处理器上运行。当代码“调用” Windows API (例如 `VirtualAlloc`, `CreateFileA`) 时,运行的是 Unipacker 的 **stub**,而不是真实的操作系统:它们通常只更新模拟器的内部状态 (例如分配模拟内存、返回一个伪造的句柄)。因此,加壳代码无法直接访问您真实的文件系统、网络或硬件,除非某个 stub 明确转发给宿主机——而且在 Unipacker 的设计中,stub 的目的是模拟行为,而不是执行真实的危险操作。
- **Qiling:** 原理相同 (模拟的 CPU + 模拟的 API),但 Qiling 是一个全系统模拟器,可以配置为将宿主机路径映射到模拟环境中。如果您将宿主机的目录映射到 rootfs 或模拟的“C:\”中,写入操作可能会影响宿主机。**最佳实践:** 使用独立的 rootfs (例如仅包含 DLL 和最基本的布局),并且不要映射敏感的宿主目录。在虚拟机中运行,这样即使配置错误,其影响也是有限的。
**建议:**
- 将所有样本视为具有敌意。在**虚拟机**、**沙箱**或**专用分析机器**中运行脱壳工具,而不是在生产环境或个人系统中运行。
- 不要将模拟视为完美的沙箱:理论上,stub 的错误或设计选择仍可能暴露宿主机。进行隔离 (VM + 不为 Qiling 挂载敏感目录) 可以将风险保持在较低水平。
- **UPX** 根本不会运行样本;它只进行解压。因此,从“执行代码”的角度来看,UPX 脱壳是安全的 (除了需要信任 `upx` 二进制文件和解压后的输出之外)。
## 包含验证的实际案例
使用 **ASPack 加壳**的样本 (`NotePad_aspack.exe`),我们通过比较脱壳前后的**熵值**和**文件大小**来证明脱壳是正确的。
### 1. 运行脱壳工具
```
python scripts/run_unpacker.py samples_by_packer/aspack/NotePad_aspack.exe -o unpacked/aspack
```
结果:`unpacked/aspack/NotePad_aspack.unpacked.aspack.exe`。
### 2. 证明:熵值与大小
| 指标 | 加壳 (`NotePad_aspack.exe`) | 脱壳 (`NotePad_aspack.unpacked.aspack.exe`) |
|--------|-------------------------------|-------------------------------------------------|
| **文件大小** | 33,792 bytes (33 KB) | 180,224 bytes (176 KB) |
| **熵值** | 6.25 | 2.38 |
脱壳后的文件**更大** (去除了压缩) 并且具有**更低的熵值** (显示的是真实的代码/数据,而不是压缩后的数据块)。这正是成功脱壳的预期特征。
### 3. 如何复现该验证
**String Analyzer** (分类的字符串 + 熵值):
```
# 来自 String Analyzer 项目
string-analyzer /path/to/NotePad_aspack.exe -o packed_report.txt
string-analyzer /path/to/NotePad_aspack.unpacked.aspack.exe -o unpacked_report.txt
```
对比报告:加壳文件显示 **File Entropy: 6.25**,脱壳文件显示 **File Entropy: 2.38**。
**Basic File Information Gathering Script** (哈希、大小、熵值):
```
# 来自 Basic-File-Information-Gathering-Script 项目
python3 fileinfo.py /path/to/NotePad_aspack.exe
python3 fileinfo.py /path/to/NotePad_aspack.unpacked.aspack.exe
```
您可以获取两者的 `file_size` 和 `entropy`;脱壳后的文件体积更大且熵值更低。使用 `--full` 或 `--json`,您可以对比节区、导入表和熵值块。
这些工具都是**只读**的 (不会执行代码);请参阅[文章](#article--validation-guide)了解完整的验证工作流及其 Medium 指南链接。
## 项目布局
```
Unpacker/
├── README.md # This file
├── PROJECT_SCENARIO.md # Research and design
├── pyproject.toml
├── requirements.txt
├── config/config.yaml # Detector and orchestrator settings
├── data/signatures/ # Optional signature DB (empty by default)
├── docs/
│ └── MEDIUM_ARTICLE_UNPACKER_GUIDE.md # Full guide (Medium-style)
├── scripts/
│ ├── run_unpacker.py # Main CLI
│ ├── step0_find_and_download_samples.py # Malware Bazaar download by packer
│ └── verify_unpacking.py # Check unpacked format/size/detection
├── src/unpacker/
│ ├── orchestrator.py # detect → unpack → optional rebuild
│ ├── detector/ # Signatures, sections, entropy, heuristics
│ ├── unpackers/ # UPX, ASPack, Themida, VMProtect, MPRESS, generic
│ └── pe_rebuilder/ # Optional IAT fix (stub)
└── tests/
```
样本和脱壳后的输出 (`samples_by_packer/`, `unpacked/`) **不包含**在仓库中;请使用您自己的样本或下载脚本 (见下文)。
## 获取样本
使用提供的脚本,通过加壳工具标签从 [Malware Bazaar](https://bazaar.abuse.ch/) 获取样本 (需要 API key):
```
export MALWARE_BAZAAR_API_KEY='your-key'
python scripts/step0_find_and_download_samples.py
```
样本保存在 `samples_by_packer//` 目录下,命名格式类似于 `{name}_{packer}.exe` 或 `{hash}_{packer}.bin`。
## 验证与校验
- **手动验证:** 使用 [String Analyzer](https://medium.com/@1200km/a-practical-guide-to-string-analyzer-extract-and-analyze-strings-from-binaries-without-the-875dc74e4868) (熵值、字符串分类) 和 [Basic File Information Gathering Script](https://medium.com/@1200km/one-tool-to-rule-them-all-file-metadata-static-analysis-for-malware-analysts-and-soc-teams-c6dba1f5b7de) (大小、熵值、PE 元数据) 对比加壳前后的样本。
- **内置验证:** 对于 UPX 的输出,可运行 `python scripts/verify_unpacking.py` 来检查格式、体积增长情况,并确保脱壳后的文件不再被检测为加壳状态。
## 文章与验证指南
**📖 [Unpacker:模块化恶意软件加壳检测与脱壳实用指南](https://medium.com/@1200km/unpacker-a-practical-guide-to-modular-malware-packer-detection-and-unpacking-cf8ba924f25b)** — 发布于 Medium。
相同的内容也以 Markdown 格式存在于仓库的 **[docs/MEDIUM_ARTICLE_UNPACKER_GUIDE.md](docs/MEDIUM_ARTICLE_UNPACKER_GUIDE.md)** 中。文章包含:
- Git 仓库以及如何从 GitHub 克隆/安装
- 每个脱壳器 (UPX, ASPack, MPRESS, Themida, VMProtect, 通用脱壳) 的真实使用方法
- 使用 String Analyzer 和 fileinfo 进行验证,包含**真实输出** (熵值 6.25 → 2.38,体积 33 KB → 180 KB)
- 端到端工作流及局限性
## 状态
| 组件 | 状态 |
|-----------|--------|
| 协调器、检测器 (节区、熵值、启发式算法)、调度器 | 完成 |
| UPX (原生) | 完成 |
| ASPack, Themida, VMProtect (Unipacker / Qiling) | 完成 (32 位 PE32 通过 Unipacker;设置了 rootfs 的 64 位 PE32+ VMProtect 通过 Qiling) |
| MPRESS, 通用脱壳器 | 桩 (仅检测 / 报错) |
| PE 重建器 (IAT) | 桩 |
| 特征库 | 空 (可选) |
## 许可证
MIT 许可证。详见 [LICENSE](LICENSE)。
## 相关代码库与文章
| 资源 | 链接 |
|----------|------|
| **Unpacker (本仓库)** | [GitHub](https://github.com/anpa1200/Unpacker) · [Medium: Unpacker 指南](https://medium.com/@1200km/unpacker-a-practical-guide-to-modular-malware-packer-detection-and-unpacking-cf8ba924f25b) |
| **Static-malware-Analysis-Orchestrator** | [GitHub](https://github.com/anpa1200/Static-malware-Analysis-Orchestrator) — 在一个流水线中运行分诊、字符串分析、PE 导入表分析和 Unpacker · [Medium: 完整工作流](https://medium.com/@1200km/basic-static-malware-analysis-from-triage-to-unpacking-explained-and-automated-9442ef3b11b8) |
| **PE-Import-Analyzer** | [GitHub](https://github.com/anpa1200/PE-Import-Analyzer) · [Medium: PE Import Analyzer 指南](https://medium.com/@1200km/pe-import-analyzer-a-practical-guide-for-malware-analysts-and-reverse-engineers-29b8b98aeaf3) |
| **String-Analyzer** | [GitHub](https://github.com/anpa1200/String-Analyzer-) · [Medium: String Analyzer 指南](https://medium.com/@1200km/a-practical-guide-to-string-analyzer-extract-and-analyze-strings-from-binaries-without-the-875dc74e4868) |
| **Basic-File-Information-Gathering-Script** | [GitHub](https://github.com/anpa1200/Basic-File-Information-Gathering-Script) · [Medium: 文件元数据与静态分析](https://medium.com/@1200km/one-tool-to-rule-them-all-file-metadata-static-analysis-for-malware-analysts-and-soc-teams-c6dba1f5b7de) |
| **PROJECT_SCENARIO.md** | 研究、设计以及指向 PackHero, PISEP, Qiling, CAPE, PE-sieve, packing-box 等项目的链接。 |
| **作者** | [Medium @1200km](https://medium.com/@1200km) |
## 1200km 生态系统
本项目是 1200km 安全研究生态系统的一部分。使用 [AdversaryGraph](https://1200km.com/adversarygraph/) 进行 CTI 到检测的工作流转换、ATT&CK/ATLAS 映射、行为者关联性分析、IOC 富集以及面向分析人员的报告生成。
- [AdversaryGraph 项目主页](https://1200km.com/adversarygraph/)
- [AdversaryGraph 文档](https://1200km.com/adversarygraph-docs/)
- [在线 ATT&CK/ATLAS 工作区](https://1200km.com/threat-matrix/)
- [1200km 安全研究生态系统](https://1200km.com/)
标签:DAST, Python, 云资产清单, 恶意软件分析, 无后门, 端点检测与响应, 脱壳工具, 逆向工具, 逆向工程