Alina-sul/malware-detection-ml

GitHub: Alina-sul/malware-detection-ml

这是一个基于内存取证数据的恶意软件检测系统,集成了从特征工程到模型训练及可视化的完整机器学习流程。

Stars: 0 | Forks: 0

# 恶意软件检测软件 使用 CICMalMem2022 内存分析数据集的恶意软件检测系统,包含 MLflow 实验跟踪和 Streamlit UI。 ## 数据集 **来源:** [CICMalMem2022](https://www.unb.ca/cic/datasets/malmem-2022.html) (来自 Kaggle 的混淆变体) 该数据集包含使用 VolMemLyzer(Volatility 封装器)提取的 **58,058 个** 内存转储特征样本: - **29,227 个** 良性样本 - **28,831 个** 跨 3 个家族的恶意软件样本: - **特洛伊木马** (5 种类型): Zeus, Emotet, Refroso, Scar, Reconyc - **间谍软件** (5 种类型): 180Solutions, CWS, Gator, Transponder, TIBS - **勒索软件** (5 种类型): Conti, MAZE, Pysa, Ako, Shade 来自 Volatility 插件的 **55 个数值特征**:pslist, dlllist, handles, ldrmodules, malfind, psxview, modules, svcscan, callbacks。 **标签列:** - `Class` — 二分类标签:`Benign` / `Malware` - `Category` — 源文件名(包含恶意软件家族信息,例如 `Ransomware-Ako-...`) 无空值。数据为 parquet 格式。 ## 项目结构 ``` ├── config/ │ ├── config.yaml # All settings: paths, hyperparams, MLflow │ └── selected_features.yaml # Manually curated feature subset (tracked) ├── data/ │ ├── raw/ # Downloaded dataset (gitignored) │ ├── processed/ # Train/val/test splits (gitignored) │ ├── README.md # Dataset stats, features, split info │ └── GLOSSARY.md # Malware variants & OS concepts ├── docs/ │ ├── AI_USAGE.md # Academic AI usage disclosure │ └── FEATURE_SELECTION.md # Feature selection methods guide & glossary ├── models/ # Trained model artifacts (tracked) │ ├── selected/ # Models trained on the 24-feature subset │ └── all/ # Models trained on all 55 features ├── src/ │ ├── cli/ │ │ ├── commands.py # CLI group root │ │ ├── data_commands.py # split-data, compare-features, dashboard │ │ └── train_commands.py # train command (thin wrapper over runner) │ ├── data/ │ │ ├── loader.py # Dataset loading & family extraction │ │ ├── preprocessing.py # Label encoding, train/val/test split │ │ ├── feature_info.py # Parser for per-feature descriptions │ │ └── feature_engineering/ # Feature selection framework │ │ ├── helpers.py # Shared utilities (ranking builder, feature groups) │ │ ├── scaling.py # Standard / MinMax scaling │ │ ├── ranking.py # 5 ranking methods (variance, correlation, ANOVA, MI, RF) │ │ ├── consensus.py # Borda-count consensus ranking │ │ ├── reporting.py # Plots & report generation │ │ └── selector.py # FeatureSelector class (orchestrator, incl. "manual" mode) │ ├── models/ # Model wrappers — one file per classifier │ │ ├── base.py # BaseModel ABC + SklearnModel + ScaledSklearnModel │ │ ├── dummy.py # DummyClassifier (majority-class baseline) │ │ ├── logistic_regression.py # LR with StandardScaler (linear baseline) │ │ ├── random_forest.py # RandomForestClassifier (tree bagging) │ │ ├── xgboost_model.py # XGBoost via Booster API (stable on macOS ARM) │ │ ├── dnn.py # PyTorch feed-forward net with early stopping │ │ └── dnn_helpers.py # Pure DNN helpers (build_network, train_one_epoch, ...) │ ├── training/ # Orchestrator, metrics, MLflow logging │ │ ├── runner.py # run_training() — shared by CLI and dashboard │ │ ├── trainer.py # train_model / train_all │ │ ├── evaluate.py # compute_metrics (acc, precision, recall, F1, AUC) │ │ └── experiment.py # MLflow logger (log_run, configure_mlflow) │ ├── inference/ # Prediction, VolMemLyzer integration (Phase 3) │ └── utils/ # Config loader, plotting, logging ├── app/ # Streamlit web UI │ ├── streamlit_app.py # Entry point & welcome page │ ├── helpers/ │ │ ├── data.py # Cached loaders (config, dataset, comparison) │ │ ├── charts.py # Plotly chart builders (including TP/FP/TN/FN labelled confusion matrix) │ │ ├── layout.py # Reusable layout components │ │ ├── selection.py # Save/load manually-curated selection YAML │ │ ├── feature_builder.py # Pure helpers for the Feature Builder page │ │ └── training.py # Pure helpers for the Model Dashboard page │ └── pages/ │ ├── 1_Dataset_Overview.py │ ├── 2_Feature_Selection.py # Interactive feature-selection comparison │ ├── 3_Feature_Builder.py # Curate the final feature subset │ ├── 4_Model_Dashboard.py # Compare models + in-page training launcher │ └── 5_Predict.py # Coming in Phase 3 (inference) ├── reports/ │ ├── feature_selection/ # Static feature comparison report (tracked) │ └── training/ # JSON training summaries (tracked) ├── main.py # CLI entry point └── tests/ # pytest suite (199+ tests) ``` ## 设置 ``` python3.12 -m venv .venv source .venv/bin/activate pip install -r requirements.txt ``` ## 使用方法 所有管道操作均通过 CLI 运行: ``` python main.py --help # Show available commands python main.py split-data # Split dataset into train/val/test (60/20/20) python main.py compare-features # Run feature selection comparison & generate static report python main.py train # Train all 5 classifiers on the 24-feature subset python main.py train --features all # ...or on all 55 features python main.py train --model xgboost # ...or just one model python main.py dashboard # Launch the interactive Streamlit dashboard ``` ### 特征选择 本项目中的特征选择分三个阶段进行: **1. 对比(统计,建模前)。** `compare-features` CLI 命令(或仪表盘中的 **Feature Selection** 页面)在模型训练前运行五种方法对所有 55 个特征进行排名: - **Variance Threshold** — 标记近似常量的特征 - **Correlation Analysis** — 识别冗余特征对 - **ANOVA F-test** — 衡量线性类别可分性 - **Mutual Information** — 捕获非线性依赖关系 - **RF Importance** — 来自轻量级随机森林的 Gini 重要性 静态结果保存至 `reports/feature_selection/`(共识排名 CSV、各方法 JSON、相关性热图、排名图、文本摘要)。 **2. 人工整理(提交最终子集)。** 仪表盘中的 **Feature Builder** 页面在一个可编辑的表格中展示所有 55 个特征,并标注了共识排名、方法间分歧、插件组和警告标志。默认为按共识排名的前 25 个特征;可以交互式地添加或移除特征。点击 **Save selection** 会将列表持久化到 `config/selected_features.yaml` —— 这是一个受跟踪的产物,作为最终特征子集的唯一真实来源。 **3. 训练时的应用。** 在 `config/config.yaml` 中设置 `features.selection_method: "manual"`,`FeatureSelector.apply()` 管道会读取 `config/selected_features.yaml`,并在模型看到数据之前将训练 / 验证 / 测试划分过滤到提交的列。 请参阅 [docs/FEATURE_SELECTION.md](docs/FEATURE_SELECTION.md) 以获取关于解读分数、阈值和选择最终特征子集的指南。 ### 模型训练 比较了五个分类器,形成了一个从随机猜测到深度学习的可辩护的复杂度阶梯: 1. **Dummy**(多数类基线)—— 绝对下限;在这个平衡数据集上,任何真实模型都必须击败约 50% 的准确率。 2. **Logistic Regression** —— 线性科学对照;如果树 / 神经模型没有明显击败 LR,则该任务本质上是线性的。 3. **Random Forest** —— 树 bagging(项目规范要求)。 4. **XGBoost** —— 树 boosting(项目规范要求)。 5. **Deep Neural Network** —— PyTorch 前馈网络,带有早停机制(项目规范要求)。 训练由 `python main.py train` 或 Model Dashboard 页面内的 **Train models** 启动器驱动(两者都调用相同的 `src/training/runner.py::run_training` 函数)。每次运行: - 应用配置的特征选择(`selected` → 24 个提交的特征,`all` → 每个特征) - 使用 `config/config.yaml` 中的固定超参数拟合每个请求的模型 - 使用 `accuracy`、`precision`、`recall`、`F1`、`ROC-AUC` 和完整的 2×2 混淆矩阵在验证和测试划分上进行评估(scikit-learn 默认值,请参阅 [scoring API reference](https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-api-overview)) - 将每个训练好的模型保存到 `models/{feature_set}/{name}.{ext}`(`.joblib` / `.pt` / `.json` 取决于底层库) - 使用超参数、指标、混淆矩阵和保存的模型文件将每次运行记录到 MLflow 的 `malware-detection` 实验下 - 将紧凑的 JSON 结果摘要写入 `reports/training/training_summary_{feature_set}.json` 在 Streamlit 应用的 **Model Dashboard** 页面中并排浏览训练好的模型:按指标对比 selected 与 all 特征集的分组条形图、合并的结果表、带有明确 TN/FP/FN/TP 标签的每个模型混淆矩阵,以及一个页内训练启动器,允许您在不离开浏览器的情况下使用不同的模型 / 特征集组合重新训练。 原始 MLflow 运行数据位于 `mlruns/` 下(已 gitignore)。启动 `mlflow ui --backend-store-uri mlruns/` 以直接探索它们。 ## 技术栈 - **ML:** scikit-learn, XGBoost, PyTorch - **实验跟踪:** MLflow - **Web UI:** Streamlit - **内存分析:** Volatility 3, VolMemLyzer
标签:Apex, BSD, CICMalMem2022, JARM, Kubernetes, MLflow, Parquet, Streamlit, 内存分析, 凭据扫描, 分类任务, 勒索软件, 实验跟踪, 数据挖掘, 木马检测, 机器学习, 模型部署, 特征工程, 特征选择, 网络安全, 访问控制, 逆向工具, 间谍软件, 隐私保护