sarthakdewanda/malware-analysis-lab
GitHub: sarthakdewanda/malware-analysis-lab
一个轻量级本地恶意软件分析工具,将静态特征扫描、隔离 VM 行为捕获与本地 LLM 摘要整合为统一的 Markdown 报告。
Stars: 0 | Forks: 0
# 恶意软件分析实验室
一个小型的本地恶意软件筛选工具。它执行静态分析(哈希、熵、PE 导入、YARA)以及隔离 VM 的行为捕获,并将两者整合到一份 Markdown 报告中。它还提供本地 LLM 分析师摘要。

## 目录
- [概述](#overview)
- [工作原理](#how-it-works)
- [功能](#features)
- [截图](#screenshots)
- [前置条件](#prerequisites)
- [设置](#setup)
* [1. 安装依赖](#1-install-dependencies)
* [2. 安装 Ollama(本地 AI)](#2-install-ollama-local-ai)
* [3. 运行分析器](#3-run-the-analyzer)
- [用法](#usage)
- [项目结构](#project-structure)
- [动态分析(VM 捕获)](#dynamic-analysis-vm-capture)
- [注意事项与局限性](#notes-and-limitations)
- [资源](#resources)
## 概述
大多数初学者的恶意软件分析演示只做两件事中的一件:静态文件扫描或沙箱运行。本项目故意保持小规模,但两者皆做。静态分析涵盖哈希、熵、字符串筛选、PE 结构、导入和 YARA。动态分析是在快照隔离的 VM 中真实引爆一个良性样本,并进行进程和网络捕获。这两者会被合并为一份单一的 Markdown 报告。
本地 LLM(通过 Ollama)会针对已计算出的结果添加一段简短的纯英文摘要。在提示词中明确要求它不要做出裁决,只描述发现了什么。该模型在你的机器上运行,因此不会有任何样本数据或文件内容离开主机。
## 工作原理
```
┌───────────────────────────┐
│ Sample file │
│ (.exe, .txt, etc.) │
└─────────────┬─────────────┘
│
┌───────────┴────────────┐
│ │
┌────┴─────┐ ┌─────┴──────┐
│ Static │ │ YARA │
│ Analysis │ │ Scanning │
│ │ │ │
│ • Hashes │ │ • EICAR │
│ • Entropy│ │ • URL rule │
│ • Strings│ │ • PE magic │
│ • PE info│ │ │
└────┬─────┘ └─────┬──────┘
│ │
└───────────┬────────────┘
│
┌───────────┴────────────┐
│ dynamic_report.txt │ captured separately, in an
│ (optional, if present)│ isolated VM (see below)
└───────────┬────────────┘
│
┌──────┴───────┐
│ report.py │
│ merges all │
│ findings │
└──────┬───────┘
│
┌──────┴───────┐
│ Local Llama │
│ 3.2 (Ollama) │
│ summarizes, │
│ no verdict │
└──────┬───────┘
│
┌──────┴───────┐
│ reports/ │
│ *.md report │
└──────────────┘
```
| 组件 | 角色 |
| --------------------- | ----------------------------------------------------------------------------------------- |
| `static_analysis.py` | 哈希计算、类型检测、香农熵、字符串筛选(URL、IP、注册表)、PE 解析 |
| `yara_scan.py` | 编译并针对样本运行 `rules/basic.yar` |
| `capture.sh` | 在隔离的 VM 内运行。在 Wine 下引爆样本并记录进程和套接字 |
| `ai_summary.py` | 将已计算的结果发送给本地 Ollama 模型以生成简短的英文摘要 |
| `report.py` | 将静态结果、YARA、可选的动态日志和可选的 AI 摘要合并为一份报告 |
| `analyzer.py` | 用于快速纯终端静态和 YARA 扫描的 CLI 入口点 |
## 功能
- 文件接收:通过 magic bytes 进行类型检测,MD5 和 SHA-256 哈希计算
- 静态分析:香农熵(总体和每个 PE section)作为加壳启发式方法,以及带有 URL、IP 和注册表路径分类的筛选字符串提取
- PE 分析:section 表、导入数量和编译时间戳,包括当时间戳是一个不切实际的可重复构建哈希而不是真实日期时进行如实标注
- “关注导入”明细,被明确界定为指标而非裁决,因为良性软件也会导入这些 API
- YARA 扫描:使用小型自定义规则集:EICAR 字符串匹配、可疑 URL 模式和 PE magic-byte 结构检查
- 动态捕获:在快照隔离的 Ubuntu VM 中的 Wine 下引爆良性样本,包含运行前后的网络套接字快照以及运行中的进程捕获
- 本地 LLM 摘要(通过 Ollama 的 Llama 3.2),用纯英文描述发现的结果。如果 Ollama 未运行,报告仍可正常生成
- 每个样本生成一份合并的 Markdown 报告,可在 GitHub 上直接阅读
## 截图
**对真实 Windows 二进制文件(`notepad.exe`)的静态分析。显示哈希、熵、PE section、关注导入和 YARA 匹配:**

**对良性测试二进制文件(`hello.exe`)执行相同命令。作为对比,显示了一个安静、干净的结果:**

**为 `notepad.exe` 生成的报告。静态分析结果、AI 摘要和 YARA 合并为 Markdown:**

**为 `hello.exe` 生成的报告。包含动态 VM 捕获部分:**

## 前置条件
- Python 3.10+
- 本地安装 [Ollama](https://ollama.com)(可选;如果未运行,报告将在没有 AI 摘要的情况下正常生成)
- 安装了 Wine 的 Linux VM(VirtualBox 或类似软件),仅在你想重现动态捕获步骤时才需要
## 设置
### 1. 安装依赖
```
pip install -r requirements.txt
```
### 2. 安装 Ollama(本地 AI)
从 [ollama.com](https://ollama.com) 下载,然后拉取这里使用的模型:
```
ollama pull llama3.2
```
如果 Ollama 未运行,`report.py` 仍然会生成完整的报告。它只是会省略 AI 摘要段落。
### 3. 运行分析器
```
python analyzer.py samples\hello.exe
```
## 用法
运行快速的终端扫描:
```
python analyzer.py
```
生成完整的 Markdown 报告(静态分析、YARA、可选的动态日志、可选的 AI 摘要):
```
python report.py
```
报告会写入 `reports\.md`。
尝试对已提交的两个样本进行操作,以查看对比效果:
```
python report.py samples\hello.exe # clean baseline
python report.py samples\demo_strings.txt # triggers URL, IP, and registry triage plus YARA
```
## 项目结构
```
malware-lab/
├── analyzer.py # CLI: quick terminal static and YARA scan
├── static_analysis.py # Hashing, type detection, entropy, strings, PE parsing
├── yara_scan.py # Loads and runs rules/basic.yar
├── ai_summary.py # Local-LLM summary via Ollama
├── report.py # Merges everything into one Markdown report
├── capture.sh # Runs in the VM: detonates a sample, logs behavior
├── dynamic_report.txt # Copied over from the VM after a capture run
├── rules/
│ └── basic.yar # EICAR, suspicious-URL, and PE-structure rules
├── samples/
│ ├── hello.exe # Benign PE, cross-compiled with mingw-w64
│ ├── demo_strings.txt # Benign text file with triage-worthy strings
│ └── EICAR_README.md
├── reports/
│ └── *.md # Generated reports
├── requirements.txt
└── README.md
```
## 动态分析(VM 捕获)
动态步骤简单且手动。
1. 对 Ubuntu VM 拍摄 VirtualBox 快照。
2. 在 VM 内,运行:
./capture.sh hello.exe
这会在 Wine 下引爆样本,并将网络套接字基线、运行中的 Wine 进程信息以及运行后的套接字快照记录到 `dynamic_report.txt`。
3. 使用共享文件夹或拖放操作,将 `dynamic_report.txt` 复制回主机上的项目根目录。
4. 将 VM 恢复到快照。
5. 运行 `python report.py samples\hello.exe`。只有当日志头部标明了所报告的确切样本名称时,报告才会附加该日志,因此过期的日志永远不会被错误匹配到其他文件。
此步骤仅使用良性样本。请参阅[注意事项与局限性](#notes-and-limitations)。
## 注意事项与局限性
- 所有提交的样本都是无害的测试文件:一个简单的 hello-world `.exe` 和一个纯文本文件。不包含也从未运行过任何真实的恶意软件。
- EICAR 测试字符串已被记录在文档中,但未作为活动文件提交,因为防病毒软件会在写入时将其隔离。请参阅 `samples/EICAR_README.md` 了解如何在本地重新创建它。
- “关注导入”是基于精确 API 名称匹配的静态启发式方法。它标记的是指标,而不是裁决。许多合法程序也会导入这些相同的 API。本项目自带的良性样本 `hello.exe` 正确显示没有标记任何内容,而 `notepad.exe` 则正确显示了一些确实存在且可以解释的内容。
- 对于使用可重复构建工具链构建的现代二进制文件,PE 编译时间戳可能毫无意义。报告会将不合理的时间戳进行如实标注,而不是将其作为事实呈现。
- 动态捕获取决于样本的 runtime。像本项目的演示二进制文件这样生命周期极短的进程,可能无法被每次进程快照在执行期间捕获。如果样本运行时间较长,同一脚本将能更全面地观察它。
- AI 摘要是位于确定性分析结果之上的便捷功能层,而不是检测引擎。在提示词中明确要求它避免做出恶意或良性的裁决。
## 资源
- [Ollama](https://ollama.com)
- [YARA 文档](https://yara.readthedocs.io)
- [pefile 文档](https://github.com/erocarrera/pefile)
- [EICAR 测试文件](https://www.eicar.org/download-anti-malware-testfile/)
标签:AI风险缓解, DAST, Python, YARA, 云安全监控, 云资产可视化, 应用安全, 恶意软件分析, 无后门, 本地大模型, 沙箱, 逆向工具, 静态分析