LovelyCarve CLI:让取证能力进入终端、脚本与 AI 工作流
原创
b3nguang
b3nguang
猫捉鱼铃酒吧
2026年10月21日 08:08
湖北
去阅读
开发 LovelyCarve 的时候,我一直希望取证能力能进入更多工作场景:
- 在桌面上交互分析
- 在终端里快速查询
- 用脚本处理重复任务
- 交给 AI 代理完成连续的分析流程
为此,LovelyCarve 提供了一个独立的命令行程序:lovelycarve-cli。
它增加了一个命令行入口。它把取证能力整理成一套容易发现且可以组合,适合自动化,并且保留证据边界的接口。
同一套取证能力,多种工作入口。
每一次调用,都能被理解、组合和检查。
先说一个判断:接入商业软件的 AI,可能是在给厂商打黑工
这两年,商业取证软件陆续加上了 AI 功能:智能摘要和自动分类、对话式检索,以及一键生成报告……看起来很方便。
但仔细看会发现,这些 AI 和厂商的产品深度绑定:
- 它只能读取这个平台解析出来的数据
- 它只能在这个平台的界面和工程格式里工作
- 它能做什么、不能做什么,由厂商的授权决定
当我们把这样的 AI 接进自己的工作流时,事情就变味了。
我们写的提示词、调好的流程,以及整理的字段映射和积累的操作经验,全都依附在厂商的平台上。投入越多,离开的成本越高。 这些成果不属于我们,也带不走。
更进一步,我们的每一次使用和反馈、纠错,都在帮厂商打磨产品、验证场景并丰富生态,让它的护城河更深。而我们自己的工具链,没有因此多出任何一项可以独立运转的能力。
我们付了授权费,
又贡献了经验和工作流,
最后换来的,是更难离开的平台。
这就是“给厂商打黑工”。
黑盒 AI,还会削弱核验能力
取证的底线是每个结论都能回溯到证据。
如果 AI 读取的是黑盒解析的结果,又用流畅的语言把它包装出来,那么输出看起来往往比原始数据更确定。可一旦追问:
- 这条记录从哪里来?
- 时间为什么这样解释?
- 没找到某项数据,是源里没有,还是格式不支持或解析失败,还是扫描不完整?
答案往往无从查起。
Agent 需要能回到原始字节、源记录和独立读取结果去复核,不能只相信平台给出的答案。
所以,Agent 要建立在自己掌握的工具链上
AI 应该由我们自己来编排,工具只负责提供可调用且可核验、可替换的取证能力。我希望 Forensics Agent 积累下来的,是真正属于自己的东西:
- 清晰的工具契约
- 可导出的结构化结果
- 可追溯的源证据
- 可独立运行的验证样本
这样,经验沉淀在自己的工作流里,换模型、换工具、换平台,都不会从零开始。
LovelyCarve CLI 正是按这个思路设计的。它把取证能力做成任何 AI 都能直接调用的接口,没有再做一个封闭的 AI 功能,包括可发现的命令和明确的请求结构,以及独立的运行入口与带读取审计的结果。AI 由你选,工作流归你所有。
下面这七个设计,都服务于这个方向。
01|共用取证后端,两个入口行为一致
CLI 和桌面端共用同一套 Rust 取证后端,直接调用相同的证据读取器和案件管理、文件系统解析,以及搜索、时间线和插件任务能力。
读取器的修复、核心能力的改进,可以同时惠及两个入口,避免分别维护两套实现造成行为差异。
同时,CLI 会自行初始化后端状态,构建时不链接 Tauri、WebView 或桌面窗口运行时。它有独立的进程和生命周期,分析流程可以直接在终端和脚本中跑起来。
02|统一语法,学会规则就能推测用法
所有命令都遵循 “集合 → 子集合 → 动词” 的结构:
images
管检材,files 管文件,cases 管案件,tasks 管任务
* get
查看单个对象,list 列出对象,delete 删除
lovelycarve-cli images open \"D:\\evidence\\disk.E01\" lovelycarve-cli --image \"D:\\evidence\\disk.E01\" files list --path /
掌握一组规则,就能推出其他命令怎么写。这降低了使用者的记忆成本,也让脚本作者和 AI 代理更容易准确构造命令。命令越来越多时,这套约定依然是理解新功能的基础。
03|完整的发现路径,功能再多也找得到
cli search
:用中英文任务描述查找命令
* docs search
:搜索随程序嵌入的文档
* schema
:查看命令的参数结构
使用者可以沿着 “找能力 → 看说明 → 确认参数 → 执行” 一步步探索,不必先读完整份手册。命令和文档搜索都在本地完成。
图 1 · 通过中文任务描述搜索命令,并检查请求参数结构。
嵌入的文档随程序版本一起发布,能力说明和对应版本的实际行为始终保持一致。
04|面向 AI 代理,落实到接口细节
schema
提供程序可读的参数结构
* JSON 提供结构化结果
* --fields
只返回本次需要的字段,同时保留分页元数据
AI 代理可以先搜索、再查看请求结构、最后执行,不必读完整份帮助和大量无关结果。
CLI 还能导出 MCP 工具定义,供外部 MCP 服务器封装。工具发现、参数构造、结果读取都有明确依据,每一步调用都便于检查。
实测:用一份 NAS 检材走一遍真实流程
这次用的是“2026 精武杯”物联网取证 NAS 目录中的五份 E01:一份系统盘,四份数据盘。
我在一个独立命名会话中加载检材,然后运行 raid detect。后端给出的结果是:
- 四盘 RAID5 候选布局
- 条带块大小(chunk)512 KiB
- 组装卷逻辑容量 32,183,943,168 字节
- 识别到 ext4 文件系统
图 2 · 四盘 RAID5 候选布局与 ext4 识别结果;heuristic=True 表示启发式推定。
注意结果中的 heuristic: true:这个布局来自启发式推定。后续的目录浏览和文件读取验证了部分可读内容,但它们各自只是一份证据,并不意味着候选布局已经通过了全盘一致性验证。
选中返回的组装检材 ID 后,就能继续用同一套 files 命令浏览、读取和计算哈希。下面是组装卷内 NAS 目录的实际列表:
图 3 · 在组装卷内浏览 NAS 目录,保留总数、截断状态和分页游标。
05|会话机制,贴合取证工作的连续性
- 单条命令
:适合临时查询
* 交互式 shell
:适合人工连续浏览,保留当前检材和目录
* 命名常驻会话
:多个普通 CLI 命令复用同一个后台进程,保留检材句柄、读取缓存和组装卷,减少重复初始化;用完显式关闭,释放资源
lovelycarve-cli sessions open exam lovelycarve-cli --session exam images open \"D:\\evidence\\disk.E01\" lovelycarve-cli --session exam files list --path / lovelycarve-cli sessions close exam
面向程序编排,CLI 还提供 JSONL 会话:每行一个请求、每行一个响应,通过 id 关联结果。$ref 可以把上一步的结果直接传给下一步。比如打开检材返回的 ID,可以直接作为后续目录浏览的参数,脚本不用再手工传递状态。
{\"id\":\"image\",\"command\":\"images open\",\"args\":{\"path\":\"D:/evidence/disk.E01\"}} {\"id\":\"roots\",\"command\":\"files list\",\"args\":{\"imageId\":{\"$ref\":\"image#/id\"},\"path\":\"/\"}}
06|并发有边界,结果和进度分通道
JSONL 会话可以通过 --jobs 让经过标记的查询并发执行。切换案件、打开或关闭检材这类会改变上下文的操作则作为屏障,等此前的请求全部完成后再执行。响应按完成顺序返回,调用方通过请求 ID 对应结果。命名常驻会话中的普通请求仍按串行执行。
输出通道也做了分离:
- 结构化结果(JSON)→ 标准输出
- 提示、进度、错误 → 标准错误
- 文件内容等命令可直接输出原始字节
- 需要结构化进度时,用
--events单独跟踪
数据和执行过程各走各的通道,管道、日志和自动化程序处理起来都更方便。
07|把一致性和严谨性变成工程约束
接口一致性: 每个注册的后端命令,都必须有对应的 CLI 映射,或者明确说明由哪条命令覆盖。漏接命令、命名违规或参数冲突,都会在构建阶段直接报错。帮助和补全、请求结构与命令分发围绕同一份目录组织,减少长期维护中的接口漂移。
取证严谨性: 结果需要保留读取边界。下面对组装卷内的 config.bin 计算 SHA-256:本次实际读取 9,060 字节,返回摘要,同时列出读取故障和合成字节,以及截断状态。
图 4 · 对组装卷内 config.bin 计算 SHA-256,同时返回本次读取的审计信息。
如果计算哈希时遇到源坏区并容错补零,结果会通过 readFaultsDetected、syntheticBytes 和 badRegions 如实反映,自动化程序需要结合这些字段来判断摘要是否可信。这里的 false 和 0 只描述本次读取,不代表整份检材已经审计完毕。
同样的明确性还体现在其他细节上:
- 导出时检查目标是否重名
--dry-run
可提前展示请求,并对敏感字段脱敏
* 时间显示保留来源,偏移未知的本地时间保持原值
写在最后
写 LovelyCarve,也是希望邀请更多同行,一起参与开源取证套件的开发和使用。
如果你愿意写代码,可以参与读取器和分析插件,以及自动化接口的开发;如果你更熟悉一线取证工作,也欢迎试用工具、反馈问题和补充文档,或者贡献可公开的测试样本和验证方法。每一种参与,都能帮助工具更贴近实际需要。
取证涉及的设备、系统以及数据格式很多,需要不同领域的经验共同积累。更多人参与使用和验证,能让问题更早被发现,让解析方法有更多依据,也让已有成果更容易被后来的开发者和使用者复用。
我希望这些投入能沉淀为开放且可检查、可持续改进的工具和知识,为取证行业的发展提供一份共同的基础。
欢迎一起开发、使用和完善开源取证套件,让经验在行业中共享,让工具在共同参与中进步。
图中 lc 为 PowerShell 短函数,调用 lovelycarve-cli --session wechat-cli-art-1020 -q;不是额外的 CLI 子命令。NAS 截图均来自本次指定检材。
项目:github.com/LovelyTeams/LovelyCarve
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论