string-analyze 0.1.1

Find key strings from cluttered text
Documentation
// string_analyze/src/rules/core/coding.rs
use crate::rules::lazy_rule;
use crate::tool::{is_base64, is_hex};

lazy_rule!(
    RE_BASE64 = r#"\b[A-Za-z0-9+/\-_]{8,}={0,2}"#, // 筛选器
    "发现 Base64 编码数据",                        // 描述
    40,                                            // 重要性
    3.0,                                           // 最低混合熵要求
    |s, _| is_base64(s)                            // 验证闭包
);
lazy_rule!(
    RE_HEX = r#"(?i)(?:(?:0x|\\x|%)?[0-9a-f]{2}[\s,;:\-|]*){2,}(?:0x|\\x|%)?[0-9a-f]{2}"#,
    "发现 十六进制 (Hex) 编码数据",
    45,
    2.0,
    |s, _| is_hex(s)
);
lazy_rule!(
    RE_BRAINFUCK = r#"(?:[<>+\-.\[\],]{20,})"#,
    "发现疑似 Brainfuck 代码",
    40,
    |slice, _input| {
        let op_types = ['>', '<', '+', '-', '.', ',', '[', ']']
            .iter()
            .filter(|&&op| slice.contains(op))
            .count();
        op_types >= 2
    }
);
lazy_rule!(
    RE_JSFUCK = r#"(?:[\[\]()!+]\s*){20,}"#,
    "发现疑似 JSFuck 代码",
    40,
    |s, _| s.contains('!') || s.contains('(') || s.contains(')')
);
lazy_rule!(
    RE_MORSE = r#"(?:[.-]{1,6}(?:[ \t]+|[ \t]*/[ \t]*)){4,}[.-]{1,6}"#,
    "发现 摩斯电码",
    40
);
lazy_rule!(
    RE_BACON_HINT = r#"(?i)\b(?:aabbb|ababa|baaba|babba|abbba){5,}\b"#,
    "发现 疑似培根密码特征",
    40
);
lazy_rule!(
    RE_FOYAN = r#"(?:佛曰|如是我闻|舍利弗|须菩提|婆伽婆|摩诃萨|世尊|比丘|阿耨多罗|三藐三菩提)?[::]?\s*[\u{4e00}-\u{9fa5}]{15,}"#,
    "发现 佛曰编码",
    40,
    |slice, _| {
        let trimmed = slice.trim_start();
        if trimmed.starts_with("佛曰")
            || trimmed.starts_with("如来")
            || trimmed.starts_with("如是我闻")
        {
            return true;
        }

        // 核心特征字
        let high_weight_dict = [
            '皤', '埵', '阇', '墀', '迦', '楞', '咩', '钵', '醯', '羯', '唎', '娑', '谛', '穆',
            '怛', '陀', '哆',
        ];

        // 次核心特征字
        let low_weight_dict = [
            '佛', '菩', '提', '萨', '摩', '诃', '般', '若', '波', '罗', '蜜', '阿', '弥', '舍',
            '利', '南', '无',
        ];

        let mut score = 0;

        let check_len = slice.chars().count().min(50);

        for c in slice.chars().take(check_len) {
            if high_weight_dict.contains(&c) {
                score += 2;
            } else if low_weight_dict.contains(&c) {
                score += 1;
            }
        }

        score >= 10
    }
);
// [entropy          ] [3.156]	~呜嗷~~嗷嗷呜~嗷呜喵呜喵呜喵~嗷~~呜~喵喵呜嗷喵嗷呜嗷呜嗷~喵~呜呜呜喵嗷呜喵喵喵呜喵喵
// [delta_entropy    ] [3.798]	~呜嗷~~嗷嗷呜~嗷呜喵呜喵呜喵~嗷~~呜~喵喵呜嗷喵嗷呜嗷呜嗷~喵~呜呜呜喵嗷呜喵喵喵呜喵喵
// [gram_entropy2    ] [3.798]	~呜嗷~~嗷嗷呜~嗷呜喵呜喵呜喵~嗷~~呜~喵喵呜嗷喵嗷呜嗷呜嗷~喵~呜呜呜喵嗷呜喵喵喵呜喵喵
// [composite_entropy] [4.075]	~呜嗷~~嗷嗷呜~嗷呜喵呜喵呜喵~嗷~~呜~喵喵呜嗷喵嗷呜嗷呜嗷~喵~呜呜呜喵嗷呜喵喵喵呜喵喵
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// [entropy          ] [2.962]	~呜嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷呜嗷嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷呜嗷嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷呜嗷嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷
// [delta_entropy    ] [3.540]	~呜嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷呜嗷嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷呜嗷嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷呜嗷嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷
// [gram_entropy2    ] [3.540]	~呜嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷呜嗷嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷呜嗷嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷呜嗷嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷
// [composite_entropy] [3.796]	~呜嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷呜嗷嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷呜嗷嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷呜嗷嗷嗷嗷嗷呜呜呜呜嗷呜嗷呜呜喵呜喵嗷喵嗷喵呜~呜~嗷~嗷~呜嗷
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// [entropy          ] [1.573]	~~~~~~~~~~~!!!!!!!!!!!!!!###############
// [delta_entropy    ] [0.343]	~~~~~~~~~~~!!!!!!!!!!!!!!###############
// [gram_entropy2    ] [1.833]	~~~~~~~~~~~!!!!!!!!!!!!!!###############
// [composite_entropy] [0.789]	~~~~~~~~~~~!!!!!!!!!!!!!!###############
lazy_rule!(
    RE_SHOUYIN = r#"[咯嘤呜呀哈嘿嗷喵啊~~]{15,}"#,
    "发现 兽音编码",
    40,
    3.5 // 最小混合熵要求
);

lazy_rule!(
    RE_OOK = r#"(?i)(?:Ook[.\!?]\s*){8,}"#,
    "发现 Ook! 混淆代码",
    45
);
lazy_rule!(
    RE_BRACKETS = r#"(?:[\[\](){}<>]\s*){20,}"#,
    "发现 括号混淆 特征",
    35
);
lazy_rule!(
    RE_ZERO_WIDTH = r#"[\u{200b}-\u{200f}\u{2060}\u{2061}\u{2062}\u{2063}\u{2064}\u{feff}]{10,}"#,
    "发现 零宽字符隐写",
    35
);