在帮助人们通过我们的产品恢复数据时,我们会用到许多技术,而过去十年里我们打造的许多巧妙之处都隐藏在表面之下。今天,我们来深入看看恢复已删除信息所用的方法之一:对 SQLite 数据进行取证恢复。
iPhone 究竟是如何存储数据的?
简单来说,许多应用把数据存储在数据库中,其中大多数使用 SQLite 格式。SQLite 是一种小巧精致的无服务器数据库格式,非常适合 Apple 和应用厂商的需求。由于 SQLite 无需单独的数据库服务器即可运行,它与其他数据库有几点不同。特别是,为了保证访问速度,它在使用过程中无法定期进行自我维护。比如,用户不希望应用在数据库执行清理索引之类的例行维护时变慢。
SQLite 也可以执行这些清理或优化操作,但它们往往很少运行。对用户来说,这是恰当的平衡:你的 iPhone 会相当流畅,你的数据也会很稳固。而且,一旦有需要,由于这类维护很少进行,你恢复已删除 iOS 数据的几率会高于平均水平。
不必讲得太技术化,这个过程其实很简单。把这些数据库想象成大号的文件柜:
- 需要向其中添加信息时,你会放进一份文件,并贴上整齐的标签,说明文件里有什么,你的手机就是这样工作的。
- 但在删除数据时,手机并不会把文件从文件柜里取出来,而只是把标签撕掉。所以旧数据并没有被移除,只是没有了标签(用技术术语来说,叫作“孤立”)。这意味着,删除数据时,手机不需要经历相对缓慢的释放文件柜空间的过程。它只是说一声“嗯,忘了这个吧”,然后继续往下走。
- 需要添加更多数据时,如果还有空间,手机就会添加新的文件。如果没有空间了,它会看看有没有那些无标签的文件还留在那里,如果有,就会根据需要丢弃其中的某些部分来腾出空间。
由此你或许能得出这样的结论:在手机上删除数据很快,添加数据也相当快,前提是有空间。而且,违反直觉的是,真正导致旧信息被清除的,恰恰是添加新数据的过程。
在 iOS 上从 SQLite 中恢复已删除的信息
假设你已经用了几个月手机。手机上的数据库就像我们前面描述的文件柜。里面有不少文件,而你删除过数据的地方,这些文件依然在那里,但有两点需要注意:它们可能已被部分或全部覆盖,而且没有标签。
那么,恢复技术基本上就是你所预期的样子:找到这些孤立的文件(无论是否完整),尝试找出它们应该放在哪里,以及剩余的数据是否足以说得通。正如你所料,这一切相当繁琐,还可能冒出许多其他技术问题,让事情变得困难。尤其是体积超过几兆字节的数据库,以及其中含有二进制数据的数据库,会让这个过程困难得多。
话虽如此,找回一部分数据并不太难,这也是市面上有不少工具声称能做到这一点的原因。总体而言,可以把这些工具分为三类:
- 好的。它们采用了许多不同的技术,这些技术经过数千个不同的删除或损坏案例的构建与测试。
- 差的。它们只恢复格式完好、并带有若干线索可以判断其归属的剩余内容。
- 丑的。它们会扫描孤立的内容,把任何看起来可能契合上下文的旧垃圾都标记出来,前提是你眯着眼睛看。“NSMutableArray”,这会是你丢失的联系人记录的名称吗?嗯……
真实环境中从 iOS 进行 SQLite 恢复与反删除
我们已经简单讲了这是怎么回事,接下来看看它在真实环境中的效果如何。毕竟,我们希望让普通用户无需成为专家也能找回自己的数据。我们做到了吗?我们将用 iPhone Backup Extractor 与四款领先的 SQLite 恢复工具进行基准测试。在撰写本文时,这些工具的最新版本如下:
| 名称 | 版本与发布日期 | 平台 | 价格 |
|---|---|---|---|
| Reincubate iPhone Backup Extractor | 7.6.1.2201,2018 年 5 月 | Windows 和 macOS | $34.95 |
| SQLabs 的 SQLite Doctor | 1.3.0,2013 年 8 月 | Windows 和 macOS | $49 |
| SysTools 的 Sqlite Database Recovery | 1.2,未显示发布日期 | 仅限 Windows | $149 |
| Stellar Data Recovery 的 Stellar Phoenic Repair For Sqlite 1.0,未显示发布日期 | 仅限 Windows | $599 | |
| GetData 的 Forensic Explorer (FEX) | 4.3.5.7364,2018 年 5 月 | 仅限 Windows | $1,695 |
| Acquire Forensics 的 Sqlite Forensics Explorer | 2.0,未显示发布日期 | 仅限 Windows | $149 |
为了搭建这个测试,我们将使用一个很大的数据库,里面装满了真实环境中的数据。这次用的是一个 169 MB 的“信息”数据库,取自一台运行 iOS 11 的 iPhone。我们来看一下:下面的命令显示了它的文件大小,以及一次统计其中信息数量的查询结果。
$ ls -l sms.db
-rw------- 1 afitzpatrick 177565696 Oct 2 2017 sms.db
$ sqlite3 sms.db
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
sqlite> SELECT COUNT(*) FROM message;
220261
可见,这里有超过 220,000 条信息。它们都是没有被删除的。但是,恢复工具能找到多少已删除的信息呢?
iOS 的 SQLite 数据恢复:结果出炉
我们在同一个文件上运行了上面列出的所有工具,并把结果记录在下表中。我们本来很想用 Mac,但由于并非所有工具都支持 macOS,我们使用了一台配有 16 GB 内存、运行 Windows 10 Pro(版本 1803,内部版本 17134.48)的 PC。
| Reincubate | Acquire Forensics | SQLabs | SysTools | Stellar Data Recovery | GetData | |
|---|---|---|---|---|---|---|
| 恢复数量 | 342 | 56(但大多是垃圾数据) | 0 | 0(经过长时间扫描,它找到了 220,261 条,这与已有的有效记录数量完全相同!) | 0(每次运行,它都会数到 37 条已删除的信息,但在完成之前就因错误 0x40000015 而崩溃。无法导出或保存任何内容。) | 0 (We reached out multiple times to purchase a license, but never heard back.) |
| 恢复出“垃圾数据”了吗? | 没有;看起来全是有效的已恢复信息。表情符号、日期、时间以及发件人 / 收件人号码均已恢复。 | 恢复出的内容大部分是垃圾数据 | 我们需要多次手动输入 ROWID 的最大值,尝试不同的参数。任何时候都没有恢复出任何内容。 | 只找到了原本就存在的信息。 | 每次都崩溃,所以无法判断。 | Wasn’t possible to get it running. |
| 每条恢复信息的实际成本(以本例计) | $0.10 | $2.66 | >$49 | >$149 | >$599 | >$1,695 |
好吧,这有点出乎意料,因为我们原本以为它们至少都能恢复出一些数据。结果是,我们这款不起眼的工具在 SQLite 数据恢复方面领先市场,尽管它并不是专门的 SQLite 数据恢复工具。(如果你好奇的话,这也是我们向其他公司授权我们的技术的原因。这件事并不容易。)
不同 iOS 版本上的 SQLite 数据恢复
每次发布新版 iOS,Apple 都有机会改变操作系统处理 SQLite 数据库的方式。这包括优化清理和其他维护操作的执行频率以及触发时机。
随着设备性能越来越强,这些操作对用户体验的影响变小,因此可以更自由地使用。所以,每一代新设备上的 SQLite 数据库都可能被更频繁地清理,这样做的好处是让数据库在日常操作中运行得更快。这与 Apple 加强用户数据保护和隐私的目标一致,因为设备上不会残留任何不需要的数据。然而,这样做也有一个弊端:通过 SQLite 方法恢复数据将变得不可能。
在 iOS 11 中,我们开始看到短信和 iMessage 的数据库清理活动有所增加。恢复仍然可行,对于随后被删除的较新信息可能性更大,但并不能保证。
在 iOS 12 中,短信和 iMessage 数据库的清理频率大幅提高。由于这个版本被宣传为重点关注维护和速度方面的改进,这一变化是合理的,因为它很可能让更常见的操作运行得更流畅。
恢复 iOS 数据时,我需要怎么做才能利用这一点?
这也许是最棒的部分:这项技术已集成在 Reincubate iPhone Backup Extractor 中,从早期起就是如此。使用该应用时,它会在预览或导出你的信息和其他多种数据类型时应用这项技术。根据你查看的数据以及查看方式,应用会标明哪些数据是被恢复出来的,哪些不是。这一切都已包含在内。






