BrowserState.db last_viewed_time字段深度解析
问题背景
近期关于iOS系统中BrowserState.db数据库的疑问促使我深入研究这一数据源。问题核心围绕在TABS表中last_viewed_time字段时间戳的准确性上。
该时间戳常被误认为是同一记录中URL的访问时间,这看似合理——记录包含URL、页面标题和时间戳,甚至字段名就是"最后查看时间"。但实际上,这个数据库与会话相关,而非单个页面访问。
iOS14实验分析
从干净状态开始测试,清空浏览器历史后:
- 09:41使用Safari搜索框搜索"0941"
- BrowserState.db立即创建,last_viewed_time基本准确
- 几分钟后使用Google搜索栏搜索"0944"
- 标题更新为0944,但last_viewed_time仍显示09:41
- 重复测试得到相同结果
关键发现:last_viewed_time反映的是标签页获得焦点的时间,而非搜索执行时间。
标签页切换测试
- 打开新标签页搜索"0949":创建新记录,last_viewed_time准确
- 返回第一个标签页搜索:last_viewed_time更新为切换焦点时间
- 最小化/最大化Safari:对时间戳影响不一致
- 完全关闭后重开Safari:即使不搜索也会更新last_viewed_time
iOS15变化
行为模式显著不同:
- 数据库在标签页关闭时才创建
- 最小化/最大化操作不影响时间戳
- 记录写入时机发生变化,但时间戳含义相同
iOS16与iOS17
延续iOS15的行为模式,主要差异在于数据库创建和记录写入的时机。
TAB_SESSIONS表分析
通过tabs表的UUID可在tab_sessions表中找到对应记录,session_data blob包含会话期间的所有导航条目,包括搜索和页面导航,但缺少时间戳信息。
Google EI时间分析
Google EI时间戳反映的是前一个页面加载时间,而非搜索执行时间:
- 访问google.com时EI时间即被记录
- 执行搜索时,使用之前记录的EI值
- 可能造成时间偏差,特别是当页面加载后很久才执行搜索时
结论
BrowserState.db的last_viewed_time字段和Google EI时间戳都只能作为页面访问时间的近似值:
- last_viewed_time表示标签页焦点时间
- EI时间戳表示前序页面加载时间
- 两者可能与实际访问时间存在显著差异
这体现了数字取证中理解数据源真实含义的重要性,即使字段名称看似明确,实际含义可能完全不同。