在 Windows 95 开发团队面临的诸多工程挑战中,有一个问题在今天看来几乎不可思议:数以千计的应用程序安装包会在安装过程中用旧版文件覆盖系统组件。十六位 Windows 时代的应用安装程序本应在复制文件前进行版本检查,但大多数开发者根本没有遵循这一最佳实践。当这些安装包在 Windows 95 环境下运行时,它们会愉快地用 Windows 3.x 版本的系统 DLL 替换掉 Windows 95 的新版本,导致各种难以调试的兼容性问题。Windows 95 团队尝试过完全禁止用旧版本文件覆盖系统组件,但这种简单粗暴的方案导致大量合法安装包直接失败。于是他们设计了一套静默工作的防护机制,在用户和安装程序毫不知情的情况下,自动识别并纠正降级覆盖行为。
SYSBCKUP 备份目录的工作原理
Windows 95 在安装完成后,会在系统目录中创建一个名为 SYSBCKUP 的隐藏文件夹,用于存储关键系统文件的已知良好副本。这个目录并不为普通用户所熟知,它的作用类似于一个后台保险箱,专门针对那些频繁被安装程序覆盖的组件文件。每当一个安装程序完成文件复制操作后,Windows 95 的安装后处理模块就会启动,对这些关键文件进行版本核查。如果发现某个系统文件已被修改,系统会比较新文件与备份目录中存储文件的版本号。这里的版本号来自 Windows 可执行文件头部携带的 VERSIONINFO 资源块,其中包含了文件的主版本号、次版本号、构建号等关键信息。
具体的版本比对逻辑非常直接:当新文件的版本号高于 SYSBCKUP 中的备份版本时,系统认为这是一次合法的升级,会将新文件复制到备份目录以更新保护基准。相对地,如果新文件的版本号低于备份版本,系统就判定这是一次降级覆盖,会立即将备份目录中的原始文件复制回系统目录,覆盖掉安装程序放入的旧版本文件。整个过程完全在后台执行,不会向用户弹出任何提示对话框,也不会通知安装程序发生了什么。这种设计非常巧妙,因为它在不影响正常安装流程的前提下,主动防御了最为常见的版本降级问题。
与现代软件更新安全的思想关联
回顾 Windows 95 这套机制的设计理念,我们可以发现它与现代软件更新安全领域的一些核心原则高度吻合。首先是版本号作为信任锚点的思想:系统不关心文件的来源是否可信,而是依赖于版本号这一可验证的属性来做决策。这与当今软件签名验证的思路一脉相承,只是当时的版本号更容易被伪造,没有现代加密签名的强度。其次是防御性备份的思想:系统始终保留一份可信赖的原始副本,当检测到异常时能够自动回滚。在现代的操作系统更新机制中,我们依然可以看到类似的设计,比如 Windows 的文件保护机制和 macOS 的系统完整性保护都采用了类似的多层防御策略。
然而,这种基于版本号的防护也有其历史局限性。版本号的比较完全依赖于安装程序遵循统一规则,而不同软件厂商对版本号的定义和使用方式存在差异。部分安装程序甚至会故意修改版本信息来绕过检查,或者在某些边界情况下版本号比较逻辑出现偏差。更有一些激进的安装程序会在系统重启时通过批处理文件强制执行文件替换,抢在 Windows 95 完成修复之前就已经完成了降级。这些历史经验也推动了后来操作系统采取更强硬的保护措施,从纯粹的软件层面防护演进到内核级别的文件保护。
理解 Windows 95 的文件版本防护机制,不仅帮助我们认识到操作系统在面对不可信安装程序时所面临的复杂挑战,也让我们看到软件系统设计中预防性保护思想的价值。现代软件供应链安全同样需要这种多层防御的理念,在信任链的每一个环节都设置检查点和回滚能力,才能有效应对日益复杂的攻击面。
资料来源:OSNews 报道《Windows 95 defenses against installers that overwrite a file with an older version》引用自 Raymond Chen 的开发者博客,介绍了 Windows 95 SYSBCKUP 备份机制的具体实现细节。