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, 壳检测, 恶意软件分析, 数据集构建, 无后门, 日志审计, 自动化流水线, 逆向工具