alitrack

误删了 278 条 SQLite 记录,这个工具一条不差全找回来了

你的浏览器历史、微信聊天记录、手机 App 缓存——这些数据存在哪里?大概率是 SQLite。

这是世界上用得最广的嵌入式数据库,但它的一个行为知道的人不多:DELETE 操作不删除数据。它只是把磁盘空间标记成"空闲",旧数据留在原地,等哪天被新写入盖过去才算真没。

所以如果你误删了东西,或者在做取证调查,数据很可能还在那里——前提是你有趁手的工具。

三个人都说能做到,但实际效果差了一个数量级。


● ● ●

278 条记录的考试

德国米特韦达应用科学大学的研究者 Dirk Pawlaszczyk 在 2021 年发表了一篇论文:Making the Invisible Visible – Techniques for Recovering Deleted SQLite Data Records。他设计了一个标准的法证测试集:278 条已删除的 SQLite 记录,覆盖了多种删除场景。

然后他让一系列工具去"考试"。结果很刺激:

  • 有些商业工具一条都没恢复出来
  • 老牌的 undark(C 语言,2004 年起)恢复了约 34.8%
  • bring2lite(Python,2019 年 DFRWS 论文)恢复到 52.9%——当时它的论文已经拿了第一
  • FQLite:278/278,100%

是的,全部找回来了。


● ● ●

三个工具,三个故事

FQLite:学术论文孵化出的工业级工具

FQLite 是 Pawlaszczyk 团队自己写的工具。Java 写的,带 JavaFX 图形界面,Apache 2.0 协议。

它的核心能力远不止"找删除记录"这么简单:

恢复能力:

  • Freelist 页面扫描(已被回收的空间)
  • 未分配区域 + 空闲块中的残留数据
  • 支持 WAL 归档、Rollback Journal
  • 能恢复被 DROP 掉的整个表
  • UTF-8 / UTF-16BE / UTF-16LE 全编码支持

取证分析功能:

  • BLOB 自动检测和预览(图片、PDF、HEIC 等)
  • Google Protobuf、Apple plist、AVRO、Thrift 格式解码
  • 集成 Hex 查看器
  • Text-to-SQL:内置本地 LLM 支持,用自然语言查询数据库(基于 Llama 3.2 3B)
  • Mermaid.js 驱动的 Schema 可视化
  • NodeQL 可视化 SQL 构建器
  • SQLCipher 加密数据库支持
  • CASE/UCO JSON-LD 标准格式导出

从 2021 年第一版到 2026 年 6 月的 4.22 版本,持续迭代了 20+ 个大版本。这在开源取证工具里极其罕见。

bring2lite:曾经的第一,如今已经锈了

bring2lite 是德国研究者 Christian Meng 和 Harald Baier 的工作,发表在 2019 年 DFRWS USA 会议上。

在它自己的测试中(不同数据集),它恢复了约 53%,击败了 8 个竞品——包括若干商业软件。论文里列了 undark、SQLiteRecover、Stellar 等工具,bring2lite 确实在当时是最强的开源方案。

但问题来了:

  • 仓库最后一次提交是 2019 年 8 月
  • 协议是 CC-BY-NC(非商业使用),不能在商业场景用
  • GUI 标注为 "EXPERIMENTAL"
  • README 里列了 6 个待修 bug,一个都没改
  • 35 个 star,10 个 fork,没有发布过任何 release

它是一篇好论文的实现,但不是一个在维护的软件项目。

sqlite-unhide:只能走半步

sqlite-unhide 是个更小的工具。作者叫 little-brother,俄语背景,写了篇 Habr 文章介绍原理。

关键限制:

  • 只支持 UTF-8 编码
  • 不恢复 BLOB
  • 免费版数据库上限 1MB
  • 协议是 "FREEWARE. HOME USE ONLY"
  • GitHub 上 5 个 star,3 次 commit,2021 年后没更新

1MB 是什么概念?一个微信聊天记录的 SQLite 文件轻松几十 MB 起步。用它恢复实际数据基本没戏。


● ● ●

技术原理:SQLite 为什么不真删数据

理解这几个工具的差异,需要知道 SQLite 的删除机制。

SQLite 使用 B-tree 页结构存储数据。删除一行记录时:

  1. 01该记录所在的 cell 被标记为"空闲"
  2. 02空闲 cell 以链表形式组织(freeblock chain)
  3. 03被删除页也可能加入 Freelist(整页回收池)
  4. 04如果启用了 WAL 模式,旧版本数据还留在 WAL 文件中

关键点:标记不等于擦除。 只有两种情况会真正销毁数据——新写入覆盖了那块空间,或者执行了 VACUUM。

FQLite 之所以能做到 100% 恢复率,是因为它全面覆盖了所有残留路径:

残留位置undarkbring2liteFQLite
Freelist 页面✅✅✅
未分配空间❌✅✅
页面内 freeblock✅✅✅
WAL 归档❌✅✅
Rollback Journal❌✅✅
DROP TABLE 恢复❌❌✅
UTF-16 编码❌?✅
BLOB 推断❌❌✅

undark 只覆盖最基础的 Freelist + freeblock,所以只能恢复 34.8%。bring2lite 多扫了 WAL 和 journal,提到 52.9%。FQLite 把所有角落都扫了,还加了 BLOB 推断和模式匹配,一举到 100%。


● ● ●

怎么选

如果你是开发者,误删了数据想恢复:

  • FQLite 是唯一正确的选择。 免费、开源、持续维护、100% 恢复率。下载地址:github.com/pawlaszczyk/fqlite
  • bring2lite 有学术价值,但代码已经锈了。如果你在读 DFRWS 论文,可以拿来复现实验。
  • sqlite-unhide 可以用在嵌入式/资源受限场景(它很小),但 1MB 限制在日常使用中是硬伤。
  • undark(github.com/alitrack/undark)是 2004 年的老项目,已被归档,README 中已指向 FQLite。

如果你是取证从业者,FQLite + Sanderson Forensic Browser for SQLite + Magnet AXIOM 是行业标配组合。FQLite 做深度恢复,Sanderson 做可视化查询,AXIOM 做跨应用关联。


SQLite DELETE → 不真删,只标记 → 残留位置:
  ├─ Freelist 整页    最容易恢复
  ├─ Freeblock 碎片   部分恢复(前4字节没了)
  ├─ WAL 归档         最近删除的首选路径
  ├─ 未分配空间        需要模式匹配
  └─ DROP 掉的表      只有 FQLite 能处理
      │
      ▼
  FQLite:      ████████████████████ 100%
  bring2lite:  ██████████ 53%
  undark:      ██████ 35%
  sqlite-unhide: █ 有限(免费版 1MB cap)

重要的是,预防比恢复更好。定期备份、启用 WAL 模式配合增量备份、或者用 litereplica 做实时复制——这些做法比指望恢复工具靠谱得多。

但万一你真的需要恢复删除的 SQLite 数据:现在你知道该用什么了。


FQLite 项目: github.com/pawlaszczyk/fqlite
论文: Pawlaszczyk & Hummert (2021). Making the Invisible Visible. IJCFATI 1(1-3), 27-41.
bring2lite 论文: Meng & Baier (2019). bring2lite: A Structural Concept.... DFRWS USA 2019.
undark 归档: github.com/alitrack/undark