zainabh4san/mini-yara-detector
GitHub: zainabh4san/mini-yara-detector
一个基于 Python 和 YARA 的教学用恶意软件检测器,通过 10 条手写规则和合成样本演示检测工程的基本流程。
Stars: 0 | Forks: 0
# Mini YARA 恶意软件检测器
这是我用 Python 和 YARA 构建的一个小型恶意软件检测器。YARA 是一款工具,
安全分析师用它来描述什么是“可疑的”——你编写的规则
会指定“如果文件包含这些字符串,就标记它”,然后引擎会根据
所有规则同时检查文件。我的扫描器加载了我自己编写的 10 条规则,扫描一组
测试文件,使用 SHA-256 对每个文件进行指纹识别,并将所有内容保存到 CSV
报告中。
## ⚠️ 免责声明
仅供教育用途。所有测试样本均为合成文件——未使用或执行任何真实的恶意软件。
每个样本都是我自己编写的纯文本文件,每个虚假 URL
都使用了保留的 `.invalid` 域名(它永远不会解析到真实服务器),并且
每个文件在开头都声明了它是一个无害的测试产物。
## 🧰 使用到的工具
| 工具 | 版本 | 用途 |
|------|---------|---------|
| Python | 3.13.5 | 扫描器本身 (`scan.py`) |
| yara-python | 4.5.4 | YARA 引擎的 Python 绑定——用于编译和运行规则 |
| Git | 2.47.1 | 版本控制 |
| PowerShell | Windows 11 | 运行所有内容(无需 WSL,无需 VM) |
## 📁 项目结构
```
malware-detector/
├── rules/ # 10 YARA rules, one per detection theme
│ ├── rule_01.yar # suspicious PowerShell (-enc, IEX)
│ ├── ...
│ └── rule_10.yar # reverse/bind shell indicators
├── samples/ # 10 safe synthetic test files (plain text)
│ ├── sample_01.txt
│ ├── ...
│ └── sample_10.txt
├── results/
│ └── scan_results.csv # output of the most recent scan
├── scan.py # the scanner — loads rules, scans samples, writes results
├── hash_samples.py # rebuilds tracking.csv (SHA-256 of every sample)
├── tracking.csv # sample inventory: name, hash, theme
└── README.md
```
## ▶️ 如何运行
在 PowerShell 中(你只需要安装了 Python 即可):
```
# 1. 检查你是否安装了 Python 3.8+
python --version
# 2. 安装 YARA 库
pip install yara-python
# 3. 进入项目文件夹并运行 scanner
cd malware-detector
python scan.py
```
扫描会在终端中为每个文件打印出一个信息块,并将完整的报告写入
`results/scan_results.csv`。如果 `rules/` 或 `samples/` 为空,脚本会停止
并提示明确的错误,而不是假装一切正常。
## 📊 示例输出
以下是 `results/scan_results.csv` 中的实际行(为了便于阅读,此处的哈希值已缩短——
CSV 中存储了完整的 64 个字符):
| filename | sha256_hash | matched_rules | scan_timestamp |
|----------|-------------|---------------|----------------|
| sample_01.txt | `9f03977e6e5933ea…` | Suspicious_PowerShell_EncodedCommand | 2026-07-13T02:30:58 |
| sample_02.txt | `88d45cae416ac684…` | Office_Macro_AutoExecution | 2026-07-13T02:30:58 |
| sample_03.txt | `43e713d8b9963b2e…` | Generic_Downloader_Indicators | 2026-07-13T02:30:58 |
| sample_04.txt | `d278a3c0f9d3d365…` | UPX_Packed_Executable_Markers | 2026-07-13T02:30:58 |
| sample_05.txt | `2492a4ebe3de09f2…` | Credential_Theft_Indicators | 2026-07-13T02:30:58 |
| sample_06.txt | `24d639cde2c5c6bb…` | Ransomware_Note_Indicators | 2026-07-13T02:30:58 |
| sample_07.txt | `e0c3fec25901696a…` | Paste_Site_And_URL_Shortener | 2026-07-13T02:30:58 |
| sample_08.txt | `02fd2d19f55d631c…` | Registry_RunKey_Persistence | 2026-07-13T02:30:58 |
| sample_09.txt | `9fd658a502e60152…` | Script_Obfuscation_Eval_Decode | 2026-07-13T02:30:58 |
| sample_10.txt | `b93a6a8db9b8178c…` | Reverse_Or_Bind_Shell_Indicators | 2026-07-13T02:30:58 |
扫描了 10 个文件,10 个匹配,0 个遗漏——同样重要的是,每条规则也都在
*其他*九个样本上进行了测试,以确认它不会在
不该触发的地方触发。
## 📜 编写的 YARA 规则
| 规则文件 | 检测内容 | 严重程度 |
|-----------|-----------------|----------|
| rule_01.yar | PowerShell 编码命令 (`-enc`) 和 `IEX(` 执行 | high |
| rule_02.yar | Office 宏自动执行 (`AutoOpen`, `Document_Open`) | medium |
| rule_03.yar | Downloader 行为 (`http://`, `wget`, `DownloadFile`) | medium |
| rule_04.yar | 可执行文件中的 UPX 壳标记 | low |
| rule_05.yar | 凭据窃取字符串 (`password=`, `passwd`, credential access) | high |
| rule_06.yar | 勒索说明用语 ("YOUR FILES HAVE BEEN ENCRYPTED", bitcoin) | high |
| rule_07.yar | Paste 站点和 URL 缩短器 (pastebin.com, bit.ly) | low |
| rule_08.yar | 注册表 Run-key 持久化 (HKCU `...\CurrentVersion\Run`) | medium |
| rule_09.yar | 脚本混淆链 (`base64_decode`, `chr(`, `eval(`) | medium |
| rule_10.yar | 反向/绑定 shell 指标 (`reverse_shell`, `nc -e`) | high |
严重程度是我个人的判断:UPX 壳和缩短器 URL 被标记为 `low` 是因为
大量合法软件都在使用它们,而磁盘上出现勒索说明或
反向 shell 基本上意味着糟糕的事情已经发生了。
## 🧠 我学到了什么
- **YARA 规则的实际工作原理** —— `strings:`/`condition:` 结构,
`nocase` 匹配,以及一些小的坑,比如在注册表路径中必须将每个反斜杠双写,因为
`\` 在 YARA 字符串中是一个转义字符。
- **检测规则的好坏取决于它的误报率。** 真正的测试
不是“规则 3 是否匹配样本 3”——而是检查规则 3 *是否不会*
匹配其他九个样本。我不得不在不相关的样本中对 URL 进行无害化处理(`hxxp://`),这样我的
downloader 规则就不会在每一个包含链接的文件上都被触发。
- **哈希是安全领域为文件命名的方式。** SHA-256 指纹让我能够
证明我的样本在各个阶段之间没有发生变化,这也是真正的
威胁情报平台所使用的同一套身份识别系统。
- **你可以在没有 VM 的情况下安全地练习检测工程。** 带有
真实触发字符串的合成样本、不可达的 `.invalid` 域名,以及
自我声明的文件头,能让你在零风险的情况下获得真实的 YARA 匹配结果。
- **Windows 会让你在文本编码面前吃尽苦头。** 一个破折号导致我的规则文件中的 YARA 解析器崩溃,
*并且*在我的终端输出中打印出了乱码——一个字符引发了
两个单独的 bug。对于任何会被解析器或控制台处理的内容,请坚持只使用 ASCII。
## 👋 关于
我将此作为我的第一个网络安全动手项目来构建,以学习检测
工程基础知识——编写规则、如实地测试它们,并记录
结果
标签:AI合规, Python, YARA, 云安全监控, 云资产可视化, 安全, 教育项目, 无后门, 超时处理, 逆向工具, 静态分析