Hiroki-Tomimatsu/mlscan
GitHub: Hiroki-Tomimatsu/mlscan
一个基于 EMBER2024 模型的单文件本地静态 ML 恶意软件扫描与解释工具。
Stars: 0 | Forks: 0
# mlscan
**一个用于 EMBER2024 静态 ML 恶意软件扫描器的单文件 CLI 前端。**
`mlscan.py` 将 EMBER2024 研究套件——`thrember` 特征提取器以及随 KDD 2025 论文发布的 14 个预训练 LightGBM 模型——转化为一个可用的命令行工具。一条命令即可提供恶意/正常判决、在 2,538 个类别中的家族归属、多标签属性分析(行为 / 打包器 / 漏洞 / APT 组 / 文件属性)以及基于 SHAP 的可解释性,输出结构化 JSON 以供下游流水线使用。
无需服务器。无需云端。无需样本外传。所有内容均在本地针对公共 EMBER2024 模型运行。
## 存在的原因
EMBER2024 提供了两样东西:`thrember` 特征提取器和 14 个 `.model` 文件。它**并未**提供大多数人真正需要的粘合逻辑:
- 加载全部 14 个 LightGBM 模型,
- 将 2,568 维特征向量输入每个模型,
- 集成投票生成判决,
- 格式化 Top-N 家族预测,
- 融合五个一对一多标签分类头,
- 计算并分类 SHAP 贡献,
- 同时将上述内容渲染为人类可读的终端输出**和**机器可读的 JSON,
- 在不崩溃的前提下处理 Windows `cp932` 控制台编码。
研究者发布模型后就停止了。实践者最终只能编写私有的一次性脚本。`mlscan.py` 就是缺失的中间层——单个文件、最小依赖、可复现输出。
## 功能特性
### 四个分析层级,按需开启
| 层级 | 标志 | 功能说明 |
|------|------|----------|
| **1. 判决** | *(始终启用)* | 运行 Win64 / PE / 通用恶意-正常分类头。平均得分,与 0.5 阈值比较,并报告集成投票(例如 `3/3 恶意`)以及 ASCII 置信度条。 |
| **2. 家族** | `--family` | 2,538 类家族分类器。返回 Top-N 候选(默认 10)及其置信度。若存在标签映射,则自动解析为可读的家族名称。 |
| **3. 属性** | `--attrib` | 五个一对一多标签分类头——行为、打包器、漏洞、APT 组、文件属性——并行预测。由于是 OvR,单一样本可同时被标记为例如 *已打包 × 数据窃取 × APT 相关*。 |
| **4. SHAP** | `--shap` | 通过 LightGBM 内置的 SHAP 计算每个特征的贡献(无需额外包),聚合为 12 个可解释类别。也可展示 Top-N 单个特征贡献,例如 *“StringExtractor 特征 #X 使判决偏向 −0.3 logit。”* |
默认仅运行第 1 层;按需添加标志即可加深分析。`--all-layers` 可一次性启用全部层级。
### 支持的文件类型
Win32 / Win64 / .NET / ELF / APK / PDF —— 通过 `--type` 可选。每种类型在可用时使用家族专用分类头,否则回退到通用 PE 头。
### 输出模式
- **终端**:格式化、感知颜色、兼容 cp932 的输出,便于快速阅读。
- **JSON**:`--json <路径>` 写入完整结果——包含判决、集成分数、家族 Top-N、带有每标签分数的 OvR 标签、SHAP 类别总计以及每个特征的贡献。设计为可管道传输、比对或导入下游分析。
### 极简足迹
仅 `mlscan.py` 一个文件。依赖项:`thrember`、`lightgbm`、`numpy`。仅此而已。SHAP 通过 LightGBM 的内部贡献 API 计算,因此无需独立的 `shap` 包。
## 安装
```
# 1. 依赖项
pip install thrember lightgbm numpy
# 2. 克隆此仓库
git clone https://github.com//mlscan.git
cd mlscan
# 3. 从官方 EMBER2024 发布版本下载 EMBER2024 模型包(14 个 .model 文件)
# 并将其放置在 ./models/ 目录下
# (或使用 --models-dir 参数指定 mlscan.py 的路径)
```
建议使用 Python 3.10 或更高版本。
## 用法
### 基础——仅判决
```
python mlscan.py sample.exe --type win64
```
### 全部层级
```
python mlscan.py sample.exe --type win64 --all-layers
```
### 选择性层级
```
# 仅家族归属
python mlscan.py sample.exe --type win64 --family
# 仅属性
python mlscan.py sample.exe --type win64 --attrib
# SHAP 扩展特征详情与 JSON 导出
python mlscan.py sample.exe --type win32 --shap --top 50 --json result.json
```
### 批量分类
`mlscan.py` 适合标准输出且优先使用 JSON,因此可自然与 shell 循环和 `parallel` 结合:
```
find ./samples -type f -name '*.exe' | \
parallel -j 8 'python mlscan.py {} --type win64 --all-layers --json {.}.json'
```
### 完整选项参考
```
positional:
path Path to the sample file
required:
--type {win32,win64,dotnet,elf,apk,pdf}
File family. Selects specialized models.
layers:
--family Enable Layer 2 (family classification)
--attrib Enable Layer 3 (attribute multi-label heads)
--shap Enable Layer 4 (SHAP interpretation)
--all-layers Enable layers 2, 3, and 4
output:
--top N Top-N cutoff for family and SHAP features (default: 10)
--json PATH Write full structured result to PATH
--models-dir PATH Directory containing the 14 EMBER2024 .model files
--quiet Suppress non-result terminal output
```
## 示例输出
```
════════════════════════════════════════════════════════════════
mlscan.py v3.1 — EMBER2024 frontend
sample: loader_v3.exe (type: win64, size: 142,336 bytes)
════════════════════════════════════════════════════════════════
[Layer 1] Malicious / Benign
win64 ████████████████░░░░ 0.812 ● malicious
pe █████████████████░░░ 0.847 ● malicious
all ██████████████░░░░░░ 0.703 ● malicious
─────────────────────────────────────────
ENSEMBLE: 3/3 malicious mean=0.787 verdict: MALICIOUS
[Layer 2] Family (top 10)
1. trojan.redline 0.2841
2. stealer.raccoon 0.1017
3. trojan.formbook 0.0884
...
[Layer 4] SHAP categories (sorted by |contribution|)
StringExtractor +0.412
ByteHistogram +0.187
SectionInfo +0.094
ImportsInfo −0.051
...
```
(JSON 输出以完整细节镜像此结构。)
## 使用场景
**红队预检。** 你刚刚编译了一个新的加载器,想在触碰目标前了解静态 ML 层的检测情况。向在线多 AV 服务提交是错误的做法——未公开的技巧会在数小时内进入厂商特征库。`mlscan.py` 完全在本地运行,使用许多厂商所依赖的同一公共模型。
**事件响应分类。** 批量导入数百个候选样本,运行 `mlscan.py --all-layers --json` 循环,按判决 × APT 分数排序。仅深入分析感兴趣的长尾样本。
**ML 研究基线。** 当论文声称“我们使用 EMBER2024 评估”时,这是实现该目标的 reproducible 方法。`--shap` 输出提供可解释性挂钩,用于论证为何某项规避或防御会移动分数。
**教学与工作坊。** 四层结构清晰地映射到教学弧线:浅层判决 → 家族 → 属性 → 可解释性。学生能看到每个阶段,而非一个黑盒的“恶意 = 真”。
## 相关研究
本工具是与一项关于 EMBER2024 在构建卫生变换下的规避行为的定量研究同步开发的:
该论文中的每一幅图与每一个数字均源自 `mlscan.py --shap --json` 输出,因此读者可借助本仓库与一组测试二进制文件在本地复现所有结果。
研究发现的简要版本:综合应用标准构建卫生措施(动态 CRT、`/Brepro`、嵌入清单、版本信息资源等)可使 EMBER2024 判决从恶意翻转为良性,在 10/10 个加载器样本中实现约 0.4 的安全余量(低于 0.5 阈值)。外部加载的加载器即使投递 35 MB 的真实 Sliver C2 植入仍保持良性。资源嵌入的加载器存在边界:logit 随嵌入载荷大小大致呈对数线性增长,在约 1 MB 附近跨越阈值。SHAP 分解显示字节统计类别对大小呈单调线性响应,而结构元数据类别响应非单调;主要效应可归因于 `StringExtractor` 单独。
若你使用本工具或基于论文结果进行构建,欢迎提供指针与批评。
## 预期用途与免责声明
`mlscan.py` 是用于静态 ML 恶意软件研究、红队自评估、事件响应分类和教学的本机分析工具。它不进行任何利用、不传播恶意软件、也不向任何外部服务提交样本。
请仅对已获授权分析的文件使用本工具。该工具生成的结果——包括低分、良性判决或“遗漏”预测——仅反映某一特定公共机器学习模型家族的行为,并非对任何文件的一般安全性声明。不要将 `mlscan.py` 输出作为清除样本、发布二进制文件或做出下游安全决策的唯一依据。
本项目与 Elastic、CrowdStrike 或 EMBER / EMBER2024 作者并无关联。
## 许可证
MIT。参见 `LICENSE`。
## 感谢
- 感谢 EMBER / EMBER2024 作者与贡献者发布数据集、特征提取器与训练模型。
- 感谢 LightGBM 与 NumPy 维护者。
- 感谢所有对该工具早期草案提出反馈的人——它因此变得更好。
标签:Apex, API安全, APT, CLI, cp932编码, EMBER2024, JSON输出, KDD 2025, LightGBM, Python, SHAP, WiFi技术, Win64 PE, 二分类, 云安全监控, 加壳检测, 单文件脚本, 可解释性, 多标签分类, 开源安全工具, 文件属性, 族分类, 无后门, 本地推理, 机器学习, 漏洞分析, 特征提取, 管道集成, 终端工具, 路径探测, 逆向工具, 逆向工程平台, 集成学习, 静态分析