sumeshi/langscan

GitHub: sumeshi/langscan

一款 Rust 编写的命令行工具,用于在文本中扫描和标记多种非拉丁脚本及语言提示,辅助数字取证和恶意软件分析中的语言识别。

Stars: 7 | Forks: 0

# langscan 一个小巧的 Rust CLI,用于在文本中查找罕见的脚本和语言提示。 ## 使用场景 - 扫描取证期间从 MFT 导出的文件路径、ADS 名称或恢复的文本,以识别使用外语脚本创建或标记的文件。 - 扫描来自 PE 文件、DLL、shellcode 或未加壳恶意软件的 `strings` 输出,以发现与操作者、工具或受害目标相关的语言提示。 - 检查提取的日志、命令历史记录或释放的文本工件,查找中文、俄语、韩语、日语、阿拉伯语、波斯语、希伯来语、乌尔都语、泰语、印地语、希腊语、土耳其语、波兰语、乌克兰语或越南语内容。 - 递归梳理目录,在进行更深入的反向工程或归因分析之前,发掘多语言文件名或嵌入文本。 ## 用法 **假定输入为 UTF-8 编码。** ``` # 扫描文件 (默认: ar/cjk/el/fa/he/hi/ja/ko/pl/ru/th/tr/uk/ur/vi; cjk 展开为 cn+tw+ja, ko 展开为 dprk+rok) langscan ./input.txt # 从 stdin 读取 cat input.txt | langscan # 限制语言 langscan --lang ru --lang cjk input.txt # 仅显示无匹配项的行 langscan -v --lang ja input.txt # 包含韩语区域标签 (ko 会自动添加 dprk/rok) langscan --lang ko input.txt # 添加自定义 keyword hints langscan --keyword dprk=juche --keyword rok=hanguk input.txt # 从文件加载 keyword hints langscan --keyword-file keywords.txt input.txt # 递归进入目录 langscan -r ./samples # 显示匹配统计信息而非匹配行 langscan --stats -r ./samples ``` ## 输出 文本输出(默认)使用: ``` [L3:cjk,ja] line text with ANSI highlights ``` 当扫描多个文件时,会包含文件路径: ``` [path/to/file:L3:cjk,ja] line text with ANSI highlights ``` JSON 输出按标签对行号进行分组: ``` langscan --format json input.txt ``` ``` [ { "file": "input.txt", "hits": { "ja": [2, 5], "ru": [7] } } ] ``` JSON Lines 每匹配一行输出一条记录: ``` langscan --format json-lines input.txt ``` 也支持 YAML: ``` langscan --format yaml input.txt ``` 统计模式会打印每种语言的计数,而不是行输出: ``` langscan --stats input.txt langscan --stats -r ./samples ``` 关键字文件每行使用一个 `lang=word` 条目。空行和以 `#` 开头的行将被忽略。 ``` # keywords.txt dprk=juche rok=hanguk ru=moskva ``` ## CLI ``` langscan [...] Options: -l, --lang Target selectors (repeatable or comma-separated) -v, --invert-match Show only lines with no detected labels --keyword Add keyword mapping like lang=word (repeatable) --keyword-file Load keyword mappings from a file, one lang=word per line --format Output format: text|json|json-lines|yaml -r, --recursive Recurse into directories --stats Show match statistics ``` 接受的 `--lang` 值: - `ar`:阿拉伯语,阿拉伯语地区 - `cjk`:遍及中国、日本和韩国的 CJK 表意文字 - `el`:希腊语,希腊 - `fa`, `fas`, `per`, `persian`, `farsi`:波斯语,伊朗 - `he`, `heb`, `hebrew`:希伯来语,以色列 - `hi`:印地语 / 天城文,印度 - `ja`:日语,日本 - `ko`:韩语,通用 - `ko-kr`, `rok`:韩语,韩国 - `ko-kp`, `dprk`:韩语,朝鲜 - `pl`, `pol`, `polish`:波兰语,波兰 - `ru`:俄语,基于西里尔字母的文本 - `th`:泰语,泰国 - `tr`, `tur`, `turkish`:土耳其语,土耳其 - `uk`, `ukr`, `ukrainian`:乌克兰语,乌克兰 - `ur`, `urd`, `urdu`:乌尔都语,巴基斯坦 - `vi`:越南语,越南 - `zh-cn`, `zh-hans`, `cn`:简体中文,中国 - `zh-tw`, `zh-hant`, `tw`:繁体中文,台湾 关于语言扩展的说明: - 选择 `cjk` 会自动将 `cn`(简体中文)、`tw`(繁体中文)和 `ja`(日语)添加到扫描目标中。这适用于显式指定的 --lang cjk 以及默认语言列表。 - 选择 `ko` 会自动将 `dprk`(朝鲜)和 `rok`(韩国)添加到扫描目标中。 - `cjk` 不会添加 `ko`;韩语(谚文)是与 CJK 表意文字分离的独立脚本家族。 内置的 `cn` / `tw` 标记派生自 Unicode Unihan 简体/繁体变体数据。 为了保持标签的保守性,日文常用汉字被排除在这些内置标记表之外。 一些衍生自拉丁语系的语言标签(如 `pl`、`tr` 和 `vi`)依赖于保守的标记字符,而不是完整的语言识别。 同样地,`fa` 和 `ur` 依赖于少量的区分字母,旨在作为启发式提示,而非确定性的语言识别。 ## 输出标签 - 标签并不总是互斥的。 - 广泛的脚本家族标签可以与较窄的面向国家或语言的标签一起出现。 - 例如:`cjk` 可以与 `cn`、`tw` 或 `ja` 同时出现。 - 例如:`ar` 可以与 `fa` 同时出现。 - 例如:`ar` 可以与 `ur` 同时出现。 - 例如:`ko` 可以与 `dprk` 或 `rok` 同时出现。 - 这是故意的。宽泛的标签表示脚本家族,而较窄的标签表示更具体的语言或区域信号。 - 较窄的标签是保守的启发式方法,当脚本共享相同的字母或表现形式时,它们可能仍然会发生重叠。 ## 测试数据 `testdata/sample.txt` 中包含一个小样本文件。 ## 从 GitHub Releases 获取 提供预编译的独立二进制文件。 每个版本都为 Linux 和 Windows 提供了直接的可执行文件,而不仅仅是 zip 压缩包。 ``` $ chmod +x ./langscan $ ./langscan {{options...}} ``` ``` > .\langscan.exe {{options...}} ``` ## 贡献 请参阅 [`CONTRIBUTING.md`](./CONTRIBUTING.md) 了解项目布局和设计原则。 `langscan` 的源代码托管在 GitHub 上:。 鼓励贡献、Fork 和审查。请根据需要开启 Issue 并提交功能请求。 如果您精通任何受支持的语言或区域变体,我们特别欢迎您为改进标记集、关键字列表和处理误报做出贡献。 ## 许可证 `langscan` 在 MIT 许可证下发布。
标签:Linux安全, Rust, 可视化界面, 威胁情报, 开发者工具, 恶意代码分析, 数字取证, 文本分析, 文档结构分析, 网络流量审计, 自动化脚本, 语种识别, 通知系统, 配置文件