srameko/malware-analysis

GitHub: srameko/malware-analysis

这是一个基于 Python 的 AI 驱动静态恶意软件分析流水线,集成 Ghidra 与 FLOSS 等工具,利用云端或本地 LLM 自动生成样本分析报告。

Stars: 0 | Forks: 0

# 恶意软件分析 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/47fd7daa2f235658.svg)](https://github.com/srameko/malware-analysis/actions/workflows/ci.yml) [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/) [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://pre-commit.com/) [![lint: ruff](https://img.shields.io/badge/lint-ruff-46aef7?logo=ruff&logoColor=white)](https://github.com/astral-sh/ruff) AI 驱动的静态恶意软件分析流水线。 `pefile` + `FLOSS` + `Ghidra` + 反编译/脱壳 + `Claude / Ollama` → HTML 报告 ## 功能 - **分流模式** — 哈希查询 (VT + MalwareBazaar) + 加壳检测 + 单次 AI 调用 → 约 30 秒内给出结论 - **全量分析** — PE 结构、导入表、FLOSS 字符串、规避技术、YARA 生成、最终报告 - **双 AI 后端** — Anthropic Claude (云端) 或 Ollama (本地,默认);接口兼容,运行时可切换 - **针对模型的 Ollama 预设** — 针对不同模型系列 (gemma4, llama3, mistral, qwen, phi4, deepseek…) 调优 temperature、repeat_penalty、num_ctx - **约束 JSON 解码** — Ollama 后端使用 `format: json` 实现可靠的结构化输出 - **源码模式分析** — 反编译的 Python/C# 被视为主要证据;PE 导入降级为次要上下文 - **自动预处理** — UPX 脱壳、PyInstaller 提取 + `pyc` 反编译、通过 `ilspycmd` 进行 `.NET` 反编译、通过 `7z` 提取归档/SFX - **FLOSS 集成** — 静态字符串、栈字符串和解码字符串;解码字符串排名提升 (+50 分) - **字符串聚类** — 原生二进制字符串被分组到 NETWORK / REGISTRY / EXECUTION / FILES / CRYPTO / DECODED / MISC 桶中 - **Ghidra 伪代码** — `DecompInterface` 提取最可疑函数的 C 伪代码 - **丰富的 PE 元数据** — 数字签名、PDB 路径 (包含用户目录异常检测)、VS_VERSION_INFO 不匹配检测、高熵资源检测 - **时间威胁情报** — imphash 时间线分析:跨度、峰值窗口、邻居样本;PE 编译时间戳与首次可见时间的差距检测 - **YARA 扫描** — 用户规则集 + 针对样本的 AI 生成规则验证 - **内部加壳检测** — UPX, MPRESS, Themida, ASPack, PECompact, Petite 等 (无需 DIE) - **RAG 模式** — 通过 LangChain + ChromaDB 进行本地检索增强生成;索引所有静态分析输出,运行 6 个自动分析查询,并可选择进入交互式问答 — 零云端调用 - **ARM64 兼容** — 在 Apple M4 / Ubuntu ARM 上测试 ## 快速开始 ``` git clone https://github.com/srameko/malware-analysis cd malware-analysis python3 -m venv venv source venv/bin/activate pip install -r requirements.txt # 外部工具 (Debian/Ubuntu) sudo apt install -y upx-ucl p7zip-full # .NET 反编译 (可选) dotnet tool install --global ilspycmd export PATH="$PATH:$HOME/.dotnet/tools" cp .env.example .env nano .env # set ANTHROPIC_API_KEY or configure Ollama # 初步分类 python analyze.py suspicious.exe --triage # 完整分析 (默认: local Ollama) python analyze.py suspicious.exe # 使用 Claude Sonnet 进行完整分析 python analyze.py suspicious.exe --model sonnet ``` ## API 密钥 ### Anthropic (Claude 后端必需) 1. 前往 [console.anthropic.com](https://console.anthropic.com) 2. Settings → API Keys → Create Key 3. 添加到 `.env`: ANTHROPIC_API_KEY=sk-ant-... ### VirusTotal (可选,免费层) 免费层:500 请求/天,4 请求/分钟 — 流水线在调用之间会自动休眠。 ``` VIRUSTOTAL_API_KEY=... ``` ### MalwareBazaar (可选) ``` MALWAREBAZAAR_KEY=... ``` ### OTX AlienVault (可选) ``` OTX_API_KEY=... ``` ## 安装说明 最低 Python 版本:`3.10`。 ``` pip install -r requirements.txt ``` 同时安装 Python 预处理辅助工具 (`pyinstxtractor-ng`, `decompyle3`, `uncompyle6`)。 ### 开发环境设置 ``` pip install -r requirements-dev.txt pre-commit install pre-commit run --all-files ``` CI 运行相同的 lint/语法检查以及测试矩阵 (Python 3.10–3.12)、覆盖率门禁和 CLI 冒烟测试。 ### 外部工具 #### UPX ``` sudo apt install -y upx-ucl # or: brew install upx upx --version ``` #### 7z ``` sudo apt install -y p7zip-full ``` #### ILSpyCmd (.NET 反编译) ``` dotnet tool install --global ilspycmd export PATH="$PATH:$HOME/.dotnet/tools" ilspycmd --help ``` #### Ghidra (可选,但推荐用于原生二进制) ``` sudo apt install -y openjdk-21-jdk unzip # 从以下地址下载: github.com/NationalSecurityAgency/ghidra/releases curl -L https://github.com/NationalSecurityAgency/ghidra/releases/latest/download/ghidra_11.1.2_PUBLIC_20240709.zip \ -o /tmp/ghidra.zip unzip /tmp/ghidra.zip -d /opt/ ln -s /opt/ghidra_11.1.2_PUBLIC /opt/ghidra ``` 如果 Ghidra 安装在其他位置,请在 `config.py` 中设置 `GHIDRA_HOME`。 #### 工具路径覆盖 如果任何二进制文件不在 `PATH` 中,请在 `.env` 中覆盖: ``` # UPX_BIN=/path/to/upx # PYINSTXTRACTOR_BIN=/path/to/pyinstxtractor-ng # DECOMPYLE3_BIN=/path/to/decompyle3 # UNCOMPYLE6_BIN=/path/to/uncompyle6 # ILSPYCMD_BIN=/path/to/ilspycmd # SEVEN_ZIP_BIN=/path/to/7z ``` #### YARA 规则 (可选) ``` pip install yara-python # 在 .env 中指向 .yar 文件或目录: YARA_RULES_PATH=~/yara-rules ``` 推荐规则集:[Yara-Rules/rules](https://github.com/Yara-Rules/rules), [Neo23x0/signature-base](https://github.com/Neo23x0/signature-base) ## 使用方法 ``` # 快速初步分类 — 约 30 秒内得出结论 python analyze.py suspicious.exe --triage # 不使用 FLOSS 进行初步分类 (更快) python analyze.py suspicious.exe --triage --skip-floss # 完整分析 (默认: local Ollama/gemma4) python analyze.py suspicious.exe # 使用 Claude Opus 进行完整分析 (最佳结果) python analyze.py suspicious.exe --model opus # 自定义输出路径 python analyze.py sample.dll -o /cases/001/report.html # 跳过 Ghidra python analyze.py malware.exe --skip-ghidra # 跳过威胁情报查询 python analyze.py sample.exe --skip-ti # 仅静态报告 — 不调用 LLM python analyze.py sample.exe --no-ai # 针对单次运行覆盖 Ollama 端点/模型 python analyze.py sample.exe --ollama-url http://10.0.0.5:11434 --ollama-model mistral # 自定义 YARA 规则 python analyze.py sample.exe --yara-rules ~/my-rules/ ``` ### 所有标志 | 标志 | 描述 | |---|---| | `--triage` | 分流模式:哈希查询 + 加壳 + 1 次 AI 调用 | | `--model haiku\|sonnet\|opus\|ollama` | AI 后端 (默认:`ollama`) | | `--output / -o` | 输出 HTML 报告路径 | | `--skip-ghidra` | 跳过 Ghidra 无头分析 | | `--skip-floss` | 使用普通 `strings` 代替 FLOSS | | `--skip-ti` | 跳过 VirusTotal + MalwareBazaar | | `--skip-yara` | 跳过 YARA 扫描 | | `--yara-rules PATH` | .yar 文件或目录的路径 | | `--no-ai` | 仅静态分析,不使用 LLM | | `--rag` | RAG 模式:将数据索引到 ChromaDB,运行自动分析 | | `--rag-interactive` | RAG 分析后进入交互式问答 REPL (隐含 `--rag`) | | `--rag-embed-model MODEL` | 覆盖 embedding 模型 (默认:`nomic-embed-text`) | | `--ollama-url URL` | 覆盖本次运行的 Ollama URL | | `--ollama-model MODEL` | 覆盖本次运行的 Ollama 模型 | | `--ollama-num-ctx N` | 覆盖 Ollama 上下文窗口 | | `--ollama-temperature F` | 覆盖本次运行的 Ollama temperature | | `--api-key KEY` | Anthropic API 密钥 (替代环境变量) | ## AI 后端 ### Anthropic Claude | 模型 | 单样本成本 | 使用场景 | |---|---|---| | `haiku` | ~$0.04 | 批量处理,快速分流 | | `sonnet` | ~$0.21 | 标准云端分析 | | `opus` | ~$1.00 | 高度混淆样本,最终报告 | ### Ollama (本地,默认) 无需 API 密钥。通过 `.env` 或 CLI 标志配置: ``` OLLAMA_BASE_URL=http://localhost:11434 # default OLLAMA_MODEL=gemma4:26b # default OLLAMA_EMBED_MODEL=nomic-embed-text # default for RAG embeddings OLLAMA_NUM_CTX=32768 ``` **针对模型的预设** 会在选择模型时自动应用 — temperature、repeat_penalty 和 num_ctx 针对模型系列进行了调优。CLI 标志和环境变量优先于预设。 已测试的模型系列:`gemma4`、`gemma3`、`gemma2`、`llama4`、`llama3`、`mistral`、`qwen`、`phi4`、`deepseek`。 ## 预处理流程 分析之前,流水线会确定最佳分析目标: | 输入 | 操作 | 分析目标 | |---|---|---| | UPX 加壳的 PE | `upx -d` 脱壳 | 脱壳后的 PE → pefile + FLOSS + Ghidra + YARA | | PyInstaller / Python 包 | `pyinstxtractor-ng` + `decompyle3`/`uncompyle6` | 反编译的 Python 源代码 (SOURCE 模式) | | .NET 程序集 | `ilspycmd` 反编译 | 反编译的 C# 源代码 (SOURCE 模式) | | ZIP / 7z / NSIS / Inno / SFX | `7z x` 提取 + payload 选择 | 如需要则递归一次 | **SOURCE 模式** — 当目标是反编译的源代码时: - 源代码块按原样传递给 AI (保留文件结构,不按行排名) - PE 导入被视为容器运行时 — 仅作为次要上下文 - 跳过 Ghidra (伪代码对托管/脚本目标无用) - YARA 对原始样本运行 **NATIVE 模式** — 针对原生 PE 二进制文件: - FLOSS 提取静态、栈和解码字符串 - `[DECODED]` 字符串排名提升 (FLOSS 最高价值输出) - 字符串在 AI 分析前聚类到语义桶中 - Ghidra 提取函数列表 + 最可疑函数的伪代码 ## 分析流水线 ``` suspicious.exe │ ▼ [PHASE 1] Data Collection ├── MD5, SHA256 ├── pefile: headers, sections, entropy, imports, exports, overlay ├── PE metadata: digital signature, PDB path, VS_VERSION_INFO, resources ├── Internal packer detection (UPX, MPRESS, Themida, ASPack...) ├── Preprocessing / artifact routing (unpack, decompile, extract) ├── FLOSS strings (native targets) → [DECODED] boost + clustering └── Ghidra: function list + DecompInterface pseudocode (native targets) │ ▼ [PHASE 2] Threat Intel ├── VirusTotal hash lookup ├── MalwareBazaar lookup └── Temporal imphash analysis (timeline, peak window, compile→submit gap) │ ├── --triage → [PHASE 3] Single AI call → Triage HTML report │ ├── --rag → [PHASE 3a] RAG Index Build (ChromaDB) │ [PHASE 3b] RAG Automated Analysis (6 retrieval queries) │ Optional: Interactive Q&A REPL (--rag-interactive) │ └── full → [PHASE 3] AI Analysis (6 sequential calls) ├── PE Structure Analysis ├── Import Table → MITRE ATT&CK mapping ├── Strings / Source Code Analysis ├── Evasion & Anti-Analysis ├── YARA Rule Generation └── Final Report [PHASE 4] YARA Scanning ├── User rule sets └── AI-generated rule validation [PHASE 5] HTML Report ``` ## 项目结构 ``` malware-analysis/ ├── analyze.py # Main orchestrator + CLI ├── config.py # Tool paths + analysis defaults ├── modules/ │ ├── analytics.py # Deterministic scoring and verdict │ ├── clients.py # OllamaClient + endpoint helpers │ ├── healthcheck.py # Startup checks for external tools │ ├── model_registry.py # Model list, cost estimates, Ollama presets │ ├── pipeline.py # AI context building + prompt orchestration │ ├── reporting.py # HTML report rendering │ ├── static_analysis.py # pefile, FLOSS, Ghidra, preprocessing │ ├── rag.py # Local RAG pipeline (LangChain + ChromaDB) │ ├── threat_intel.py # VirusTotal + MalwareBazaar + temporal analysis │ └── yara_scan.py # YARA scanning (user rules + AI-generated) ├── tests/ ├── .env.example # All supported env vars with comments ├── requirements.txt └── requirements-dev.txt ``` ## 注意事项 - **仓库中无二进制文件** — `.gitignore` 涵盖了常见的二进制扩展名 - **仓库中无密钥** — `.env` 被 git 忽略;文档请使用 `.env.example` - FLOSS 分析在大型二进制文件上可能需要 2–5 分钟 - VT 免费层:流水线在调用之间会自动休眠 `VT_RATE_LIMIT_SECONDS` (默认 15s) - 流水线可完全离线运行,无需 VT/MB — 使用 `--skip-ti` - `OllamaClient` 与 Anthropic SDK 客户端接口兼容;其余代码与后端无关 ## RAG 模式 RAG (检索增强生成) 将所有静态分析输出索引到本地 ChromaDB 向量存储中,并使用检索增强查询来分析样本。所有处理均保持在本地设备上。 ### 前置条件 ``` pip install -r requirements.txt # includes langchain + chromadb ollama pull nomic-embed-text # embedding model ``` ### 使用方法 ``` # 自动化 RAG 分析 → HTML 报告 python analyze.py suspicious.exe --rag # 自动化 + 交互式问答环节 python analyze.py suspicious.exe --rag --rag-interactive # 自定义 embedding 模型 python analyze.py suspicious.exe --rag --rag-embed-model mxbai-embed-large ``` ### 工作原理 1. **阶段 1–2** 正常运行 (数据收集 + 威胁情报) 2. **阶段 3a** — 所有收集的数据 (PE 头、节、导入表、FLOSS 字符串、Ghidra 伪代码、威胁情报) 被分块并嵌入到临时的 ChromaDB 集合中 - PE:每个头块、节、DLL 导入组、异常集合 1 个文档 - 字符串:解码字符串作为单独的高优先级文档;其余字符串按类别聚类 (NETWORK, PERSISTENCE, CRYPTO 等) - Ghidra:每个函数 1 个文档 (自然边界 — 不在函数中间分割);超大函数使用 C 感知分隔符分割 - 威胁情报:每个来源 (VT, MB) 1 个文档 3. **阶段 3b** — 通过 LCEL 检索链回答 6 个预定义分析问题 (匹配标准 6 阶段流程):检索 top-k 块 → 格式化上下文 → 提示本地 LLM → 解析答案 4. **阶段 4–5** — YARA 扫描 + HTML 报告 (显示每节检索到的块来源) 5. **交互式 REPL** (可选) — 询问关于样本的临时问题;输入 `sources` 查看检索到了哪些块 ### 配置 | 变量 | 默认值 | 描述 | |---|---|---| | `OLLAMA_EMBED_MODEL` | `nomic-embed-text` | Ollama embedding 模型 | | `RAG_EMBED_MODEL` | `nomic-embed-text` | embedding 模型的旧别名 | | `RAG_CHUNK_SIZE` | `1500` | 文本块大小 (字符) | | `RAG_CHUNK_OVERLAP` | `200` | 块之间的重叠 | | `RAG_TOP_K` | `5` | 每次查询检索的块数量 | ## 许可证 MIT
标签:AI赋能安全, AI风险缓解, Amass, Anthropic Claude, DAST, DLL 劫持, DNS信息、DNS暴力破解, DNS 反向解析, FLOSS, Ghidra, LLM评估, Ollama, PE文件, Python, Wayback Machine, YARA规则, 云安全监控, 云资产清单, 反汇编, 哈希查询, 大语言模型, 威胁情报, 字符串提取, 开发者工具, 恶意软件分析, 无后门, 网络信息收集, 网络安全, 脱壳, 自动化流水线, 逆向工具, 逆向工程, 隐私保护, 静态分析