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(恶意)** 的判定结果,附带人类可读的原因。 ![pipeline](https://img.shields.io/badge/python-3.12+-blue) ![react](https://img.shields.io/badge/react-19-61dafb) ![license](https://img.shields.io/badge/license-GPL--3.0-green) ## 功能 - **多阶段静态分析** — 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规则, 云安全监控, 可解释性判决, 多阶段扫描, 威胁检测, 恶意软件分析, 恶意软件扫描器, 拖拽上传, 文件熵值分析, 无后门, 病毒扫描, 网络安全, 蓝队分析, 软件安全, 逆向工具, 隐私保护, 静态分析