srini-cybersec/malwarelens

GitHub: srini-cybersec/malwarelens

一款纯 Python 静态恶意软件分析工具,无需执行样本即可解析多种文件格式、提取 IOC、匹配 YARA 规则并生成威胁评分报告。

Stars: 0 | Forks: 0

# MalwareLens [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/02d5159cf3091555.svg)](https://github.com/srini-cybersec/malwarelens/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/) [![Coverage](https://img.shields.io/badge/coverage-90%25-brightgreen.svg)](#testing) MalwareLens 无需执行即可剖析可疑文件。它可解析 PE / ELF / Mach-O / PDF / 脚本格式,提取 ASCII 和 UTF-16LE 字符串,计算每个节的 Shannon 熵,运行内置的类 YARA 规则包(覆盖 20 种 MITRE ATT&CK 技术),并生成单一的人类可读裁决以及适用于 SOAR 流水线的 JSON / HTML / 控制台报告。 ## 为什么选择 MalwareLens? | 问题 | MalwareLens 的解决方案 | |---|---| | 动态沙箱成本高昂且可被检测 | 100% **静态** — 从不执行样本 | | `pefile`/`lief` 引入大量 C 依赖 | **纯 Python** 解析器,总共仅四个固定依赖 | | YARA 需要单独的编译器/运行时 | **内置** 规则引擎 + 20 条精选规则 | | IOC 提取通常是临时 grep | 结构化 **类型化 IOC**,支持去重 + RFC1918 过滤 | | 每个样本的排查需要数分钟 | 单条 CLI 命令即可实现亚秒级分析 | ## 架构 ``` ┌─────────────────────────────────────────────┐ │ malwarelens.cli │ │ scan / batch / rules / hash subcommands │ └────────────────────────┬────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ core.analyzer.Analyzer │ │ (orchestrates every analysis stage) │ └────────────────────────┬────────────────────┘ │ ┌────────────┬────────────┬──────┴──────┬────────────┬────────────┐ ▼ ▼ ▼ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌────────────┐ ┌──────────┐ ┌─────────┐ ┌──────────┐ │ hashing │ │ entropy │ │ strings │ │ IOC │ │ yara_ │ │ pe_/ │ │ MD5.. │ │ section │ │ ASCII/wide │ │extractor │ │ engine │ │elf_parser│ │ imphash │ │ packing │ │ printable │ │ typed │ │ 20 rules│ │ headers │ └──────────┘ └──────────┘ └────────────┘ └──────────┘ └─────────┘ └──────────┘ │ │ │ │ │ │ └────────────┴────────────┴──────┬──────┴────────────┴────────────┘ ▼ ┌─────────────────┐ │ scoring (0-100)│ │ MALICIOUS / │ │ SUSPICIOUS / │ │ LOW_RISK / CLEAN│ └────────┬────────┘ ▼ ┌─────────────────────────┐ │ reports: JSON · HTML · │ │ Rich console │ └─────────────────────────┘ ``` ## 快速开始 ``` # 1. 克隆与安装 git clone https://github.com/srini-cybersec/malwarelens.git cd malwarelens pip install -e . # 2. 扫描样本 malwarelens scan suspicious.exe # 3. 生成 JSON + HTML 报告 malwarelens scan suspicious.exe \ --json reports/sample.json \ --html reports/sample.html # 4. 对全部语料库进行分类 malwarelens batch corpus/*.bin --out-dir reports/ --html # 5. 列出内置规则包 malwarelens rules ``` ### Docker ``` docker build -t malwarelens . docker run --rm -v "$PWD/samples:/samples:ro" malwarelens \ scan /samples/suspicious.exe --quiet --json /samples/out.json ``` ## 示例 CLI 输出 ``` ╭───────────────────────── MalwareLens ─────────────────────────╮ │ Verdict: MALICIOUS Score: 88/100 Format: PE Size: 8192 │ ╰───────────────────────────────────────────────────────────────╯ Hashes MD5 a3c7f... SHA-256 92b1c8... imphash 4f8d9e... Rule Matches Rule Sev Tags ───────────────────────────────────────────────────────────── suspicious_process_injection_apis 25 defense-evasion, T1055 hollowing_or_doppelganging 30 T1055.012 ransom_note_keywords 45 ransomware, T1486 anti_debug_apis 15 anti-debug, T1622 IOCs (12) url http://malicious.example.com/c2 ipv4 45.55.123.55 registry HKEY_LOCAL_MACHINE\Software\...\Run ... ``` CLI 退出码与裁决结果对应 — `CLEAN`/`LOW_RISK` 为 `0`,`SUSPICIOUS` 为 `1`,`MALICIOUS` 为 `2`,分析器错误为 `3` — 使其可直接集成到 CI/CD 的 `fail-on` 门禁中。 ## Python API ``` from pathlib import Path from malwarelens import Analyzer, Verdict analyzer = Analyzer() result = analyzer.analyze_path(Path("suspicious.exe")) print(result.score.verdict, result.score.score) for match in result.rule_matches: print(f" - {match.rule_name} (severity={match.severity})") for ioc in result.iocs: print(f" {ioc.type:<10} {ioc.value}") if result.score.verdict is Verdict.MALICIOUS: raise SystemExit("Quarantine triggered") ``` ### 添加自定义规则 ``` from malwarelens import Analyzer from malwarelens.core.yara_engine import Rule, text analyzer = Analyzer() analyzer.add_rule( Rule( name="my_org_keyword_leak", severity=40, description="Sample references internal hostname.", patterns=(text("a", "INTERNAL-DC01", nocase=True),), condition="any", tags=("data-exfil",), ) ) ``` ## 配置 所有设置均从 `MALWARELENS_*` 环境变量读取,操作人员无需修改代码即可覆盖行为: | 变量 | 默认值 | 描述 | |---|---|---| | `MALWARELENS_MIN_STRING_LENGTH` | `6` | 可打印字符串的最小长度 | | `MALWARELENS_MAX_STRINGS` | `50000` | 每个样本提取字符串的上限 | | `MALWARELENS_MAX_FILE_BYTES` | `268435456` | 拒绝超过此大小的文件 | | `MALWARELENS_ENTROPY_PACK_THRESHOLD` | `7.2` | 节熵值 → 判定为加壳 | | `MALWARELENS_ENTROPY_BLOCK_SIZE` | `256` | 熵值图的块大小 | | `MALWARELENS_SCORE_MALICIOUS` | `70` | 分数 → `MALICIOUS` 裁决 | | `MALWARELENS_SCORE_SUSPICIOUS` | `40` | 分数 → `SUSPICIOUS` 裁决 | | `MALWARELENS_COLOR` | `true` | 强制启用/禁用终端颜色 | ## 内置规则包 | 规则 | 严重性 | MITRE | 描述 | |---|---|---|---| | `suspicious_process_injection_apis` | 25 | T1055 | VirtualAllocEx/WriteProcessMemory/CreateRemoteThread 组合 | | `hollowing_or_doppelganging` | 30 | T1055.012 | NtUnmapViewOfSection + SetThreadContext + ResumeThread | | `anti_debug_apis` | 15 | T1622 | IsDebuggerPresent / CheckRemoteDebuggerPresent 等 | | `anti_vm_strings` | 20 | T1497 | VBoxService、vmtoolsd、QEMU 等 | | `persistence_registry_runkey` | 20 | T1547.001 | Run / RunOnce 键写入 | | `credential_access_lsass` | 35 | T1003.001 | LSASS 转储原语 | | `ransomware_extensions` | 40 | T1486 | 大规模文件扩展名枚举 | | `ransom_note_keywords` | 45 | T1486 | "your files have been encrypted" 等 | | `upx_packer` | 20 | — | UPX 节名称 | | `cobalt_strike_beacon_strings` | 50 | — | Beacon DLL 字符串 | | `mimikatz_strings` | 55 | T1003 | Mimikatz 横幅 / 模块名称 | | `webshell_php_eval` | 40 | T1505.003 | `eval(base64_decode(...))` 模式 | | `wmi_persistence` | 25 | T1546.003 | EventFilter / CommandLineEventConsumer | | ... | | | 共 20 条规则 — 详见 [`src/malwarelens/rules/builtin.py`](src/malwarelens/rules/builtin.py) | ## 威胁评分机制 0-100 的评分聚合了四类信号(每类均有上限,防止单一来源主导): | 信号 | 最高分值 | 来源 | |---|---|---| | YARA 规则匹配 | 80 | 每条规则的 `severity` 之和(有上限) | | 高熵节 | 15 | 每个加壳节 ≥ 64 B | | 高风险导入 | 20 | Win32 进程注入 / 凭据 API | | 可操作 IOC | 10 | URL、IP、注册表键、BTC 地址 | 裁决映射可通过环境变量配置 — 默认值: | 分数 | 裁决 | |---|---| | 0 – 19 | `CLEAN` | | 20 – 39 | `LOW_RISK` | | 40 – 69 | `SUSPICIOUS` | | 70 – 100 | `MALICIOUS` | ## 安全注意事项 * **所有分析均为静态。** MalwareLens 从不执行、解压或动态解析样本。可在常规开发者工作站上安全运行,但分析真实恶意软件仍应在隔离环境中进行。 * **对抗性输入。** PE/ELF 解析器具有防御性:格式错误的偏移、大小或魔数将返回空结果而非抛出异常,因此恶意样本无法使分析器崩溃。 * **无出站网络连接。** MalwareLens 不发起任何网络调用 — 无哈希查询、无规则下载、无遥测。这使其适用于气隙环境和事件响应工作,在这些场景中数据外泄风险至关重要。 * **资源限制。** `MALWARELENS_MAX_FILE_BYTES` 和 `MALWARELENS_MAX_STRINGS` 限制了攻击者构造输入时的内存使用量。 * **样本数据无执行路径。** 样本字节仅被解析,绝不通过 `eval`、`exec` 或 `subprocess` 执行。 ## 测试 ``` pip install -r requirements-dev.txt pytest tests/ --cov=malwarelens --cov-report=term-missing ``` * **126 个测试**,**90% 行覆盖率** * 测试在内存中构建确定性的 PE + ELF 固件 — 不提交真实恶意软件样本。 * CI 在每次推送时运行 `black`、`ruff`、`mypy`、`bandit`、`safety` 和 `pytest`。 ## 许可证 MIT — 详见 [`LICENSE`](LICENSE)。
标签:DAST, DNS信息、DNS暴力破解, DNS 反向解析, ELF文件, IOC提取, IP 地址批量处理, LNA, Mach-O, MITRE ATT&CK映射, PDF分析, PE文件, Python安全工具, SOAR集成, YARA规则, 云安全监控, 反病毒, 域名收集, 威胁情报, 威胁评分, 子域名变形, 子域名暴力破解, 字符串提取, 开发者工具, 恶意软件分析, 恶意软件逆向工程, 搜索语句(dork), 样本特征提取, 沙箱替代方案, 熵分析, 网络信息收集, 网络安全, 网络安全审计, 自动化检测, 请求拦截, 隐私保护, 静态分析