Kartik0219/malscan
GitHub: Kartik0219/malscan
一款完全离线运行的本地恶意软件按需扫描器,结合哈希、熵值、PE分析、YARA 等多引擎检测技术,为每个文件输出统一判定结果。
Stars: 0 | Forks: 0
# malscan
一个本地、按需运行的恶意软件扫描器。它将五种检测技术结合,为每个文件生成
单一判定结果 —— 完全离线运行,无云 API,无遥测。
**在线演示:** —— 一个安全的、仅限上传的公开版本(完整的本地仪表板仅支持 CLI)。
## 快速开始 —— 下载与运行(分步指南)
有两种方式可以开始。**选项 A** 最快(无需 Python);**选项 B** 从源码
运行,且不会产生任何操作系统警告。
### 选项 A —— 下载应用(无需 Python)
1. 打开 [**Releases 页面**](https://github.com/Kartik0219/malscan/releases/latest)。
2. 在 **Assets** 下,下载适用于您系统的文件:
- **Windows:** `malscan-windows-x64.exe`
- **macOS (Apple Silicon):** `malscan-macos-arm64`
3. 运行它:
- **Windows:** 双击 `.exe` 文件。首次运行时,Windows SmartScreen 可能会
提示 *"Windows protected your PC"* -> 点击 **More info -> Run anyway**(该程序
未签名,但未感染病毒 —— 详见[下文说明](#running-it-safely-no-smartscreen--gatekeeper-warnings))。
- **macOS:** 在“下载”文件夹中打开 Terminal 并运行
`chmod +x malscan-macos-arm64 && ./malscan-macos-arm64`。如果被 Gatekeeper 拦截,
**右键点击该文件 -> Open** 一次以允许运行。
4. 扫描仪表盘将在浏览器中打开,地址为 ****。您也可以在
终端中将其作为命令行工具使用:
# Windows
malscan-windows-x64.exe scan "C:\Users\you\Downloads"
# macOS
./malscan-macos-arm64 scan ~/Downloads
### 选项 B —— 从源码运行(无警告;需要 Python 3)
1. 安装 **[Python 3](https://www.python.org/downloads/)**(在 Windows 上请勾选 *"Add Python to
PATH"*)。
2. 获取代码 —— 使用 git,或下载 ZIP 压缩包:
git clone https://github.com/Kartik0219/malscan.git
cd malscan
*(没有 git?在仓库页面点击 **Code -> Download ZIP**,然后解压即可。)*
3. 启动它:
- **Windows:** 双击 **`run_malscan.bat`**(它会自动安装所需依赖并
打开仪表盘)。
- **macOS / Linux:**
chmod +x run_malscan.sh
./run_malscan.sh
4. 在浏览器中打开 ****。
### 首次扫描(命令行)
```
# 扫描单个文件
python -m malscan scan suspicious.exe
# 扫描整个 Downloads 文件夹,仅显示 suspicious-or-worse
python -m malscan scan ~/Downloads --min-severity suspicious
```
它会为每个文件输出一个判定结果(`clean` / `info` / `suspicious` / `malicious`),并且
如果发现任何恶意文件,将以退出代码 `1` 退出。就是这么简单 —— 阅读
本 README 的其余部分以了解报告、隔离区、实时监控及其他引擎。
## 安全运行(无 SmartScreen / Gatekeeper 警告)
malscan 是纯 Python 编写的,因此最安全且无警告的运行方式是**从源码**
运行 —— 操作系统没有未签名的 `.exe` 或二进制文件需要标记。
**Windows** —— 双击 **`run_malscan.bat`**(或在终端中运行它)。它会
安装依赖项并在 打开仪表盘。
**macOS / Linux**:
```
chmod +x run_malscan.sh
./run_malscan.sh # http://127.0.0.1:8080
```
或在任何平台上手动运行:
```
pip install -r requirements.txt flask waitress
python serve.py # http://127.0.0.1:8080
```
## 检测引擎
| 引擎 | 技术 | 可引发的判定结果 |
|--------|-----------|----------------------|
| **hash** | 基于 SHA-256 / MD5 与黑名单匹配 | `malicious` |
| **heuristic** | 加权静态特征:整体文件及 PE 节的熵 + 高风险导入 | `suspicious` |
| **filetype** | Magic bytes 与声明的扩展名不匹配 + 双扩展名欺骗 | `suspicious` |
| **logical** | 多条件签名(ClamAV `.ldb` 风格的布尔规则) | 取决于具体规则 |
| **yara** | YARA 规则匹配 (`yara-python`) | 取决于具体规则 (`suspicious`/`malicious`) |
| **ml** *(可选)* | 基于字节/PE 特征训练的逻辑回归模型 | `suspicious` |
| **reputation** *(可选)* | 本地流行度缓存 —— 标记前所未见的可执行文件 | `info` |
| **virustotal** | 可选的哈希查询,对比 VirusTotal 的 AV 共识结果 | 取决于共识 |
hash 和 heuristic 引擎完全使用标准库。`pefile` 和 `yara-python` 是
可选的 —— 如果未安装,这些检查会优雅降级,并且
扫描的其余部分仍会继续运行。文件还会在**压缩包内部**被遍历(见下文)。
### 启发式评分
启发式引擎将*加权特征*汇总为 `[0, 1]` 范围内的风险评分,并且
仅在分数超过阈值时才标记为 `suspicious` —— 单个高风险
导入不会直接判定文件违规,但多个特征组合(或打包的 PE 节)则会。
压缩和媒体格式(zip、gzip、png、jpeg 等)**豁免**于
整体文件熵检查,因为它们在设计上本身就是高熵的;它们的内部内容
会由压缩包遍历器进行检查。
## 压缩包扫描
`.zip`、`.tar`(包括 `.tar.gz`/`.tar.xz`)以及纯 `.gz` 流中的文件也会
被扫描 —— 直接**在内存中**遍历,绝不解压到磁盘上。这意味着
zip-slip 类的漏洞无法发生(一个名为 `../../etc/passwd` 的成员只是一个
无效的标签),并且解压炸弹受到显式预算的限制(针对每个
成员、总字节数、成员数量和嵌套深度)。成员路径通过
`!` 组合,例如 `bundle.zip!evil.exe`。使用 `--no-archives` 可禁用此功能。
## 下载 (Windows & macOS)
预编译的二进制文件位于 [**Releases**](https://github.com/Kartik0219/malscan/releases) 页面 —— 无需 Python:
| 平台 | 文件 |
|----------|------|
| Windows 10/11 (x64) | `malscan-windows-x64.exe` |
| macOS (Apple Silicon) | `malscan-macos-arm64` |
| macOS (Intel) | `malscan-macos-x64` |
- **双击**即可在浏览器中打开仪表盘,**或者**在终端中作为 CLI 运行:`malscan-windows-x64.exe scan `。
- 这些二进制文件是**未签名**的,因此操作系统会显示一次性警告:
- **Windows:** SmartScreen -> *More info* -> *Run anyway*。
- **macOS:** 右键点击 -> *Open* (或运行 `xattr -d com.apple.quarantine ./malscan-macos-arm64 && chmod +x ./malscan-macos-arm64`)。
- 某些杀毒软件引擎可能会标记 PyInstaller 生成的二进制文件(对于扫描器来说这很讽刺) —— 这是误报;通过以下方法从源码安装即可避免。
## 安装
```
pip install -r requirements.txt # optional extras: pefile, yara-python
```
核心扫描器零依赖运行;扩展项可解锁 PE 和 YARA 功能。
## 用法
```
# 扫描单个文件
python -m malscan scan suspicious.exe
# 扫描目录(默认递归),写入 JSON + HTML 报告
python -m malscan scan ./downloads --json report.json --html report.html
# 仅显示 suspicious-or-worse,非递归
python -m malscan scan ./downloads --no-recursive --min-severity suspicious
```
HTML 报告是一个独立的单文件(无外部资源),您可以
在任何浏览器中打开或分享 —— 非常适合将扫描结果附加到工单中。
如果发现任何 `malicious` 内容,退出代码为 `1`,否则为 `0` —— 非常适合用于
CI 流水线和 pre-commit 钩子。
### SARIF 输出 (GitHub 代码扫描)
生成 [SARIF 2.1.0](https://sarifweb.azurewebsites.net/) 报告,以便检测结果
能作为警报显示在仓库的 **Security** 标签页中,与 CodeQL 并列:
```
python -m malscan scan ./artifacts --sarif malscan.sarif
```
每个发现都会成为一个 SARIF `result`(严重程度映射为 `error`/`warning`/`note`,
并带有 GitHub `security-severity` 分级);MITRE ATT&CK ID 包含在 result
属性中。从 workflow 上传它:
```
- run: python -m malscan scan ./artifacts --sarif malscan.sarif
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: malscan.sarif
```
## 判定结果
每个文件获得一个判定结果 —— 即所有引擎发现中严重程度最高的结果:
`clean` < `info` < `suspicious` < `malicious`
## 检测原理
- **Hashes** 能立即捕获*已知的*恶意文件。内置的黑名单预置了
[EICAR 测试文件](https://www.eicar.org/) 的 SHA-256
哈希(一个无害的行业测试字符串,并非真正的恶意软件),以便您验证扫描器是否正常工作。
- **Entropy** 标记字节分布接近随机
(≥ 7.5 bits/byte)的文件,这是加壳或加密的典型特征。这只是*信号,而非*
*证据* —— 合法的安装程序也会加壳,因此它只作为权重参考,
绝不单独作为定罪依据,并且压缩/媒体格式豁免于此。
- **PE analysis** 解析 Windows 可执行文件,查找高熵(加壳)的节
以及常被滥用于进程注入和反调试的导入
(`WriteProcessMemory`、`CreateRemoteThread`、`IsDebuggerPresent` 等)。
- **File-type masquerading** 将文件真实的 magic bytes 与其名称所声明的类型进行比对 —— 例如
实际上是 PE/ELF/Mach-O 可执行文件的 `.pdf` 或 `.jpg`,或者像 `invoice.pdf.exe` 这样的双扩展名。映射到 MITRE
`T1036.008` / `T1036.007`。纯标准库实现;设计上几乎零误报。
- **YARA** 运行来自 `signatures/yara/` 的模式规则。放入精选的规则
源(例如 [signature-base](https://github.com/Neo23x0/signature-base))以
扩大覆盖范围。
## 扩展功能
- **更多哈希:** 将 `
标签:DNS 反向解析, PE分析, YARA, 云资产可视化, 恶意软件扫描, 本地防护, 漏洞挖掘, 逆向工具