Chrono Mock
语言简体中文

下载 Chrono Mock

同一引擎的两个版本:用于探索的窗口,和用于 CI 的命令行。任意一个解压到哪里都能运行,无需安装程序、不写注册表、不需要管理员权限。也可以安装已签名的 .msi,供这台计算机上的每个账户使用:只在安装时需要一次管理员权限,运行时不需要。

文件说明大小
ChronoMock-app-win-x64.zip 桌面应用,自包含——无需另外安装 .NET ~70 MB
ChronoMock-app-win-x64.msi 桌面应用和命令行,为这台计算机上的每个账户安装:开始菜单项,以及 PATH 中的 chrono ~58 MB
ChronoMock-cli-win.zip 仅命令行工具,适用于 CI 和脚本 ~2.4 MB

运行环境要求

  • Windows 10 或 Windows 11。没有 macOS 或 Linux 版本——在 Linux 上,libfaketime 已经能很好地胜任这件事。
  • 不需要其他任何东西。桌面版自带运行时,命令行版则什么都不带。
  • 32 位和 64 位应用都受支持。安装包两者都带,并会选择与你所指向的应用相匹配的那一个。

ARM64 在 1.0 版本之前不在范围之内,打包的商店应用(UWP 和 MSIX)也不受支持——它们的启动模型不允许这样做。

运行方法

解压后,运行 ChronoMock.exe 使用窗口版,或运行 chrono.exe 使用命令行版。第一次会话只需要做三个决定:哪个应用、哪个时刻,以及时钟应该跑多快。

# 让应用以 2027 年的最后一秒来运行
chrono run "C:\apps\test.exe" --at 2027-12-31T23:59:59

# 同样的事,但时钟以每分钟一天的速度运行
chrono run "C:\apps\test.exe" --at 2027-12-31T23:59:59 --mode x1440

先读这两件事

在第一次进行未来日期的会话之前,请先备份应用的数据目录。

一个运行在 2028 年的应用,会在它存放数据的所有地方写入 2028 年的日期:数据库、配置、缓存、许可证文件。回到真实时间之后,这些值仍然留在那里。对于带有许可证保护的软件,这可能是永久性的——“检测到时钟回拨,许可证已失效”是业界的标准做法,它会严格按设计初衷行事。

Chrono Mock 会清理它自己留下的东西,但无法替你测试的那个应用善后。

你的杀毒软件可能会报警,这是意料之中的。

改变时间的方式,是把一个小型库注入目标进程。这是一种合法的、有文档记载的 Windows 技术——恶意软件也会使用它,所以 Microsoft Defender 等软件可能会对被注入的库报警,甚至直接阻止注入。这是由该技术触发的误报。

如果会话拒绝启动、而 Defender 报告了威胁,请排除这个库而不是整个文件夹:在 Windows 安全中心选择文件,并填入 chrono_hook.dll 的完整路径。文件夹排除会让工具用来注入的那个目录里的所有内容都不再被扫描。或者,在你有权限这样做的机器上运行它。被注入的库由本仓库中的代码在 GPL-3.0 下构建——你可以自己重新构建。Chromium 和 Electron 模式完全不注入,不受影响。

它留下了什么

系统里什么都不留:没有常驻的钩子,没有注册表项,除了三样它会明确告知你的东西之外,也不会在自己的文件夹以外留下任何内容——会话历史和诊断日志,在工具自己的文件夹不可写时会移到 %LOCALAPPDATA%\ChronoMock\;还有,对 Electron 或 Chromium 目标来说,在 %TEMP% 下的一个一次性浏览器配置文件,它会在会话结束时删除,如果删除不了,会在会话摘要中报告。

这指的是 zip 包。安装程序是例外,并会说明它添加了什么:Program Files 中的程序、开始菜单项、计算机 PATH 中的 chrono、「设置」「应用」中的一项,以及注册表项 HKLM\Software\DonislawDev\Chrono Mock。卸载会全部移除,并保留 %LOCALAPPDATA%\ChronoMock\ 不动。另有一个默认关闭的选项会在会话期间写入一个注册表值,并在结束后删除:--elevated-embedded。

它从不连接互联网,不需要账号,也不发送遥测数据。