ba1chev/Chimera-47
GitHub: ba1chev/Chimera-47
基于 MAL-API-2019 数据集的 Windows 恶意软件八类家族分类器,以严格对比协议评估 OvO+SVM、多项式 Logistic Regression 和一阶 Markov 链三种模型的表现。
Stars: 0 | Forks: 0
# Chimera-47
基于行为 API 调用追踪构建的八类 Windows 恶意软件家族分类器。该项目在相同的数据流水线上训练并直接对比了三种经典的机器学习模型,因此它同时也是一项小型的实证研究,旨在探讨对于简短且词汇表受限的 API 序列,究竟哪种归纳偏置最有效。
## 数据集 — MAL-API-2019
[MAL-API-2019](https://github.com/ocatak/malware_api_class) 是一个包含 7,107 个 Windows 恶意软件样本的公共语料库,这些样本的动态执行过程在 Cuckoo Sandbox 中被追踪。每个样本都被简化为一个 Windows API 调用序列(整个语料库中约有 278 个唯一 token),并被标记为以下八个家族之一:`Trojan`、`Backdoor`、`Downloader`、`Worms`、`Spyware`、`Adware`、`Dropper`、`Virus`。
该数据集的重点是从*行为*角度研究恶意软件,而非通过静态字节——来自同一家族的二进制文件,即使它们在磁盘上的哈希值不同,也会使用重叠的 API 调用模式。类别分布不平衡(`Trojan` 占据主导,`Adware` 极为罕见),这也是为什么本项目中的每个模型都使用 **macro-F1** 而非准确率进行评估的原因。
## 三种对比模型
这三种模型都使用了完全相同的分层 80/20 划分(种子为 `47`),并在相同的分层 5 折 CV 网格上进行了调优,因此对比是极其公平的。
| 模型 | 对数据的假设 | 最终 macro-F1 |
|---|---|---|
| **One-vs-One + 28 个线性 SVM** | 类别在 TF-IDF 空间中是线性可分的;每一对家族都有各自的决策边界。C(8,2)=28 个二元 SVM 进行投票,并使用间隔进行决胜。 | **0.5879** (C=10) |
| **多项式 Logistic Regression** | 所有 8 个类别的联合 softmax —— 一个包含 8 行权重的单一线性模型,原生优化(无 OvO 支撑结构)。 | **0.5720** (C=10) |
| **一阶 Markov Chain 分类器** | API 调用构成具有局部依赖性的序列;每个家族有一个转移矩阵,通过各类别的对数似然进行分类。采用 Laplace 平滑,并针对未见过的 token 设置了 UNK 索引。 | **0.3669** (α=0.001) |
尽管 Markov 分类器表现不佳,但它仍被保留在对比中——这正是科学发现所在。一旦 TF-IDF 已经为线性模型完成了大部分核心工作,一阶转移就过于局部,无法捕捉到家族级别的结构。
## 流水线工作原理
所有三个模型共享一个完全相同的协议——相同的划分、相同的 CV 折数、相同的评估指标——因此直接对比的数据具有可比性。
```
raw .txt + .csv
│
▼
Dataset (7,107 traces, int labels)
│
▼
Stratified 80/20 split (seed 47)
├─► X_train/y_train (5,685)
└─► X_test/y_test (1,422) ← locked until step 7
│
▼
TF-IDF fit on train, transform test [SVM + MNLR]
raw token sequences [Markov]
│
▼
5-fold stratified CV on train
grid: C ∈ {.01,.1,.5,1,2,5,10} / α ∈ {.001,.01,.1,1,10}
│
▼
Refit best hyperparam on full train
│
▼
Predict on test → macro-F1 + confusion matrix
│
▼
Side-by-side comparison
```
- **准备** → `.data/` 缓存(首次运行时下载并解压)
- **加载** → 通过 `np.unique` 进行标签的整数编码
- **划分** → 分层划分,锁定的测试集
- **向量化** → 针对线性模型使用 TF-IDF(5000 个特征);针对 Markov 使用原始文本
- **CV 网格** → 5 折 × 7 个 C 值 = 每次扫描 35 次 OvO 拟合
- **重拟合 + 评估** → 真实的测试集 macro-F1
## 目录树
```
Chimera-47/
├── notebooks/
│ ├── 00_theoretical.ipynb # Math derivations: SVM dual, OvO voting, MNLR softmax, Markov likelihood
│ └── 01_experiment.ipynb # End-to-end pipeline + 3-model comparison on MAL-API-2019
├── source/
│ ├── data/
│ │ ├── api_fetcher/ # Download + unzip MAL-API-2019 from the upstream repo
│ │ │ ├── api_fetcher.py
│ │ │ ├── http_api_fetcher.py
│ │ │ ├── archive_extractor.py
│ │ │ ├── zip_archive_extractor.py
│ │ │ └── mal_api_2019_provisioner.py
│ │ ├── loader/ # Parse the raw corpus into a Dataset (X, y)
│ │ │ ├── dataset.py
│ │ │ ├── dataset_loader.py
│ │ │ └── mal_api_2019_loader.py
│ │ ├── normalization/ # Feature scaling: standardization and TF-IDF
│ │ │ ├── normalizer.py
│ │ │ ├── standard_normalizer.py
│ │ │ └── tfidf_normalizer.py
│ │ ├── encoders/ # Label encoding: binary and one-hot
│ │ │ ├── encoder.py
│ │ │ ├── binary_label_encoder.py
│ │ │ └── one_hot_encoder.py
│ │ ├── chunking/ # Train/test split + stratified K-fold CV
│ │ │ ├── data_splitter.py
│ │ │ ├── data_split.py
│ │ │ ├── stratified_splitter.py
│ │ │ ├── k_fold_splitter.py
│ │ │ ├── stratified_k_fold_splitter.py
│ │ │ └── fold.py
│ │ ├── data_pipeline.py # Glue: fetch → load → encode → normalize → split
│ │ └── data_pipeline_result.py
│ ├── models/
│ │ ├── learning_model.py # Abstract base class
│ │ ├── supervised_learning_model.py
│ │ ├── support_vector_machine_model/ # Linear SVM (hard + soft margin)
│ │ │ ├── svm_model.py
│ │ │ ├── hard_margin_svm.py
│ │ │ └── soft_margin_svm.py
│ │ ├── one_vs_one_classifier/ # 28-SVM ensemble for 8-class problem
│ │ │ └── one_vs_one_classifier.py
│ │ ├── logistic_regression/ # Multinomial Logistic Regression
│ │ │ └── multinomial_logistic_regression.py
│ │ └── markov_chain/ # Per-class first-order Markov chain
│ │ └── markov_chain_classifier.py
│ └── evaluations/ # Metrics: accuracy, macro P/R/F1, confusion matrix
│ ├── metric.py
│ ├── per_class_metric.py
│ ├── accuracy_metric.py
│ ├── macro_precision_metric.py
│ ├── macro_recall_metric.py
│ ├── macro_f1_metric.py
│ └── confusion_matrix.py
├── tests/ # 115 unit tests (pytest)
├── pytest.ini
├── requirements.txt
└── README.md
```
`.data/` 目录保存已下载的语料库,并被 gitignore 忽略——它会在实验笔记本首次运行时生成。
## 运行方式
```
pip install -r requirements.txt
pytest # run the 115 unit tests
jupyter notebook notebooks/01_experiment.ipynb
```
标签:Apex, NoSQL, 人工智能, 安全规则引擎, 数据科学, 机器学习, 用户模式Hook绕过, 资源验证, 逆向工具