IanSolorzanoC/malware-analyzer
GitHub: IanSolorzanoC/malware-analyzer
基于确定性规则的 PE 恶意软件静态分析流水线,通过 API 序列启发式检测和本地 ATT&CK 映射生成可审计的研判报告与 YARA 检测规则,全程不依赖 LLM、无需联网、零成本。
Stars: 0 | Forks: 0
# malware_analyzer
静态恶意软件分析流水线。基于规则的启发式算法 → 本地 MITRE ATT&CK 查询 → YARA 规则生成。关键路径上零 LLM 调用。零成本。

## 典型静态分析工作流的问题
大多数流水线将导入表提供给 LLM 并信任其输出。LLM 看到 `CreateRemoteThread` 就会说*"进程注入 — T1055"*。很自信,但有一半的时间是错的。
仅凭 `CreateRemoteThread` 毫无意义。合法软件也会使用它。只有当它作为特定序列的一部分出现时:`VirtualAllocEx → WriteProcessMemory → CreateRemoteThread` —— 且在该二进制文件中按此顺序出现,该技术才会成为证据。
本流水线在每一层都严格执行了这一原则。
## 系统架构
```
Binary
│
├─ extractor.py ──── PE parsing, import table, strings, entropy per section
│
├─ heuristic.py ──── Rule-based API sequence detection (no LLM)
│ Entropy thresholds, overlay detection, TLS callbacks
│ Verdict: SKIP | ANALYZE + risk score 0–100
│
├─ attck.py ─────── Local MITRE ATT&CK lookup (697 techniques, cached JSON)
│ No API calls. Deterministic. Maps sequence hits to TTPs.
│
├─ yara_gen.py ───── YARA rule generation from confirmed evidence only
│ 4 rule types: strings, API sequences, entropy, combined
│
└─ report.py ──────── HTML report generation
Risk score, TTPs, entropy bars, flagged strings, YARA
```
## 设计决策
**在进行任何推断之前采用基于规则的判断。** 启发式引擎完全基于确定性规则运行 —— API 序列、熵值阈值、PE 结构异常。没有模型参与分类步骤。这消除了幻觉产生的 TTP,并生成可以逐行审计的证据。
**关注序列,而非单一 API。** 引擎在导入表中按相对顺序匹配 API 调用,而不是仅仅检查其存在性。单独的 `VirtualAllocEx` 得分为零。按顺序出现的 `VirtualAllocEx → WriteProcessMemory → CreateRemoteThread` 得分为 40,并映射到 `T1055.002`。这种区分正是该启发式算法不会过度分类的核心原因。
**本地 ATT&CK 数据库。** MITRE 以 JSON 文件的形式发布完整的 ATT&CK Enterprise 数据集。该流水线只需下载一次(约 10MB),在本地缓存,并离线执行所有查询。无需 API 密钥,无速率限制,零成本。
**基于证据而非猜测生成 YARA 规则。** 规则仅从启发式层确认的工件中生成。单一 API 规则需要附加熵值条件以减少误报。组合规则要求至少同时具备 3 个独立信号。
**SKIP 是一个有效的结果。** 高度加壳的样本(如 AgentTesla)会返回带有 `risk_score=10` 的 `SKIP`。这是正确的行为 —— 静态分析无法查看加壳的有效载荷。在没有证据的情况下将其标记为恶意只会产生噪音。
## 真实样本测试结果
| 样本 | 家族 | 判定 | 风险值 | 确认的 TTP |
|--------|--------|---------|------|----------------|
| `2d97b013...` | AgentTesla | SKIP | 10 | — (完全加壳,无可见攻击面) |
| `37930e1d...` | SalatStealer UPX | ANALYZE | 100 | T1027.007, 熵值 7.983, overlay, TLS |
| `a12ad896...` | AsyncRAT | ANALYZE | 100 | T1027.007, overlay, TLS, anti-debug |
样本来源于 [MalwareBazaar](https://bazaar.abuse.ch)。切勿将恶意软件提交至代码仓库。
## 安装说明
```
git clone https://github.com/IanSolorzanoC/malware-analyzer.git
cd malware-analyzer
pip install -r requirements.txt --break-system-packages
```
**环境要求:**
- Python 3.10+
- Kali Linux 或任何基于 Debian 的发行版(推荐)
- 已安装 YARA:`sudo apt install yara`
首次运行时会下载 ATT&CK Enterprise JSON(约 10MB)并将其缓存在 `data/` 目录中。
## 使用说明
```
python3 analyze.py
```
**输出文件**(写入 `output/` 目录):
| 文件 | 内容 |
|------|----------|
| `_report.html` | 完整的 HTML 报告 |
| `_report.json` | 机器可读的 JSON |
| ``.yar | 生成的 YARA 规则 |
## 流水线输出示例
```
[+] Analyzing: sample.exe
============================================================
[1/5] Extracting PE artifacts...
SHA256 : 37930e1df920a9122d1f...
Arch : x86
Size : 15,023,428 bytes
APIs : 135 imported
Strings flagged: 1
[2/5] Running rule-based heuristics...
Verdict : ANALYZE
Risk score : 100/100
→ dynamic_api_resolution [T1027.007] (MEDIUM)
[entropy] .rdata: 7.983 — probable packing or encryption
[note] PE has overlay — possible dropper or appended payload
[note] TLS callbacks present — code runs before entry point
[3/5] Resolving TTPs against local ATT&CK database...
[4/5] Generating YARA rules...
[5/5] Generating HTML report...
[+] JSON : output/37930e1df920_report.json
[+] YARA : output/37930e1df920.yar
[+] HTML : output/37930e1df920_report.html
Risk : 100/100 — ANALYZE
```
## 生成的 YARA 规则类型
**字符串规则** —— 针对在二进制文件中发现的可疑特定字符串(IP、注册表键、互斥体)。条件:必须存在至少一半的已识别字符串。
**API 序列规则** —— 针对已确认的 API 序列。单一 API 规则需要附加熵值条件以限制误报。3 个及以上的 API 序列被视为具有高特异性。
**熵值/加壳规则** —— 使用 YARA 的 `math.entropy()` 来检测加壳或加密的节。结合 overlay 和导入数量条件进行判断。
**组合规则** —— 要求至少同时具备 3 个独立信号(熵值 + overlay + anti-debug + 已确认的 API)。在四种类型中误报率最低。
## 已知局限性
**加壳样本。** 静态分析无法查看加壳有效载荷内部的导入或字符串。高度混淆的样本(如 AgentTesla,仅有 1 个可见导入,低熵值)会返回 SKIP。在运行此流水线之前,需要通过动态分析或手动脱壳来进行解包。
**动态 API 解析。** 在运行时通过 `GetProcAddress` 解析所有 API 的恶意软件不会触发 API 序列规则,因为导入表中永远不会出现这些导入项。该流水线能将此模式检测为 `T1027.007`,但无法识别其底层的具体技术。
**导入顺序依赖。** 序列匹配器依赖于 PE 导入表中条目的顺序。某些链接器和混淆器会以不可预测的方式重新排列导入项,这可能导致序列匹配失败。
**无动态分析。** 这是一个有意设计的纯静态流水线。它不会执行、模拟或沙箱化二进制文件。行为分析需要单独的层来实现。
## 项目结构
```
malware_analyzer/
├── core/
│ ├── __init__.py
│ ├── extractor.py # PE parsing and artifact extraction
│ ├── heuristic.py # Rule-based detection engine
│ ├── attck.py # Local MITRE ATT&CK lookup
│ ├── yara_gen.py # YARA rule generation
│ └── report.py # HTML report generation
├── analyze.py # Pipeline entry point
├── requirements.txt
└── .gitignore
```
`data/` 和 `output/` 目录会在首次运行时自动创建。不会被提交至版本库。
## 路线图
- [ ] 分析前自动进行 UPX 脱壳
- [ ] 集成 Ghidra headless 用于反编译伪代码
- [ ] 集成 Ollama 用于生成叙述性报告(本地,零成本)
- [ ] 批处理模式:分析整个目录
- [ ] 导出 STIX 2.1 格式用于威胁情报共享
## 参考文献
- [MITRE ATT&CK Enterprise](https://attack.mitre.org/)
- [MalwareBazaar](https://bazaar.abuse.ch)
- [pefile](https://github.com/erocarrera/pefile)
- [YARA documentation](https://yara.readthedocs.io)
- [Vulhub](https://github.com/vulhub/vulhub)
标签:API序列检测, API接口, ATT&CK映射, DAST, DeepSeek, DNS 反向解析, DNS 解析, PE文件分析, Python安全工具, TTP映射, YARA规则生成, 云安全监控, 启发式规则, 威胁情报, 开发者工具, 恶意软件分析, 无LLM安全分析, 熵值分析, 确定性分析, 网络信息收集, 网络安全, 自动化分析流水线, 逆向工具, 逆向工程基础, 速率限制处理, 隐私保护, 零成本安全分析, 静态分析, 风险评分