从一张掉漆的 CD-R 说起

上周四下午,我在中关村科贸电子城地下二层的一个旧配件摊上,翻到一盒贴着手写标签的 CD-R,标签上用蓝色圆珠笔写着「2004.08 备份」,字迹被磨掉了一半。摊主老陈收我八块钱,顺手递了个塑料壳,说这盘在他柜子底下压了至少十年,是某台老机器清仓时带过来的。我回家把它塞进外置光驱,光驱咔哒转了三圈,系统跳出来一个 4.3 MB 的文件夹,里面除了几张模糊的数码照片,孤零零躺着一个名为 history.dat 的浏览器历史文件。我知道这类文件多半是 IE6 时代遗留的索引格式,但还是花了一个晚上把它整明白了。

有些东西的价值,是在它失效之后才真正显现出来的。

我用十六进制编辑器打开它,找到偏移量 0x2C 附近的记录区,一条一条读下去:2004 年 8 月 11 日 21:47:03 访问了 `www.people.com.cn`,停留 4 分 12 秒;8 月 12 日 07:03 访问了 `mail.163.com`,停留 1 分 56 秒;8 月 14 日深夜 23:51 访问了一个现在已经打不开的论坛地址,标题栏里还残留着「考研数学 强化班 笔记下载」几个 GBK 编码的字。老陈说那台机器是个当老师的客户留下的,具体是谁他也记不清了。这些记录当然不能还原出那个人,但它们像某种非常粗糙的速写,把一个人 2004 年夏天的注意力轨迹勾了出来。我后来把这次经历写成了一份操作笔记,其中涉及数据读取与恢复的流程,可以参看 恢复49图库资料到专业数据恢复工具 里同类的思路,工具不同,方法论是相通的。

历史记录不是隐私的对立面,它更像一个人的阅读笔记——只是这本笔记他自己也未必读得懂。 —— 江晚,写于整理完第 1174 条记录之后

我对「恢复浏览网站记录」这件事的持续关注,大概就是从那一晚开始的。很多人以为恢复浏览记录是一个技术动作:找到缓存、解析 SQLite、用恢复软件扫盘。技术当然重要,但真正让我反复琢磨的是另一个层面:我们有没有能力、以及有没有必要,把一个已经消失的浏览时间线重新拼回去。浏览器历史数据库的 schema 变过很多次,Chrome 用 SQLite 的 `History` 文件,Firefox 用 `places.sqlite`,Safari 在 macOS 上把记录拆进 `History.db`,不同版本的字段名和索引顺序都有差异,恢复时一个字段错位就可能把时间戳读成负数。这些细节听起来枯燥,可它们决定了你能否在三千条记录里认出那一条真正重要的。

我见过有人把恢复出来的记录打印成册,一共 43 页。

那是前年秋天的事,读者林哲在邮件里告诉我,他父亲去世后留下了一台旧 ThinkPad T420,硬盘里存着 2009 年到 2015 年的 Chrome 历史记录,他用三款恢复工具交叉比对,最终把父亲生前最后一个月每天访问的新闻站和股票页面整理了出来,列在一张 43 页的 A4 纸上。他特别问我,能不能推荐一种更稳妥的方式核对时间戳,因为他发现有两天的记录出现了重复。我们在邮件里来回讨论了四轮,最后确认是系统时区切换导致的合并错误。我说不上这 43 页纸对林哲意味着什么,但他后来把那份 PDF 命名为 `father_browsing.pdf`,我觉得这就是答案。关于这种从旧记录里重新打开某个页面的做法,我在另一篇札记里提到过 打开浏览器免费观看 的实际操作路径,虽然场景不同,背后的取数逻辑是一致的。

为什么我盯着那个 0x2C 偏移量看了很久

回到那张 CD-R。我注意到 `history.dat` 里前 0x2C 个字节是一段固定头,之后的记录采用变长结构,每条记录以若干字段拼成,URL 字段的结束标记是 `\x00`。问题在于,2004 年的 IE6 并没有对 URL 做严格的截断处理,于是我在第 872 条记录里读到一串被截断的地址,只剩 `http://bbs.kaoyan.com/viewthre`。我试着用搜索引擎补全它,搜到的是一个早已关闭的考研论坛板块,页面的网络快照停在 2006 年。这条残缺记录让我想了很久:恢复浏览记录的本质,其实是在残缺的线索里做概率推断。你不可能百分之百还原,但你能给出一个足够可信的版本。

残缺不是失败,残缺是这类工作的默认起点。

这也解释了我为什么对市面上那些「一键恢复」的宣传保持距离。多数工具在浏览器关闭后扫描 `Cache` 目录,能捞回多少取决于写入策略和磁盘磨损,而 SQLite 的 WAL 日志往往比主文件保留更多有效信息。我在对比工具时习惯先看它是否支持读取 WAL 和 `-journal` 文件,再看它的时间戳解析是否处理了夏令时。这类细节读者很少在宣传页上看到,但它们直接决定了恢复结果的可信度。关于不同资料库的版本差异,我此前整理过 17图库资料恢复免费打开17图库资料库最新版本 中的字段对照表,可以作为交叉参考;如果只是想快速定位某一条具体记录,查看今晚的精准资料 里按日期筛选的方法更省事。

顺便说一个我自己有争议的观点:我认为绝大多数人恢复浏览记录,并不是为了找某个具体网址,而是为了确认「那段时间我确实存在过」。这话听起来有点玄,但我见过太多例子,恢复出来的第一条被反复打开的不是实用页面,而是一个早已停更的博客首页,或者一个纪念性质的页面。技术在这里只是通道,真正被恢复的是注意力的形状。有人会拿这个说法反驳我,说浏览记录就是数据,数据没有情感。我承认这个说法在工程上成立,但在使用场景上站不住脚。如果你只是想找一张旧图,免费网站图片库入口 这类页面确实更快,但那是检索,不是恢复,两件事不能混为一谈。

一条记录的三种读法

我后来把那张 CD-R 里的 1174 条记录分了类。第一种是工具性访问:邮箱、搜索引擎、下载站,占了大约六成,这些记录像流水账,恢复它们的技术价值大于情感价值。第二种是偶发性访问:深夜点开的一个帖子、一个只Visit过一次的新闻页,这类记录最容易在缓存清理后彻底消失,也最需要恢复工具去抢救。第三种是重复性访问:同一个域名在几周内被访问了上百次,这类记录几乎无法完全还原,因为浏览器会合并计数,除非你读得到原始表。我倾向于第三种记录才是真正值得研究的,它揭示的是习惯。关于这些不同来源数据的合并与去重,我在 uc官网入口 对应的说明文档里见到过一套还算严谨的流程,可以借鉴。

习惯比事件更难恢复,也更有信息量。

写到这里,我想起另一位读者,做中学历史老师的一位女士,姓周,她在 2021 年用恢复工具找回了一段 2012 年的浏览记录,里面全是地方志和旧地图站点。她把其中 27 个网址手抄进一个笔记本,说这些是她做校本课程时的原始素材。她问我要不要把这些记录做成公开的索引,我说公开与否你自己判断,但一定要把抓取时间写在每一条旁边,因为没有时间戳的索引是没有价值的。她后来真的做了,用 Airtable 建了一张表,每一行都带着 `captured_at` 字段。这个细节让我确信,恢复浏览记录这件事,最终会落到具体的人的具体做法上,工具只是起点。对资料库内容的检索与整理,我也在 管家婆正版资料库免费获取 里写过一套索引规范;如果你更关心图库类记录的快速定位,49tk图库49tk.cm资料查询技巧 那篇的检索样例比较实用。

最后说回老陈。他后来加了我微信,发来一张照片,是那个旧摊位上另一盒贴着「2002.12」标签的光盘,问我感不感兴趣。我没要,但我让他拍了标签的正反面。我关注恢复浏览网站记录这么多年,慢慢明白一件事:记录本身不会说话,是查看它的人给了它语境。技术决定你能看见什么,而你决定你看见的东西意味着什么。这两件事,缺了哪一件,恢复出来的都只是一堆地址。

「历史记录不会告诉你一个人想过什么,但它会告诉你他反复看向哪里。」 —— 一句我在 2019 年某次数据恢复工作坊上讲过的话,后来被一位学员记在了笔记本上