iOS浏览器状态数据库时间戳解析:last_viewed_time的真相

本文深入分析iOS系统中BrowserState.db数据库的last_viewed_time字段含义,通过多个测试场景揭示该时间戳与标签页焦点获取的关系,以及在不同iOS版本中的行为差异,帮助数字取证人员正确解读浏览器历史记录数据。

BrowserState.db中last_viewied_time字段解析(再次探讨)

在最近几周,又有几位检验人员联系我讨论这个问题。显然仍存在一些困惑,因此我认为应该做一个简要更新来澄清。

正如我之前所述,BrowserState中的last_viewed_time是标签页获得焦点的时间。数据库中显示的URL和标题与该标签页中最近访问的页面相关。

不同iOS版本在记录写入时间上存在差异,但时间戳的含义似乎是一致的。

iOS 14及以下版本测试

iOS 12、13、14在创建标签页时都会立即创建BrowserState记录,并在导航发生时持续更新URL和标题字段。当标签页获得或失去焦点时,时间戳会更新。

测试过程:

  • 我在9:21打开一个标签页并搜索"9:21"。BrowserState记录立即创建。时间戳和URL/标题都显示9:21
  • 在9:22,我搜索"922"并再次检查数据库
  • 可以看到标题已更新,但last_viewed_time仍保持9:21
  • 然后我完全关闭Safari,在9:23重新打开并搜索"923"。检查数据库显示更新的时间戳和标题
  • 关闭标签页并再次检查数据库显示数据完全没有变化

iOS 15及以上版本测试

在iOS 15、16、17和18 Beta中,记录不会立即在BrowserState数据库中创建,因此永远不需要更新。似乎所有内容都存储在RAM中,只有在标签页关闭时才写入数据库。但同样,last_viewed_time是标签页获得焦点的时间。

测试过程:

  • 我在10:23创建标签页并搜索"1023"。检查数据库,没有记录
  • 在10:24,我关闭标签页并重新检查数据库
  • 在10:25我创建新标签页并搜索"1025"
  • 在10:26,我使用同一标签页搜索"1026"
  • 然后我关闭标签页并检查数据库

如您所见,last_viewed_time仍然反映标签页获得焦点的时间,URL和标题与最近访问的页面相关。

标签页焦点?

标签页获得焦点可能有几种不同原因:

  • 标签页被创建并因此获得焦点
  • Safari被关闭(不是后台运行)并重新打开。重新打开导致标签页获得焦点
  • 在标签页之间切换。被带入视图的标签页获得焦点。被移出视图的标签页会更新(但这只有在标签页在没有再次获得焦点的情况下关闭时才会反映)
  • 关闭标签页 - 这里有个重要说明。被关闭的标签页不会更新。但是,关闭一个标签页的过程会导致另一个标签页获得焦点,因此获得焦点的标签页会更新

场景分析

这可能导致一些值得单独查看的有趣场景。

场景1 假设我在10:00打开标签页并搜索"1000"。last_viewed_time继承标签页获得焦点的时间(在这种情况下是标签页创建时),即10:00。 然后我将Safari最小化一小时,在11:00重新打开。最小化/最大化不影响焦点,因此没有时间戳更新。 我可以关闭标签页,记录将显示last_viewed_time为10:00和"1000"的搜索,使其看起来准确。

场景2 与之前设置类似。在10:00打开标签页并搜索"1000"。然后我关闭Safari,一小时后打开。 从关闭状态打开Safari确实会更新时间戳。因此时间戳现在显示11:00。我关闭标签页,记录以11:00的时间戳和"1000"的搜索词写入。这显然不准确,使得"1000"的搜索看起来是在11:00进行的。

场景3 仍然保持相同的设置,在10:00打开标签页并搜索"1000"。 这次,我保持Safari打开一小时,每分钟进行一次新搜索。因此我在10:01搜索"1001",10:02搜索"1002",依此类推。 在11:00我进行最后一次搜索"1100"并关闭标签页。 在整个小时内,同一标签页一直处于焦点状态,因此时间戳从未更新。 数据库中的记录将显示last_viewed_time为10:00和最近访问的URL"1100"。这也不准确,使得我搜索"1100"看起来是在10:00进行的。

场景4 最后,坚持相同的前提,我在10:00打开标签页并搜索"1000"。我将Safari最小化一小时。在11:00我最大化Safari并搜索"1100"。同样,由于最小化/最大化不会导致重新获得焦点,last_viewed_time保持10:00但URL显示最近的值"1100"。这与场景3有相同结果,使得我搜索"1100"看起来是在10:00进行的。

时间线

我还将以时间线形式呈现数据,希望能进一步澄清。 此表试图显示last_viewed_time、URL和标题在内存和/或数据库中的状态(取决于iOS版本)。

时间 操作 标签页焦点事件 导航事件 结果
10:00 打开标签页。搜索"1000" last_viewed_time: 10:00
URL: 与"1000"搜索相关
Title: “1000”
这很容易被误解为last_viewed_time与URL之间的关联。但这只是巧合。
10:05 在同一标签页搜索"1005" last_viewed_time: 10:00
URL: 与"1005"搜索相关
Title: “1005”
这可能被误解为"1005"搜索发生在10:00。
10:10 最小化Safari last_viewed_time: 10:00
URL: 与"1005"搜索相关
Title: “1005”
无变化。
10:15 最大化Safari last_viewed_time: 10:00
URL: 与"1005"搜索相关
Title: “1005”
无变化。
10:20 搜索"1020" last_viewed_time: 10:00
URL: 与"1020"搜索相关
Title: “1020”
这可能被误解为"1020"搜索发生在10:00。
10:25 关闭Safari last_viewed_time: 10:00
URL: 与"1020"搜索相关
Title: “1020”
无变化。
10:30 打开Safari last_viewed_time: 10:30
URL: 与"1020"搜索相关
Title: “1020”
这可能被误解为"1020"搜索发生在10:30。
10:35 打开新标签页(标签页2)
搜索"1035"
标签页1:last_viewed_time: 10:30
URL: 与"1020"搜索相关
Title: “1020”
标签页2:last_viewed_time: 10:35
URL: 与"1035"搜索相关
Title: “1035”
创建新标签页但不影响原始标签页。
10:40 关闭标签页2
导致标签页1重新获得焦点
last_viewed_time: 10:40
URL: 与"1020"搜索相关
Title: “1020”
原始标签页的last_viewed_time更新,这可能被误解为"1020"搜索发生在10:40。
10:45 搜索"1045" last_viewed_time: 10:40
URL: 与"1045"搜索相关
Title: “1045”
这可能被误解为"1045"搜索发生在10:40。

希望上述场景和表格能够证明,在某些情况下:

  • last_viewed_time比URL和标题字段的内容更新(如10:30和10:40的情况)
  • last_viewed_time比URL和标题字段的内容更旧(如10:05、10:20和10:45的情况)

本质上,last_viewed_time值可能在实际URL访问时间之前或之后。这使得这个时间戳完全不可靠。

总结

这个数据记录的好处是它非常容易自行测试。BrowserState.db包含在加密的iTunes备份中,因此您甚至不需要高级提取工具。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计