POSTTTT/malware-scanner
GitHub: POSTTTT/malware-scanner
一款基于多阶段静态分析的Web端恶意软件扫描器,将PE分析、熵值检测、YARA规则和VirusTotal查询综合为可解释的CLEAN/SUSPICIOUS/MALICIOUS判定结果。
Stars: 0 | Forks: 0
# 恶意软件扫描器
一个基于 Web 的扫描器,用于在运行下载的文件(`.exe`、`.dll`、`.msi`、`.bin`、`.elf`)之前检查其是否安全。后端通过多个阶段(PE 结构、熵、字符串、YARA、VirusTotal)对上传内容进行分析,并将信号综合为一个 **CLEAN(安全) / SUSPICIOUS(可疑) / MALICIOUS(恶意)** 的判定结果,附带人类可读的原因。
  
## 功能
- **多阶段静态分析** — PE 结构、可疑导入、节区熵、字符串提取、YARA 规则
- **VirusTotal 查询** — 将文件的 SHA256 与 70 多个 AV 引擎进行交叉核对(免费版 API 密钥)
- **加权判定引擎** — 将信号合并为一个分数,解释每个贡献因素的原因
- **本地 SQLite 缓存** — 相同文件扫描两次,瞬间返回结果
- **拖拽式 React UI** — 判定徽章,可展开的分析面板
- **优雅降级** — 缺少 API 密钥、网络错误和格式错误的文件永远不会导致流程崩溃
- **轮转文件日志** — 每次扫描、错误和 VT 查询都会记录在 `logs/scanner.log` 中
## 架构
```
┌─────────────────┐ multipart/form-data ┌─────────────────────┐
│ React (Vite) │ ───────────────────────────▶ │ FastAPI backend │
│ localhost:5173 │ │ 127.0.0.1:8000 │
└─────────────────┘ ◀────── JSON verdict ───── └──────────┬──────────┘
│
┌───────────┬─────────────────┼──────────────────┐
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────┐
│ pefile + │ │ YARA │ │ SQLite │ │ VirusTotal │
│ entropy │ │ rules │ │ cache │ │ API v3 │
│ + strings│ │ │ │ │ │ │
└──────────┘ └──────────┘ └──────────┘ └────────────┘
```
## 快速开始
### 前置条件
- **Python 3.12+**(已在 3.14 上测试)
- **Node.js 20+**
- **Windows、macOS 或 Linux**(PE 分析可在任何主机上运行;某些测试路径假定在 Windows 上)
- **一个免费的 [VirusTotal API 密钥](https://www.virustotal.com/gui/my-apikey)** — 可选,扫描器在没有它的情况下也能运行,但判定结果将缺少最强有力的信号
### 1. 克隆并安装后端
```
git clone https://github.com/POSTTTT/malware-scanner.git
cd malware-scanner
python -m venv venv
# Windows PowerShell:
.\venv\Scripts\Activate.ps1
# macOS/Linux:
source venv/bin/activate
pip install -r requirements.txt
```
### 2. 配置你的 VirusTotal 密钥
```
cp .env.example .env
# 然后打开 .env 并将你的密钥粘贴到 VIRUSTOTAL_API_KEY= 之后
```
扫描器在没有密钥的情况下也能运行 — VT 查询将被跳过并给出明确的原因。
### 3. 安装前端依赖
```
cd frontend
npm install
cd ..
```
### 4. 运行它
你需要同时打开**两个终端**。
**终端 1 — 后端:**
```
cd backend
..\venv\Scripts\python.exe -m uvicorn main:app --reload
```
**终端 2 — 前端:**
```
cd frontend
npm run dev
```
在浏览器中打开 **http://localhost:5173**。
## 使用方法
将文件拖放到拖拽区(或点击浏览)。UI 会将其流式传输到后端,后端会执行以下操作:
1. 验证文件(扩展名,大小限制为 50 MB)
2. 计算 SHA256 并检查本地缓存
3. 如果是新文件:运行 PE 分析、熵、字符串、YARA,然后查询 VirusTotal
4. 将所有信号合并为一个 0-100 分的判定结果
5. 返回结果;UI 渲染判定结果 + 原因 + 可展开的详细信息
你也可以直接调用 API:
```
curl -X POST http://127.0.0.1:8000/scan -F "file=@C:\Windows\System32\notepad.exe"
```
交互式 API 文档位于 http://127.0.0.1:8000/docs。
## 判定结果的计算方式
判定引擎结合了来自每个扫描器的加权信号。分数阈值:
| 分数 | 判定 |
|-------|---------|
| `< 20` | **CLEAN** |
| `20–49` | **SUSPICIOUS** |
| `≥ 50` | **MALICIOUS** |
部分信号(完整列表见 [backend/scanners/verdict.py](backend/scanners/verdict.py)):
| 信号 | 分数 |
|--------|--------|
| VT:≥ 10 个引擎标记该文件 | +60 |
| VT:≥ 5 个引擎标记 | +40 |
| VT:≥ 1 个引擎标记 | +20 |
| VT:0 / 多个引擎认为干净(知名文件) | **−20** |
| PE 包含 Authenticode 签名 | **−20** |
| PE 导入了进程注入三剑客 | +25 |
| 其他可疑导入 | 每个 +3,最高 +15 |
| 节区熵 ≥ 7.5(可能已加壳/加密) | +25 |
| 节区熵 ≥ 7.0(可能已加壳) | +15 |
| 可疑关键字(bitcoin、decrypt、vssadmin 等) | 每个 +5,最高 +15 |
| YARA:高严重性匹配 | +40 |
| YARA:中严重性匹配 | +20 |
| YARA:低严重性匹配 | +10 |
响应始终包含一个 `reasons[]` 数组,显示哪些信号做出了贡献及其分数。
## 项目结构
```
malware-scanner/
├── backend/
│ ├── main.py # FastAPI app entry
│ ├── config.py # config.yaml loader
│ ├── database.py # SQLite cache
│ ├── logger.py # rotating file logger
│ ├── api/
│ │ ├── health.py # GET /health
│ │ └── scan.py # POST /scan
│ ├── scanners/
│ │ ├── hasher.py # SHA256
│ │ ├── pe_analyzer.py # pefile-based PE parsing
│ │ ├── entropy.py # Shannon entropy per section
│ │ ├── strings.py # ASCII / UTF-16 string extraction
│ │ ├── yara_scan.py # YARA rule matcher
│ │ ├── virustotal.py # VT API v3 client
│ │ ├── static.py # orchestrates all static stages
│ │ └── verdict.py # weighted scoring engine
│ └── schemas/scan.py # Pydantic response models
├── frontend/ # Vite + React UI
├── rules/starter.yar # bundled YARA rules
├── tests/test_pipeline.py # end-to-end smoke test
├── config.yaml # central config (size limits, extensions, VT)
├── requirements.txt
├── PLAN.md # implementation plan + future work
└── IDEA.md # original concept
```
## 运行冒烟测试
在后端运行的情况下:
```
python tests/test_pipeline.py
```
这会上传一个干净的 Windows 二进制文件(`notepad.exe`)和一个手工制作的“伪勒索软件”样本,然后断言它们的判定结果分别为 CLEAN 和 MALICIOUS。如果需要,可以设置 `SCANNER_URL` 指向不同的主机/端口。
## 配置
大部分配置项位于 [config.yaml](config.yaml):
```
uploads:
max_size_mb: 50
allowed_extensions: [.exe, .dll, .msi, .bin, .elf]
virustotal:
rate_limit_per_minute: 4 # matches free-tier quota
```
密钥(`VIRUSTOTAL_API_KEY`)保存在被 gitignore 忽略的 `.env` 文件中。
## 未来增强功能
在 [PLAN.md](PLAN.md) 中跟踪:
- **`capa` 集成** — 将二进制行为映射到 MITRE ATT&CK 技术
- **MalwareBazaar** — 第二个威胁情报源
- **Authenticode 发布者信任列表** — 自动将通过已知厂商签名的文件标记为 CLEAN
- **异步管道** — 仅在添加缓慢的分析器(capa、沙箱)时才需要
- **沙箱(第 10 阶段)** — 在 Docker 容器中运行,观察行为
## 免责声明
本工具**仅供教育和授权的安全测试目的**使用。请勿将其用于分析你没有权限检查的文件。作者对滥用行为不承担任何责任。
## 许可证
[GPL-3.0](./LICENSE)
标签:AMSI绕过, Ask搜索, AV绕过, DAST, DNS信息、DNS暴力破解, ELF文件分析, FastAPI, PE文件分析, Python, React, SQLite, Syscalls, TLS抓取, VirusTotal, Web安全, YARA规则, 云安全监控, 可解释性判决, 多阶段扫描, 威胁检测, 恶意软件分析, 恶意软件扫描器, 拖拽上传, 文件熵值分析, 无后门, 病毒扫描, 网络安全, 蓝队分析, 软件安全, 逆向工具, 隐私保护, 静态分析