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, 云资产可视化, 恶意软件扫描, 本地防护, 漏洞挖掘, 逆向工具