时间炸弹
时间炸弹(或定时炸弹)是一种软件机制,在达到设定的时间段后使计算机程序无法使用。它常见于预发布软件中,用于阻止用户保留过时的测试版本。
意义与目的
以 Microsoft Windows 来说,绝大部分的 Beta 版本/预览版本(Beta/Preview)、评估版本(Evaluation)等非正式授权的 Windows 副本一旦安装完成,便会存在一个使用的最后期限,超过这一期限之后,时间炸弹即被触发,系统便会因此拒绝启动或定时关机或重启,无法正常使用。对于部分版本,时间炸弹一旦被触发,带来的影响甚至是不可逆的,即便再将计算机时钟调回期限之前也无法消除。
时间炸弹的意义与目的在于,阻止用户在某一 Beta 版本/预览版本(Beta/Preview)、评估版本(Evaluation)等非正式授权的 Windows 副本(或其他操作系统副本)中长期使用,防范发布的预发布版本被用于除测试和评估之外的其他任何用途。当时间炸弹触发时,系统将阻止用户启动或登录到桌面继续使用,从而让用户将 Windows 副本(或其他操作系统副本)更换为正式版本。
时间炸弹的分类
根据使用期限的确定方式不同,时间炸弹分为固定日期和顺延日期两种。
- 固定日期时间炸弹,顾名思义,指的是无论用户何时安装操作系统,此操作系统副本的时间炸弹都会在某一预先设定的日期触发,这多见于一般的 Beta 版本/预览版本(Beta/Preview)中。在 Windows 的所有版本中,大多数版本的时间炸弹均属于此类时间炸弹。
- 顺延日期时间炸弹,与固定日期时间炸弹不同的是,此类时间炸弹并不采取固定的某一预先设定日期触发,而是从用户安装操作系统完毕开始计算,以此为基础向后顺延某一固定的天数,当达到此顺延的天数(90 天、120 天、180 天等)时,时间炸弹触发。在 Windows 的少数 Beta 版本和一般产品的评估版本中,预设的均为此类时间炸弹。
Windows
Windows 9x

时间炸弹通过 IO.SYS 激活。触发时间炸弹后,Windows 将在启动时显示一条消息,指出预评估期已过期,然后立即关闭。除非使用正确的 BIOS 日期重新安装操作系统,否则操作系统将无法启动,因为 IO.SYS 会自行修补以进入无限循环。与 Windows NT 中的时间炸弹不同,Windows 9x 无法通过 winver 找到到期日期。Windows 95 Build 216 是首个包含时间炸弹的已知版本。
从 Windows 98 开始,安装程序还会检查日期,如果日期设置不正确,安装程序将拒绝安装。
Windows NT

END_OF_NT_EVALUATION_PERIOD 错误检查
一旦触发了时间炸弹,就会显示 END_OF_NT_EVALUATION_PERIOD 错误检查,在经过一段时间后重启系统。用于实现时间炸弹的代码最早出现在 Windows NT 4.0 Build 1166 中,此版本用于最终发布的评估版。首个包括现代时间炸弹的版本是 Windows 2000 Build 1627.1,不过 Windows NT 3.5 的日语和朝鲜语预发行版本里,会弹出一个提示框,提醒用户在某个日期之后安装 Windows 的零售版本,这和当时其他版本不同。
在 Windows XP 测试版本中,尝试登录用户账户会导致出现过期提示。关闭提示会立即导致系统崩溃。然而,在开发重置前的 Windows Longhorn 版本中,当在过期日期之后尝试登录时,系统会退出用户登录并返回到登录界面。在开发重置后的版本中,例如 Windows Vista Build 5384,登录会弹出激活提示,关闭提示会注销用户。
在自 Build 6574 开始的 Windows 7 版本中,用户仍然可以登录系统,但会启动一个 30 分钟的“重启”循环(会导致错误检查),让用户有机会激活 Windows 或安装更新版本。
Windows 8 及以上版本包括了较为温和的“时间炸弹”变体;当前操作系统安装将被停用,电脑设置中的个性化选项将被禁用,且重启循环延长至一小时。此外,某些版本可能会稍微提高“Microsoft 机密”披露警告的位置,以表明时间炸弹已被触发。
从原始版本到创意者更新,大部分 Windows 10 版本都是外部测试签名;二进制签名检查会考虑证书的过期时间。当时间触发激活时,Windows 启动管理器和相关的引导加载程序会因为签名失效而无法正常工作。由于用户在不知情的情况下安装了在 Internet 上被广泛传播、几乎没有监管的公共 Insider Preview 版本(此问题自 Windows 10 Build 9841 起就存在,这是首个 Windows 10 Technical Preview 版本),所以在 Build 14964 中,Windows 加密库(mincrypt;静态链接在代码完整性库和 Windows 启动管理器中)进行了修改,允许使用已过期的外部测试代码签名证书链,并给用户机会升级到最新的 Windows 版本。
尝试使用过期版本时会引发很多问题,外部测试代码签名证书会在其预期有效期之外进行验证。在当前日期和时间下运行这些版本可能导致的问题示例如下:
- 像旧版的 Windows Defender 用户界面和内置的 Windows 诊断工具等应用,由于相关签名检查失败,会无法启动;
- 即使应用本身是由 Microsoft 签名的,用户帐户控制也可能会提示不信任的可执行文件或阻止其运行。这种情况在全新安装体验和启动某些系统应用(如任务管理器)时尤为常见;
- 非关键的系统驱动程序,例如打印机后台程序,安装后将无法使用。如果需要使用这些驱动,可以手动安装,且必须绕过驱动签名强制检查。
检测
可以通过检查结构 KUSER_SHARED_DATA 中的字段 SystemExpirationDate 的值来获取时间炸弹的到期日期和时间,[1]此结构在用户模式下的地址是 0x7FFE0000。[2]如果没有时间炸弹,此字段会被设置为零;否则,它会被设置为到期日期和时间的 UTC 文件时间。[a]
技术细节与安全研究
2026 年 1 月 20 日,一部关于 Windows 时间炸弹机制的安全研究白皮书《TimeDefuser》发布。从文档中可以总结出时间炸弹的内部工作原理如下:
- 系统启动时,
ExInitializeTimeRefresh内核函数会初始化硬件与系统时钟的同步,并通过特定版本的机制(如注册表、Windows 产品激活数据、产品策略)获取到过期日期,并填充两个内核私有全局变量ExpNtExpirationDate和ExpNtExpiratonData,以及KUSER_SHARED_DATA结构中的SystemExpirationDate字段。在 Windows Vista 及以上版本中,这由一个称作ExGetExpirationDate的辅助函数完成。 - 在接下来的每小时,内核会运行
ExpTimeRefreshWork例程,执行硬件与系统时钟的同步,并额外将当前系统时间与内核内存中存储的过期日期进行比较。在 Windows Vista 及更高版本中,它还会再次调用ExGetExpirationDate,并重新填充内核内存中存放过期数据的字段。 - 如果过期日期已到,它会设置一个名为
ExpNextExpirationIsFatal的内部标志,并且在 Windows XP 及以前版本,会通过NtRaiseHardError向用户显示错误信息,提示此版本已过期。 - 在随后的执行中,
ExpTimeRefreshWork会通过END_OF_NT_EVALUATION_PERIOD蓝屏终止系统。
macOS
Mac OS X Public Beta 是唯一已知包括时间炸弹的 macOS 版本。虽然时间炸弹阻止了用户登录到桌面,但它不会影响 Darwin 内核的各个方面或与用户界面无关的任何其他组件。
Mac OS X 到 Snow Leopard 的多个服务器版本也有一个到期日期,这会导致全新安装体验拒绝任何超过到期日期的串行密钥。
iOS
早期 iOS 版本(2.0 beta - ?)
iOS beta(直到某个时间点)在过了某个日期后将无法与苹果的服务器激活。
iOS 16.0+
这些版本的某些 InternalUI 版本有一个时间炸弹,设计是在超过某个日期后,或者如果经过了足够的时间,通过删除 Preboot 分区上的 kernelcache 文件来让设备变砖。
所有 iOS 版本
过了某个日期,iOS beta 会提示更新,格式为“有新的 iOS 更新可用。请从 iOS(版本)测试版更新。(A new iOS update is now available. Please update from the iOS (version) beta.)”