
用 Rust 重写的 Loki。高性能、多线程的单一二进制 YARA 和 IOC 扫描器。
状态:Beta。可用,但仍在积极开发中。
macOS 上的进程内存扫描是尽力而为的,通常需要调试授权或高权限。如果没有这些权限,Loki-RS 仍会扫描文件,但无法读取大多数进程内存。如有需要,可使用 --no-procs 跳过进程扫描。
在 Linux 上,Loki-RS 在读取 /proc/<pid>/mem 之前会跳过设备支持的和内核特殊的进程映射。这避免了某些驱动管理的 VMA 已知的不稳定性,同时保留正常的匿名映射、堆/栈映射和常规文件支持的内存扫描。如果仍遇到环境特定的问题,可使用 --no-procs 禁用进程扫描。
从 发布页面 下载对应平台的预编译二进制文件。
# 解压
tar -xzvf loki-linux-*.tar.gz
cd loki-linux-*
# 更新签名(推荐)
./loki-util update
# 运行
sudo ./loki --help
签名随版本附带,但很快会过时。运行 loki-util update 可获取最新的 YARA-Forge Core 规则。
Loki-RS 使用 YARA Forge 作为默认签名来源。Loki-RS 附带并更新的是 Core 规则集(高精度、低误报、优化性能)。如需更广的覆盖,可从 YARA Forge 替换为 Extended 或 Full 规则集。
signatures/iocs/ 中的 IOC 文件作为可选的本地/自定义内容,仍然受支持。
# 基本扫描(默认启用 TUI)
sudo ./loki
# 扫描指定文件夹
sudo ./loki --folder /tmp
# 禁用 TUI,使用标准命令行输出
sudo ./loki --no-tui
# 扫描挂载的镜像(跳过进程扫描,使用所有核心)
sudo ./loki --no-procs --folder ~/image1 --threads 0
# 慢速谨慎扫描(限制 CPU 使用率,单线程)
sudo ./loki --cpu-limit 60 --threads 1
# 扫描并发送日志到远程 syslog
sudo ./loki --remote syslog-host.internal:514 --remote-proto udp


| 选项 | 默认值 | 描述 |
|---|---|---|
-f, --folder <PATH> | / | 要扫描的文件夹。包含空格的路径请用引号括起来,例如 -f "J:\SteamLibrary\steamapps\common\SpaceCraft beta" |
Loki-RS 提供了多种排除文件和文件夹的机制。
默认情况下,Loki-RS 自动排除:
系统目录 (Linux/macOS):
/proc, /dev, /sys/kernel/debug, /sys/kernel/slab, /sys/kernel/tracing, /sys/devices/run, /var/run云存储目录(除非使用了 --scan-all-drives):
网络和挂载驱动器(除非使用了 --scan-all-drives):
/media, /volumes 下的外部介质程序目录:
你可以通过哈希排除已知正常的文件。这对于白名单化触发误报的合法文件很有用。
设置:
在 signatures/iocs/ 目录下创建一个文件名同时包含 hash 和 falsepositive 的文件
例如:hash-falsepositive-custom.txt
添加哈希(MD5, SHA1 或 SHA256)及可选描述:
# 格式:HASH;描述
d41d8cd98f00b204e9800998ecf8427e;空文件 - 已知正常
a7f5f35426b927411fc9231b56382173;合法系统工具
匹配这些哈希的文件在扫描中会被静默跳过。
当向 signatures/iocs/filename-iocs.txt 添加文件名 IOC 时,可以在第三列指定误报排除的正则表达式:
# 格式:REGEX;SCORE;FALSE_POSITIVE_REGEX
#
# 匹配所有 .ps1 文件,但排除 SysInternals 目录中的文件
(?i)\\procdump(64)?\.(exe|zip);50;(?i)(SysInternals\\)
如果文件同时匹配主模式和误报正则表达式,则不会报告。
config/excludes.cfg 文件支持基于正则表达式的路径排除:
# 排除系统目录
^/proc/.*
^/dev/.*
^/sys/.*
# 排除临时文件
.*\.tmp$
.*\.temp$
.*\.swp$
# 排除特定目录
.*node_modules.*
.*/\.git/.*
注意: 路径排除模式通过正则表达式与完整文件路径进行匹配。以 # 开头的行是注释。
# 扫描但包含所有驱动器(网络、云、挂载)
sudo ./loki --scan-all-drives
# 扫描所有文件类型,不仅限于可执行文件和脚本
sudo ./loki --scan-all-files
# 只扫描小文件(小于10MB)
sudo ./loki --max-file-size 10000000
# 跳过进程扫描(适用于挂载镜像)
sudo ./loki --no-procs --folder /mnt/image
终端界面默认启用,提供扫描期间的实时监控。
sudo ./loki --folder /path/to/scan


Loki-RS 在每次扫描后自动生成一份带样式的 HTML 报告。报告与 JSONL 日志文件一同生成,提供所有发现的可视摘要。
报告包含:

HTML 报告与 JSONL 输出使用相同的基本文件名(例如 loki_hostname_2025-01-08.html)。要禁用报告生成,请使用 --no-html。
你可以使用 loki-util 从现有的 JSONL 文件生成 HTML 报告:
# 从单个 JSONL 文件生成 HTML 报告
./loki-util html --input scan_results.jsonl --output report.html
# 从多个 JSONL 文件生成合并的 HTML 报告
./loki-util html --input "*.jsonl" --combine --output combined_report.html
# 使用通配符模式匹配多个文件
./loki-util html --input "/path/to/scans/*.jsonl" --combine --output combined.html
选项:
--input <file|glob> - 输入的 JSONL 文件或通配符模式(必填)--output <file.html> - 输出的 HTML 文件(可选,默认使用输入文件名加 .html 后缀)--combine - 将多个 JSONL 文件合并到一个报告中(按主机名分组发现)--title <str> - 覆盖报告标题--host <str> - 覆盖报告中的主机名合并报告模式适用于将来自多个主机或时间段的扫描结果聚合到单个视图中,发现按源主机名分组。
git clone https://github.com/Neo23x0/Loki-RS.git
cd Loki-RS
cargo build --release
./target/release/loki-util update
sudo ./target/release/loki
需要 Rust 工具链。跨平台编译请参阅 docs/BUILD.md。
Loki RS 是一个副项目。它是一个快速、单一二进制扫描器,专为实用的分类和实验而构建,随着想法被尝试和移除,它可能会快速变化。
支持是社区式的,尽力而为——没有 SLA,没有保证的响应时间,也不保证每个边缘情况都被完美处理。如果在生产环境中运行它,请牢记这一点。
对于需要可预测支持和更广泛、经过良好测试的功能集的企业环境和应急响应工作,Nextron Systems 维护着 THOR(以及 THOR Lite)。THOR 是专业扫描器,具有广泛的人工制品覆盖范围、更多模块和格式以及供应商支持。THOR Lite 是免费的入门版本,范围有所减少。
GNU General Public License v3.0。见 LICENSE。
Copyright (c) 2025 Florian Roth
| 选项 | 默认值 | 描述 |
|---|
--no-procs | false | 跳过进程内存扫描 |
--no-fs | false | 跳过文件系统扫描 |
--no-archive | false | 跳过归档文件内部扫描 (ZIP) |
--scan-all-drives | false | 扫描所有驱动器,包括挂载/网络/云盘 |
--scan-all-files | false | 扫描所有文件,不论扩展名/类型 |
| 选项 | 默认值 | 描述 |
|---|
-l, --log <FILE> | auto | 纯文本日志文件 |
--no-log | false | 禁用纯文本日志输出 |
-j, --jsonl <FILE> | auto | JSONL 输出文件 |
--no-jsonl | false | 禁用 JSONL 输出 |
--no-html | false | 禁用 HTML 报告生成 |
--no-tui | false | 禁用 TUI,使用标准命令行输出 |
-r, --remote <HOST:PORT> | none | 远程 syslog 目标 |
-p, --remote-proto <PROTO> | udp | 远程协议 (udp/tcp) |
--remote-format <FMT> | syslog | 远程格式 (syslog/json) |
| 选项 | 默认值 | 描述 |
|---|
--alert-level <SCORE> | 80 | 警报阈值 |
--warning-level <SCORE> | 60 | 警告阈值 |
--notice-level <SCORE> | 40 | 通知阈值 |
--max-reasons <NUM> | 2 | 每个发现最多显示的匹配原因数 |
-m, --max-file-size <BYTES> | 64000000 | 最大文件扫描大小 (64MB) |
--yara-timeout <SECONDS> | 10 | 每个文件或进程内存缓冲区的最大 YARA 扫描时间(最低:1秒) |
-c, --cpu-limit <PERCENT> | 100 | CPU 利用率限制 (1-100) |
--threads <NUM> | -2 | 线程数 (0=全部,-1=全部-1,-2=全部-2) |
| 选项 | 默认值 | 描述 |
|---|
--version | - | 显示版本并退出 |
-d, --debug | false | 显示调试输出 |
--trace | false | 显示详细跟踪输出 |
--show-access-errors | false | 显示文件/进程访问错误 |
| 选项 | 描述 |
|---|
--scan-all-drives | 包含挂载驱动器、网络驱动器和云存储 |
--scan-all-files | 扫描所有文件,不论文件类型/扩展名(默认只扫描相关文件类型) |
-m, --max-file-size <BYTES> | 跳过大于此大小的文件(默认:64MB) |
--no-procs | 完全跳过进程内存扫描 |
--no-fs | 完全跳过文件系统扫描 |
--no-archive | 跳过归档文件内部扫描 (ZIP) |
| 键 | 操作 |
|---|
q | 退出 |
p | 暂停/继续 |
s | 跳过当前项目 |
t | 切换线程覆盖层 |
+ / - | 调整 CPU 限制 |
| 方向键 | 滚动日志 |