anpa1200/String-Analyzer
GitHub: anpa1200/String-Analyzer
面向 CTI 和恶意软件分析工作流的 Python 字符串提取与分类工具,支持自动识别 IOC 指标并生成 AI 就绪分析提示词。
Stars: 6 | Forks: 1
# 字符串分析器
[](https://pypi.org/project/string-analyzer/)
[](https://pypi.org/project/string-analyzer/)
[](https://github.com/anpa1200/String-Analyzer/actions/workflows/ci.yml)
[](https://github.com/anpa1200/String-Analyzer/actions/workflows/publish.yml)
[](LICENSE)
用于 CTI 和恶意软件分析工作流的字符串提取工具:从二进制文件和内存镜像中发现 URL、IP、路径、注册表键、API、命令、编码数据,以及为分析师生成的提示词。
## CTI 用例
当样本或转储文件需要在逆向工程或沙箱执行前进行快速指标发现时,请使用 String Analyzer。其输出旨在用于 IOC 审查、基础设施追踪、YARA/Sigma 规则生成以及映射到 ATT&CK 的分析笔记。
## 防御者输出
| 输出 | 用途 |
|---|---|
| 分类字符串 | IOC 和行为发现 |
| URL / IP / 邮箱 | 追踪和丰富线索 |
| 注册表 / 路径 / DLL | 主机行为上下文 |
| API 名称 | 能力初步研判 |
| 解码候选项 | 混淆审查 |
| AI 就绪提示词 | 结构化的分析师后续工作 |
**String Analyzer** 从二进制文件中提取并分析可打印字符串。它专为需要从可执行文件、内存转储或磁盘映像中快速提取 URL、IP、注册表键、API 名称和其他指标,并可选择生成 AI 就绪分析提示词的**恶意软件分析师**、**逆向工程师**和**取证调查人员**而设计。
- **零运行时依赖**(仅使用 Python 标准库)。
- **单一入口点**:一个支持批处理和交互模式的 CLI。
- **对库友好的 API**:可在您自己的脚本中使用 `analyze_file()` 或底层函数。
**📖 [实用指南 (Medium)](https://medium.com/@1200km/a-practical-guide-to-string-analyzer-extract-and-analyze-strings-from-binaries-without-the-875dc74e4868)** — 分步使用说明、工作流程和示例。
## 目录
- [功能](#-features)
- [安装说明](#-installation)
- [快速开始](#-quick-start)
- [用法](#-usage)
- [命令行选项](#command-line-options)
- [输出模式](#output-modes)
- [交互模式](#interactive-mode)
- [特征分类](#-pattern-categories)
- [编程 API](#-programmatic-api)
- [示例](#-examples)
- [配置与限制](#-configuration-and-limits)
- [安全与防护](#-security-and-safety)
- [开发](#-development)
- [许可证](#-license)
## 功能
| 功能 | 描述 |
|--------|-------------|
| **字符串提取** | ASCII 和 UTF-16LE (Windows PE);可配置最小长度和 `max_bytes`;针对大文件进行分块读取。 |
| **熵** | Shannon 熵(设置 `max_bytes` 时分块计算);高熵暗示存在加壳/加密内容。 |
| **特征检测** | 严格的 IPv4 (0–255)、IPv6(完整和缩写形式)、URL (http/https/ftp/file/ws/wss)、混淆的 URL (hxxp 等)、邮箱、MAC 地址、注册表键、系统路径、DLL、300+ Windows API、CMD/PowerShell、混淆模式。 |
| **内嵌提取** | 在长字符串*内部*发现的 URL、IP、邮箱、MAC(不仅是整行匹配)。 |
| **解码** | Base64(标准和 URL 安全)以及十六进制;解码后的候选项会包含在报告中。 |
| **可疑关键字** | 扩展集合:malware、miner、steal、persist、evasion 等,以及 .NET namespace。 |
| **敏感模式** | `--sensitive`:降低混淆阈值并增加更多关键字,以进行更严格的筛选。 |
| **输出格式** | 未过滤的转储、分类报告或 AI 就绪的 markdown 提示词。 |
| **CLI 与 API** | 完整的 CLI (`--encoding`, `--sensitive`, `--no-embedded`);可编程的 `analyze_file()`;无全局状态。 |
## 安装说明
**环境要求:** Python 3.8 或更高版本。
### PyPI
```
pip install string-analyzer
string-analyzer --help
```
### 从源码安装
```
git clone https://github.com/anpa1200/String-Analyzer.git && cd String-Analyzer
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -e .
```
安装完成后,您将获得 `string-analyzer` 命令。在项目根目录下,您也可以运行:
```
python -m string_analyzer
```
**开发(可选):** `pip install -e ".[dev]"` 会安装 pytest 和 ruff,用于测试和代码检查。
## 快速开始
```
# 分类报告 (默认)
string-analyzer /path/to/binary -o report.txt
# 所有提取的字符串,无分类
string-analyzer /path/to/binary --unfiltered -o strings.txt
# AI 就绪的分析 prompt
string-analyzer /path/to/binary --ai-prompt -o prompt.md
# 交互式:提示输入文件和输出类型
string-analyzer
```
## 用法
### 命令行选项
| 选项 | 描述 |
|--------|-------------|
| `file` | 二进制文件的路径。省略此项将运行**交互模式**。 |
| `-o`, `--output PATH` | 输出文件(默认:`_strings.txt`)。 |
| `--min-length N` | 要提取的字符串的最小长度(默认:4)。 |
| `--max-bytes N` | 读取 N 个字节后停止(针对超大文件的安全措施)。 |
| `--unfiltered` | 输出所有提取的字符串,每行一个(无分类)。 |
| `--filtered` | 输出分类报告(未使用 `--unfiltered` 或 `--ai-prompt` 时的默认选项)。 |
| `--ai-prompt` | 为 AI 助手生成 markdown 提示词。 |
| `--analyze-with {gemini,codex}` | 将分类提示词发送给 **gemini-cli** 或 **codex-cli** 并打印 AI 分析结果。将提示词保存到 `-o`;使用 `--ai-output` 保存 AI 的回复。 |
| `--ai-output PATH` | 将 AI 的回复保存到此文件(与 `--analyze-with` 一起使用时)。 |
| `--encoding {ascii,utf16,both}` | 仅提取 ASCII、仅提取 UTF-16LE 或两者都提取(默认:两者)。 |
| `--sensitive` | 降低混淆阈值;增加可疑关键字。 |
| `--no-embedded` | 不从长字符串内部提取 URL/IP/邮箱。 |
| `-i`, `--interactive` | 强制交互模式(提示输入文件和选项)。 |
| `-q`, `--quiet` | 抑制非错误消息。 |
| `-v`, `--verbose` | 详细日志输出。 |
| `--version` | 显示版本。 |
| `--help` | 显示帮助。 |
### 输出模式
1. **未过滤** (`--unfiltered`):所有提取字符串的排序列表。可用于 grep 或输入到其他工具。
2. **过滤后**(默认):包含熵以及 URLS、IPS、WINDOWS_API_COMMANDS、DLLS、OBFUSCATED 等部分的分类报告。
3. **AI 提示词** (`--ai-prompt`):包含相同分类的 markdown 提示词,要求 AI 分析行为和功能(例如用于恶意软件初步研判)。
### 外部 AI 分析 (`--analyze-with`)
**`--analyze-with`** 选项将分类后的字符串报告直接发送给 AI CLI,这样您只需一条命令即可获得分析结果,而无需手动复制提示词。
- **功能说明:** 在提取并对字符串(URL、IP、API、DLL、混淆等)进行分类后,该工具会构建与 `--ai-prompt` 相同的 markdown 提示词,将其写入由 **`-o`** 指定的路径(以便您保留或重用),然后**将提示词通过管道传递给**选定的 CLI。AI 的回复会打印到终端;您可以使用 **`--ai-output PATH`** 保存它。
- **可选值:** `gemini` — 使用 **gemini-cli**(在您的 PATH 中查找 `gemini` 或 `gemini-cli`)。`codex` — 使用 **Codex CLI**(通过 stdin 传入提示词并执行 `codex exec -`)。
- **前提条件:** 您必须安装以下工具之一并将其添加到 PATH 中:[Gemini CLI](https://github.com/google-gemini/gemini-cli)(例如 `npm i -g @google/generative-ai-cli`)或 [Codex CLI](https://codex.com)。该工具本身不调用云端 API;它仅调用处理身份验证和模型的本地 CLI。
- **示例:**
`string-analyzer suspect.exe --analyze-with gemini -o prompt.txt --ai-output analysis.md`
此命令会将提示词保存到 `prompt.txt`,将其发送给 Gemini,并将 AI 的分析结果写入 `analysis.md`。
### 交互模式
运行 `string-analyzer` 时不带文件参数(或使用 `string-analyzer -i`)。该工具将会:
1. 询问文件路径。
2. 询问是输出所有字符串(未过滤)还是分类报告。
3. 如果选择分类报告:询问是生成 AI 提示词还是普通报告。
4. 询问输出文件路径(附带默认建议)。
交互模式默认将输入限制为 50 MB,以避免意外的资源消耗。
## 特征分类
字符串被分为以下几个类别(输出中会省略空类别):
| 类别 | 描述 |
|----------|-------------|
| `WINDOWS_API_COMMANDS` | 已知的 Windows API 函数名称(300+)。 |
| `DLLS` | 匹配典型 DLL 名称的字符串(例如 `*.dll`)。 |
| `URLS` | HTTP/HTTPS 和类似 URL。 |
| `IPS` | IPv4 地址。 |
| `IPV6` | IPv6 地址。 |
| `EMAILS` | 类似电子邮箱的字符串。 |
| `WINDOWS_REGISTRY_KEYS` | 注册表路径模式。 |
| `POWERSHELL_COMMANDS` | PowerShell cmdlet/命令。 |
| `CMD_COMMANDS` | CMD shell 命令。 |
| `FILES` | 文件路径 / 文件名模式。 |
| `SYSTEM_PATHS` | 系统目录路径。 |
| `OBFUSCATED` | 暗示存在混淆的模式(例如 `h[.]xxp`、点分 IP)。 |
| `DECODED_BASE64` | 成功从 Base64 解码为可打印文本的字符串。 |
| `DECODED_HEX` | 成功从十六进制解码为可打印文本的字符串。 |
| `SUSPICIOUS_KEYWORDS` | 与恶意软件相关的子字符串(例如关键字)。 |
| `SUSPICIOUS_DOTNET` | 与 .NET 相关的可疑 namespace/关键字。 |
| `MAC_ADDRESSES` | MAC 地址(例如 `00:1A:2B:3C:4D:5E`)。 |
该工具还会计算**文件熵**。高熵结合低数量的“有效”模式(API、DLL、CMD/PowerShell)表明可能是**加壳或混淆**的二进制文件;这在报告和 AI 提示词中会予以注明。
## 编程 API
在您自己的 Python 代码中使用该包:
```
from string_analyzer import (
analyze_file,
extract_strings,
detect_patterns,
compute_file_entropy,
generate_normal_output,
generate_ai_prompt,
shannon_entropy,
)
from string_analyzer.analyzer import (
is_likely_obfuscated,
is_mostly_printable,
try_base64_decode,
try_hex_decode,
)
```
### 一次性分析
```
result = analyze_file(
"/path/to/binary",
min_length=4,
max_bytes=None,
encoding="both", # "ascii", "utf16", or "both"
extract_embedded=True, # find URLs/IPs inside long strings
sensitive=False, # True: lower obfuscation thresholds
)
# result["file"], result["entropy"], result["strings"], result["patterns"], result["obfuscated"]
```
### 分步执行
```
from pathlib import Path
path = Path("sample.bin")
entropy = compute_file_entropy(path)
strings = extract_strings(path, min_length=4, max_bytes=10_000_000)
patterns = detect_patterns(strings) # New dict every time; no global state
obfuscated = is_likely_obfuscated(patterns, entropy)
report = generate_normal_output(patterns, entropy, obfuscated)
# 或者:prompt_text = generate_ai_prompt(patterns, entropy, obfuscated)
```
### 函数参考
| 函数 | 描述 |
|----------|-------------|
| `analyze_file(path, min_length=4, max_bytes=None)` | 完整分析;返回包含 `file`、`entropy`、`strings`、`patterns`、`obfuscated` 的字典。 |
| `extract_strings(path, min_length=4, max_bytes=None)` | 提取唯一的可打印字符串;返回 `set[str]`。 |
| `compute_file_entropy(path)` | 文件字节的 Shannon 熵。 |
| `shannon_entropy(s)` | 字符串的 Shannon 熵。 |
| `detect_patterns(strings)` | 对字符串进行分类;返回新的 `dict[str, set[str]]`。 |
| `is_likely_obfuscated(patterns, file_entropy)` | 启发式判断:“有效”模式少且熵 > 阈值。 |
| `generate_normal_output(patterns, entropy, obfuscated)` | 格式化的过滤报告文本。 |
| `generate_ai_prompt(patterns, entropy, obfuscated)` | 用于 AI 分析的 markdown 提示词文本。 |
| `is_mostly_printable(s, threshold=0.9)` | 判断字符串是否主要为可打印 ASCII 字符。 |
| `try_base64_decode(s)` | 如果有效且可打印,则解码 Base64;否则返回 `None`。 |
| `try_hex_decode(s)` | 如果有效且可打印,则解码十六进制;否则返回 `None`。 |
## 示例
**恶意软件初步研判 — 为样本获取 AI 提示词:**
```
string-analyzer suspect.exe --ai-prompt -o triage_prompt.md
# 然后将 triage_prompt.md 粘贴到你的 AI assistant 中。
```
**大文件 — 限制读取大小并获取分类报告:**
```
string-analyzer memory.dump --max-bytes 100000000 -o report.txt
```
**脚本 — 使用 API 仅打印 URL 和 IP:**
```
from string_analyzer import analyze_file
r = analyze_file("sample.bin")
for s in r["patterns"].get("URLS", []):
print(s)
for s in r["patterns"].get("IPS", []):
print(s)
```
**仅提取较长的字符串:
```
string-analyzer binary --min-length 8 -o long_strings.txt
```
**最大敏感度 (UTF-16 + 内嵌 URL + 降低混淆阈值):**
```
string-analyzer suspect.exe --encoding both --sensitive -o report.txt
```
**发送给 Gemini 或 Codex 进行 AI 分析(要求 PATH 中包含 gemini-cli 或 codex):**
```
string-analyzer suspect.exe --analyze-with gemini -o prompt.txt --ai-output analysis.md
string-analyzer suspect.exe --analyze-with codex --ai-output analysis.md
```
## 配置与限制
- **最小字符串长度:** `--min-length`(默认为 4)。值越大越能减少噪音并加快分析速度。
- **最大读取字节数:** `--max-bytes`。省略则无限制;针对超大文件设置此值可避免高内存占用。
- **混淆启发式规则:** 在 `string_analyzer.patterns` 中使用 `MIN_USEFUL_COUNT`(默认为 10)和 `ENTROPY_THRESHOLD`(默认为 5.0)实现。当“有效”模式(Windows API、DLL、CMD、PowerShell)的数量低于数量阈值,且文件熵高于熵阈值时,文件会被标记为可能已混淆。
## 安全与防护
- **输入文件:** String Analyzer 仅读取文件并提取可打印字符串;它不会执行或解释代码。尽管如此,在未进行适当隔离的敏感环境中,请避免对不受信任的二进制文件运行此操作。
- **大文件:** 使用 `--max-bytes`(或 API 中的 `max_bytes` 参数)来限制读取量;交互模式默认使用 50 MB 限制。
- **输出:** 报告可能包含 URL、IP 和其他指标。请根据您的安全和隐私策略处理输出内容。
## 开发
```
pip install -e ".[dev]"
ruff check string_analyzer tests
pytest tests/ -v
```
CI 在 push/PR 时运行:在 Python 3.8、3.10 和 3.12 上进行 Ruff lint 和 pytest。
**文档:** [实用指南 (Medium)](https://medium.com/@1200km/a-practical-guide-to-string-analyzer-extract-and-analyze-strings-from-binaries-without-the-875dc74e4868) · [docs/DOCUMENTATION.md](docs/DOCUMENTATION.md)(模式、启发式规则、工作流程)
## 相关仓库与文章
| 资源 | 链接 |
|----------|------|
| **String-Analyzer(此仓库)** | [GitHub](https://github.com/anpa1200/String-Analyzer-) · [Medium: String Analyzer 指南](https://medium.com/@1200km/a-practical-guide-to-string-analyzer-extract-and-analyze-strings-from-binaries-without-the-875dc74e4868) |
| **Static-malware-Analysis-Orchestrator** | [GitHub](https://github.com/anpa1200/Static-malware-Analysis-Orchestrator) — 一键式流水线(初步研判、字符串、PE 导入、脱壳) · [Medium:完整工作流](https://medium.com/@1200km/basic-static-malware-analysis-from-triage-to-unpacking-explained-and-automated-9442ef3b11b8) |
| **PE-Import-Analyzer** | [GitHub](https://github.com/anpa1200/PE-Import-Analyzer) · [Medium: PE Import Analyzer 指南](https://medium.com/@1200km/pe-import-analyzer-a-practical-guide-for-malware-analysts-and-reverse-engineers-29b8b98aeaf3) |
| **Unpacker** | [GitHub](https://github.com/anpa1200/Unpacker) · [Medium: Unpacker 指南](https://medium.com/@1200km/unpacker-a-practical-guide-to-modular-malware-packer-detection-and-unpacking-cf8ba924f25b) |
| **Basic-File-Information-Gathering-Script** | [GitHub](https://github.com/anpa1200/Basic-File-Information-Gathering-Script) · [Medium:文件元数据与静态分析](https://medium.com/@1200km/one-tool-to-rule-them-all-file-metadata-static-analysis-for-malware-analysts-and-soc-teams-c6dba1f5b7de) |
| **作者** | [Medium @1200km](https://medium.com/@1200km) |
## 许可证
基于 **GNU General Public License v3.0** 分发。详情请参阅 [LICENSE](LICENSE)。
欢迎参与贡献;请提交 issue 或发起 pull request。
## 1200km 生态系统
本项目是 1200km 安全研究生态系统的一部分。使用 [AdversaryGraph](https://1200km.com/adversarygraph/) 进行从 CTI 到检测的工作流、ATT&CK/ATLAS 映射、攻击者关联分析、IOC 丰富化以及为分析师生成的报告。
- [AdversaryGraph 项目主页](https://1200km.com/adversarygraph/)
- [AdversaryGraph 文档](https://1200km.com/adversarygraph-docs/)
- [实时 ATT&CK/ATLAS 工作区](https://1200km.com/threat-matrix/)
- [1200km 安全研究生态系统](https://1200km.com/)
标签:DAST, Python, 云资产清单, 威胁情报, 字符串提取, 安全规则引擎, 开发者工具, 恶意软件分析, 数字取证, 无后门, 自动化脚本, 逆向工具, 逆向工程