BaylorSecurityLab/packing_pipeline
GitHub: BaylorSecurityLab/packing_pipeline
自动化构建带标签的良性及加壳 Windows 可执行文件语料库,为壳检测与恶意软件分析研究提供可复现的数据集生成流水线。
Stars: 0 | Forks: 0
# Packer Corpus Orchestrator
**用于生成加壳可执行文件数据集的自动化框架**
本仓库是 **Leal Security Lab** 自动化加壳研究项目的“Orchestrator”。它负责管理良性可执行文件源的获取、加壳工具的配置,以及为恶意软件分析和免杀研究生成自动加壳的产物。
## 📂 仓库结构
本项目使用 **Git Submodules** 将庞大的二进制数据(`inputs`、`tools`、`outputs`)与逻辑代码分离。
```
packer-corpus/
├── benign_sources/ # [Submodule] Input datasets (Linked to 'inputs' repo)
│ └── manifest/ # JSON tracking files (processed_ids.json, x64.json)
├── packers/ # [Submodule] Packer binaries (Linked to 'tools' repo)
│ └── exe32pack/
├── manifest/ # Configuration
│ └── packer_corpus.yaml # Main definition file for packers and test cases
├── utils/ # Python Automation Scripts
│ ├── beningn_source_downloader.py
│ ├── packer_runner.py
│ └── update_manifest.py
├── pyproject.toml # Dependency definitions
└── uv.lock # Lockfile for reproducible builds
```
注意:`packed_sources/`(生成的输出产物)**不会提交到本仓库** —— 它是由 GitHub Actions 运行生成并发布到一个单独的 `outputs` 仓库中的。
# 🚀 前置条件与安装
本框架专为 Windows 环境设计(winget 和特定的 PE 加壳工具需要该环境)。
## 1. 安装 winget (Windows Package Manager)
大多数现代 Windows 10/11 版本都预装了此工具。
- **检查是否已安装:** 打开 PowerShell 并输入 `winget`。
- **如果缺失:** 从 Microsoft Store 安装“App Installer”。
## 2. 安装 uv (Fast Python Package Manager)
我们使用 `uv` 来进行极速的依赖管理和脚本执行。在 PowerShell 中运行以下命令:
```
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
```
## 3. 安装 Go(amber v2.0 需要)
amber v2.0 会调用 `go build` 来编译其 runtime stub。预编译的 amber.exe 产生于 Go modules 之前(其目录树中没有 `go.mod`),因此必须告知 Go 1.21+ 使用传统的 GOPATH 构建模式。
- **推荐:** 通过 Scoop 安装 Go(`scoop install go`)—— runner 会自动检测 `C:\Users\\scoop\shims\go.exe`。
- **手动:** 从 安装 Go,并确保 `go.exe` 位于 `PATH` 中。
runner 还会自动为 `amber_v2.0` 设置 `GO111MODULE=off`,因此您无需更改全局的 Go 配置。
## 4. 克隆仓库
由于此仓库使用了 submodules,您必须使用 `--recurse-submodules` 标志来立即拉取关联的项目。
```
git clone --recurse-submodules https://github.com/BaylorSecurityLab/packing_pipeline.git
cd packing_pipeline
```
**已经克隆但缺少 submodules?** 运行以下命令进行修复:
```
git submodule update --init --recursive
```
## 5. 安装依赖
初始化环境并安装 `pyproject.toml` 中定义的依赖项。
```
uv sync
```
## 6. 安装 WSL2(PEzor 需要)
PEzor 会通过 shell 进入 WSL2 来编译其 C++ stub。其他加壳工具是纯 Windows 二进制文件,不需要 WSL。
```
wsl --install
# 如果出现提示则重启,然后设置默认 distro:
wsl --set-default-version 2
```
在 WSL 中,安装 PEzor 所需的构建工具链(clang、make、git):
```
wsl -d Ubuntu-26.04 -u root -- bash -c 'apt-get update && apt-get install -y build-essential clang git'
```
使用 `wsl --status` 进行验证 —— 您应该会看到 `Default Version: 2`。
# 🛠️ 使用指南
所有脚本都位于 `utils/` 文件夹中。您应该使用 `uv run` 从项目根目录执行它们。
## 阶段 1:获取数据(良性样本源)
此脚本会查询 Winget API,下载不同的可执行文件,从安装程序/压缩包中提取它们,并将其分类到 `benign_sources/x64` 和 `benign_sources/x86` 中。
```
uv run utils/benign_source_downloader.py
```
- **配置:** 调整脚本内部的 `LIMIT` 变量以更改每次运行获取的样本数量。
- **清单:** 它会自动在 `benign_sources/manifest/processed_ids.json` 中跟踪已下载的 ID,以避免重复。
## 阶段 2:运行加壳实验
此脚本会读取 `manifest/packer_corpus.yaml` 并针对您的良性样本源执行定义的测试用例。
### 基本用法:
```
# 语法:uv run utils/packer_runner.py [options]
# 示例:运行 'exe32pack' 测试用例
uv run utils/packer_runner.py exe32pack
```
### 高级用法(大小过滤):
一些共享软件加壳工具(如评估版本)有严格的文件大小限制。您可以自动过滤输入文件:
```
# 仅打包小于 80KB 的文件
uv run utils/packer_runner.py exe32pack --max-size-kb 80
```
### PEzor WSL worker 数量:
PEzor 会进入 WSL2 并为每个任务编译 C++。默认情况下,它会运行 **4 个并发的 `wsl.exe` 调用**;您可以使用 `--wsl-workers N` 来增加该数量(runner 会将 N 限制在每个加壳工具 8 个的上限,并在启动时记录实际生效的值):
```
# 默认值为 4 — 适用于大多数机器
uv run utils/packer_runner.py pezor
# 自定义 worker 数量(上限为 8,受 runner 的 per-packer 上限限制)
uv run utils/packer_runner.py pezor --wsl-workers 6
```
内存预算调度器才是 PEzor 真正的瓶颈 —— worker 数量仅仅是同时启动 `wsl.exe` 的上限。如果您提高了 `--wsl-workers` 并且 WSL 虚拟机出现 OOM,请将其调低。
## 阶段 2b:运行 GUI 加壳工具
一些加壳工具(FSG、Themida、Obsidium、Yoda's Crypter/Protector、PECompact、ZProtect 等)是**纯 GUI** 的,无法通过 `packer_runner.py` 进行脚本化。它们由 `wrapper/` 中的 GUI 自动化封装器(基于 `pyautogui` / `win32gui` 构建)驱动,并由 **`wrapper/gui_runner.py`** 统一调度。
路径是相对于脚本进行解析的,因此请从项目根目录运行这些命令:
```
# 使用 FSG 打包 benign_sources/x86 中的每个兼容文件
uv run python wrapper/gui_runner.py --packer fsg_v1.0
# 首先对单个输入进行 smoke-test(推荐)
uv run python wrapper/gui_runner.py --packer fsg_v1.0 --limit 1
# 打包一个特定文件
uv run python wrapper/gui_runner.py --packer fsg_v1.0 --file "benign_sources\x86\example.exe"
# 按顺序运行每个 GUI packer
uv run python wrapper/gui_runner.py --packer all
```
输出将保存到 `packed_sources/_/`(例如 `packed_sources/fsg_v1.0_1.0/`)。默认情况下,已加壳的输入文件会被跳过。
### 常用选项
| 标志 | 描述 |
|------|-------------|
| `--packer ` | 要运行的 GUI 加壳工具(`fsg_v1.0`、`themida_v3.2.4.34` 等),或使用 `all` 运行全部 |
| `--file ` | 仅加壳单个文件,而不是整个批处理 |
| `--limit N` | 仅处理前 N 个文件 |
| `--dry-run` | 列出将要加壳的文件,但不实际执行加壳 |
| `--no-skip` | 即使输出已存在,也重新加壳文件 |
| `--recursive` | 扫描源目录的子目录 |
| `--exclude ` | 与 `--packer all` 配合使用,跳过这些加壳工具 |
| `--source-dir ` | 输入目录(默认为 `benign_sources/x86`) |
| `--output-dir ` | 覆盖默认的输出目录 |
| `--list-packers` | 列出所有 GUI 加壳工具及其支持的文件类型 |
| `--packer-info ` | 显示某个加壳工具的可配置选项 |
# ⚙️ 配置 (packer_corpus.yaml)
`manifest/packer_corpus.yaml` 文件是实验的真相来源。它定义了:
- **加壳工具定义:** 二进制文件的路径(位于 `packers/` 中)、校验和以及元数据。
- **测试用例:** 要运行的特定命令行参数(例如,“Maximum Compression”、“Re-alignment”)。
### 条目示例:
```
- id: "EXE32PACK_001_DEFAULT"
<<: *exe32pack_v142
command_label: "Default Auto-Compression"
cli_template: "{bin} /M:0 {in} {out}"
```
# ⚠️ 重要注意事项
## 杀毒软件干扰:
`packed_sources/` 目录中将包含混淆过的二进制文件,这些文件会触发 Windows Defender 或其他杀毒解决方案。
**操作:** 在 Windows 安全中心为整个 `packer-corpus` 目录添加文件夹排除项。
## Git Submodules:
如果您需要更新工具或输入文件,请进入它们各自的文件夹(`packers/` 或 `benign_sources/`),拉取更改,然后在主仓库中提交新的引用。
# 👥 维护者
**Leal Security Lab** (Baylor University)
**现任维护者:** Abanisenioluwa Kolawole Orojo
标签:DAST, Python, 壳检测, 恶意软件分析, 数据集构建, 无后门, 日志审计, 自动化流水线, 逆向工具