Skip to main content

string_analyze/rules/core/
coding.rs

1// string_analyze/src/rules/core/coding.rs
2use crate::rules::lazy_rule;
3use crate::tool::{is_base64, is_hex};
4
5lazy_rule!(
6    RE_BASE64 = r#"\b[A-Za-z0-9+/]{8,}={0,2}"#, // 筛选器
7    "发现 Base64 编码数据",   // 描述
8    40, // 重要性
9    3.0,    // 最低混合熵要求
10    |s, _| is_base64(s) // 验证闭包
11);
12lazy_rule!(
13    RE_HEX = r#"(?i)(?:(?:0x|\\x|%)?[0-9a-f]{2}[\s,;:\-|]*){2,}(?:0x|\\x|%)?[0-9a-f]{2}"#,
14    "发现 十六进制 (Hex) 编码数据",
15    45,
16    2.0,
17    |s, _| is_hex(s)
18);
19lazy_rule!(
20    RE_BRAINFUCK = r#"(?:[<>+\-.\[\],]{20,})"#,
21    "发现疑似 Brainfuck 代码",
22    40,
23    |s, _| {
24        let op_types = ['>', '<', '+', '-', '.', ',', '[', ']']
25            .iter()
26            .filter(|&&op| s.contains(op))
27            .count();
28        op_types >= 2
29    }
30);
31lazy_rule!(
32    RE_JSFUCK = r#"(?:[\[\]()!+]\s*){20,}"#,
33    "发现疑似 JSFuck 代码",
34    40,
35    |s, _| s.contains('!') || s.contains('(') || s.contains(')')
36);
37lazy_rule!(
38    RE_MORSE = r#"(?:[.-]{1,6}(?:[ \t]+|[ \t]*/[ \t]*)){4,}[.-]{1,6}"#,
39    "发现 摩斯电码",
40    40
41);
42lazy_rule!(
43    RE_BACON_HINT = r#"(?i)\b(?:aabbb|ababa|baaba|babba|abbba){5,}\b"#,
44    "发现 疑似培根密码特征",
45    40
46);
47lazy_rule!(
48    RE_FOYAN = r#"佛?曰?[::]?\s*[\u{4e00}-\u{9fa5}]{20,}"#,
49    "发现 佛曰编码",
50    40
51);
52lazy_rule!(
53    RE_SHOUYIN = r#"[咯嘤呜呀哈嘿嗷啊~]{10,}"#,
54    "发现 兽音编码",
55    40
56);
57
58lazy_rule!(
59    RE_OOK = r#"(?i)(?:Ook[.\!?]\s*){8,}"#,
60    "发现 Ook! 混淆代码",
61    45
62);
63lazy_rule!(
64    RE_BRACKETS = r#"(?:[\[\](){}<>]\s*){20,}"#,
65    "发现 括号混淆 特征",
66    35
67);
68lazy_rule!(
69    RE_ZERO_WIDTH = r#"[\u{200b}-\u{200f}\u{2060}\u{2061}\u{2062}\u{2063}\u{2064}\u{feff}]{10,}"#,
70    "发现 零宽字符隐写",
71    35
72);
73