Find key strings from cluttered text — 基于规则流(Rule Flow)的高性能文本扫描引擎,支持并行匹配、多级过滤与高亮报告,常用于 CTF、敏感信息(API Key / Token)检测与高熵字符串提取。
- 规则流引擎:
AnyRule { flow, out }四阶段管道 — 基础提取 → 熵过滤 → 上下文断言 → 自定义校验(见src/rules.rs:378get_rules) - 并行扫描:
analyze_with基于rayon并发执行全部规则(src/lib.rs:195) - 复合熵评分:融合香农熵、差分熵、2-gram 熵的加权幂平均(
P=-1.6),归一化至 0–10,惩罚低随机性规律串(src/entropy.rs:132composite_entropy) - 启发式校验:
is_base64/is_hex/upper_prob等开箱即用(src/tool.rs:244,src/tool.rs:376) - 合并高亮:
AnalyzeResult自动合并重叠区间,{:#}开启 ANSI 颜色(src/lib.rs:240) - 分布式注册:
lazy_rule!+inventory实现规则的声明式注册与ALL_RULES懒加载(src/rules.rs:195,src/rules.rs:365) - 风险融合:
AnalyzeResult::score()采用1 - ∏(1-Pi)独立事件联合公式,0–100 分(src/lib.rs:227)
添加依赖到 Cargo.toml:
[dependencies]
string-analyze = "0.1.0"基本用法:
use string_analyze::{analyze_with, rules::ALL_RULES};
fn main() {
let input = r#"
Base64: mTyqm7wjODkrNLcWl0eqO8K8gc1BPk1GNLgUpI== 444 m7wjODkrNLcWl0eqO8K8gc1BPk1GNLgUpI==
api_key = "12345678abcdefgh";
"#;
let result = analyze_with(input, ALL_RULES.as_slice());
println!("score: {}", result.score());
// `{:#}` 开启 ANSI 颜色高亮
println!("{:#}", result);
}按需过滤规则(按模块路径 / 重要程度):
use string_analyze::rules::get_rules;
let rules = get_rules(|module_path, importance| {
// 仅保留非 compiler 规则且 importance >= 30
!module_path.contains("compiler") && importance >= 30
});
let result = string_analyze::analyze_with("AKIAIOSFODNN7EXAMPLE", &rules);
assert!(result.score() > 0);自定义规则(lazy_rule! DSL):
use string_analyze::lazy_rule;
use string_analyze::entropy::entropy;
lazy_rule!(
RE_FLAG = r#"(?i)\b[a-z0-9_.-]{0,20}(?:flag|ctf)[a-z0-9\s-]{0,4}\{[^\{\}\n=\t()]{4,256}\}"#,
"发现标准 flag",
100
);完整 DSL 参数顺序见 src/rules.rs:144 文档:$name = $regex|closure, $describe, $importance [, $min_entropy] [, ($before,$after)] [, |slice,input| bool]。
cargo install string-analyze
# 逐行扫描 stdin,仅输出命中(score != 0)的行
cat dump.txt | string-analyze
echo 'api_key = "12345678abcdefgh"' | string-analyze
echo "mTyqm7wjODkrNLcWl0eqO8K8gc1BPk1GNLgUpI==" | string-analyzesrc/main.rs:5 实现:按行读取 stdin,对每行执行 analyze_with(&line, &ALL_RULES) 并以 {:#} 打印高亮报告。
内置规则按目录组织(src/rules/):
| 模块 | 说明 | 示例 |
|---|---|---|
rules::core::flag |
CTF flag 格式 | flag{...} |
rules::core::apikey / apikey_ai / cloudkey |
云服务与 AI 提供商密钥 | AWS / Aliyun / OpenAI |
rules::core::hash / blockchain / pii |
哈希、私钥、身份信息 | - |
rules::core::coding / compiler / constant |
编码特征、编译产物、常量 | - |
rules::b64file |
Base64 编码的文件头 | H4sI... (gzip), iVBORw0KGgo... (PNG) |
rules::hexfile |
十六进制转储 | 0xAA... |
rules::coding |
通用编码检测 | - |
所有规则通过 ALL_RULES: LazyLock<Vec<AnyRule>> (src/rules.rs:365) 懒加载,get_rules 支持过滤。
| 项 | 路径 | 说明 |
|---|---|---|
analyze_with |
src/lib.rs:195 |
并行执行规则集,返回 AnalyzeResult |
AnyRule::new / add_flow / detect |
src/lib.rs:148, src/lib.rs:161, src/lib.rs:173 |
规则构建与单条检测 |
State / RuleResult / Hit / AnalyzeResult |
src/lib.rs:70, src/lib.rs:109, src/lib.rs:23, src/lib.rs:208 |
核心数据结构 |
entropy / delta_entropy / gram_entropy2 / composite_entropy |
src/entropy.rs:37, src/entropy.rs:57, src/entropy.rs:81, src/entropy.rs:132 |
熵计算 |
has_keyword / has_regex / is_base64 / is_hex |
src/tool.rs:61, src/tool.rs:187, src/tool.rs:244, src/tool.rs:376 |
匹配工具 |
lazy_rule! / RawRule / Assertion |
src/rules.rs:195, src/rules.rs:65, src/rules.rs:21 |
规则定义 |
本项目当前未声明 [features],default 即全量功能。
Rust 1.85(见 Cargo.toml rust-version,edition = "2024" 要求的最低版本)。与 rustc 1.98.1 已验证通过。
cargo check --all-targets --all-features
cargo test --doc --all-features
cargo test --all-features
cargo doc --no-deps --all-features欢迎提交 Issue 与 Pull Request。请确保 cargo test --doc 与 cargo doc 无新增告警,新增公开 API 需补充 rustdoc 及 CHANGELOG.md 条目。
本项目采用 MIT 协议,Copyright (c) 2026 ZEROLINGG。