是否有办法检测windows中的系统时钟是否已向后更改?

是否有办法检测windows中的系统时钟是否已向后更改?,windows,winapi,Windows,Winapi,在windows机器上,是否有办法在不持续监视WM_TIMECHANGE消息的情况下查明时间是否已向后更改 例如,我想让我的应用程序在启动时做的第一件事是查看自上次运行应用程序以来时间是否已更改 据我所知,查看更改的唯一方法是查看WM_TIMECHANGE消息,但我只会在我的应用程序正在运行时看到它。不,您不能。这就是为什么对时间敏感的DRM方案通常是无用的 你可以尝试通过使用一个服务来解决它,然后你必须通过使用另一个黑客来解决服务的宕机问题,以及在这个问题上的另一个黑客 无论如何,如果这就是你

在windows机器上,是否有办法在不持续监视WM_TIMECHANGE消息的情况下查明时间是否已向后更改

例如,我想让我的应用程序在启动时做的第一件事是查看自上次运行应用程序以来时间是否已更改


据我所知,查看更改的唯一方法是查看WM_TIMECHANGE消息,但我只会在我的应用程序正在运行时看到它。

不,您不能。这就是为什么对时间敏感的DRM方案通常是无用的

你可以尝试通过使用一个服务来解决它,然后你必须通过使用另一个黑客来解决服务的宕机问题,以及在这个问题上的另一个黑客

无论如何,如果这就是你想要做的,那么简单地将程序关闭时的系统时间值存储在某个地方(可能是加密的),然后确保它在程序启动时没有被传递就足够了。它不会阻止用户基本上“冻结”从关机到启动的时间,但它足以让9/10的用户通过您的定时试用。

是的。您可以阅读并查找对系统时间的更改。(系统时间更改是自动记录的系统事件之一。)例如,我刚刚调整了几秒钟的系统时间,系统事件日志中出现了以下内容:

信息2011年10月21日11:16:26上午内核常规1无

系统时间已更改为‎2011‎-‎10‎-‎21T16:16:26.000000000Z 从…起‎2011‎-‎10‎-‎21T16:16:26.000000000Z

然后,您可以查询这些事件,以确定时间是否确实被更改。这个解决方案的优点在于它是内置的并且总是运行。无需通过自定义服务等监控事件。您只需查询操作系统的数据

这仍然不是一个防弹的解决方案,因为拥有管理员权限的人可以随意设置、清除日志等,但你肯定会让你的应用程序具有外行身份。系统事件日志不是普通Windows用户所考虑的

该特定事件的XML:(为隐私和安全而取消标识)


1.
0
4.
0
0
0x80000000000010
138478
系统
xxxxx.xxxxxxxxx.org
2011-10-21T16:16:26.000000000Z
2011-10-21T16:16:26.000000000Z
你可以让你的应用程序(在它运行时)定期比较系统时间和从某个服务器资源获取的时间。如果您突然发现系统时间和服务器时间之间的差异增加了,这意味着系统时间被推迟了

显然,这在没有互联网接入的机器上是行不通的。

上面有一个想法(我注意到,如果可行的话,检查外部时钟是确定的答案)-您还可以定期读取系统时钟,并将其存储在某个隐藏的文件中(可能是加密的)。每次执行此操作时,都要进行检查,以确保新值比文件中的值更新。这样做的触发点可能是每次启动等


与所有内部方法一样,此方法容易被发现隐藏文件的人攻击。因此,如果隐藏文件丢失,或者其日期戳与内容不匹配,您也可以标记问题。

如果有办法做到这一点,我会非常非常惊讶。此外,它也不是重复(问题明确指出“没有
WM\u TIMECHANGE
”),我不认为它是重复的,因为我正在寻找是否有办法在事后检测到更改。其他问题是关于在变化发生时检测变化。与Jon&Nick达成一致。这是另一种情况。这不是一个骗局。这又增加了一个问题:有没有一种方法可以看到,即使在bios中,时钟是什么时候改变的?我认为这是正确的答案。我刚刚查看了日志,可以看到一些时间变化。我将编写一个小实用程序来搜索和转储更改。谢谢你的帮助。但是这些事件可以被删除,所以它仍然不是一个可靠的信息来源。虽然这是一个优雅的解决方案,Paul,但我仍然认为这不是一个规范的来源,不应该被依赖。没有办法真正确定时间是否改变了。正如前面提到的,这些事件可以被删除,但如果您从同一台机器上的另一个操作系统或BIOS本身更改时间,也可以完全绕过这些事件。@MahmoudAl Qudsi:我完全同意,并且在我的回答中提到了一个非常类似的警告。我会加粗使它更突出。请不要在你的帖子上签名。你也不需要包括一个公开,除非你的答案促进了你所属的产品、公司或网站。考虑时区变化或用户越过日期线。
  <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
  <Provider Name="Microsoft-Windows-Kernel-General" 
        Guid="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" /> 
  <EventID>1</EventID> 
  <Version>0</Version> 
  <Level>4</Level> 
  <Task>0</Task> 
  <Opcode>0</Opcode> 
  <Keywords>0x8000000000000010</Keywords> 
  <TimeCreated SystemTime="2011-10-21T16:16:26.001000000Z" /> 
  <EventRecordID>138478</EventRecordID> 
  <Correlation /> 
  <Execution ProcessID="40044" ThreadID="50016" /> 
  <Channel>System</Channel> 
  <Computer>xxxxx.xxxxxxxxx.org</Computer> 
  <Security UserID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" /> 
  </System>
  <EventData>
  <Data Name="NewTime">2011-10-21T16:16:26.000000000Z</Data> 
  <Data Name="OldTime">2011-10-21T16:16:26.000000000Z</Data> 
  </EventData>
  </Event>