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, 可视化界面, 威胁情报, 开发者工具, 恶意代码分析, 数字取证, 文本分析, 文档结构分析, 网络流量审计, 自动化脚本, 语种识别, 通知系统, 配置文件