Y a-t-il un moyen de détecter si l’horloge du système a été modifiée dans Windows?

Sur une machine Windows, existe-t-il un moyen de savoir si l’heure a été modifiée sans surveillance continue des messages WM_TIMECHANGE?

Par exemple, je voudrais faire la première chose que fait mon application au démarrage: voir si l’heure a été modifiée depuis la dernière exécution de l’application.

Pour autant que je sache, la seule façon de voir un changement est de regarder le message WM_TIMECHANGE, mais je ne le verrai que si mon application est en cours d’exécution.

Oui. Vous pouvez lire les journaux d’événements Windows et rechercher les modifications apscopes à l’heure système. (Les changements d’heure système sont l’un des événements système qui sont automatiquement consignés.) Par exemple, je viens de modifier l’heure système de quelques secondes et les éléments suivants sont apparus dans le journal des événements système:

Informations 21/10/2011 11:16:26 AM Kernel-General 1 Aucun

L’heure système a été modifiée en 2011 – 10 – 21T16: 16: 26.000000000Z de 2011 – 10 – 21T16: 16: 26.000000000Z.

Vous pouvez utiliser l’API Win32 pour accéder aux journaux des événements, puis interroger ces événements pour déterminer si l’heure a bien été modifiée. Ce qui est génial avec cette solution, c’est qu’elle est intégrée et toujours en cours d’exécution. Pas besoin de surveiller les événements via un service personnalisé, etc. Vous interrogez simplement les données du système d’exploitation.

Ce n’est toujours pas une solution à l’épreuve des balles puisque les utilisateurs avec des droits d’administrateur peuvent modifier les parameters, effacer les journaux, etc. Les journaux d’événements système ne sont pas quelque chose que les utilisateurs de Windows pensent habituellement.

Le XML pour cet événement particulier: (non identifié pour la confidentialité et la sécurité)

     1 0 4 0 0 0x8000000000000010  138478   System xxxxx.xxxxxxxxx.org    2011-10-21T16:16:26.000000000Z 2011-10-21T16:16:26.000000000Z   

Non, vous ne pouvez pas. C’est pourquoi les systèmes DRM sensibles au temps sont en général plutôt inutiles.

Vous pouvez essayer de contourner ce problème en utilisant un service, puis vous devez contourner les temps d’arrêt du service en utilisant un autre hack et un autre hack en plus.

Quoi qu’il en soit, si c’est tout ce que vous essayez de faire, en stockant simplement quelque part (chiffré, éventuellement) la valeur de l’heure système à l’arrêt du programme, assurez-vous qu’il n’a pas été transmis au démarrage du programme. Cela n’empêchera pas les utilisateurs de “bloquer” le temps entre l’arrêt et le démarrage, mais cela suffira pour 9/10 des personnes essayant de passer le test temporisé.

Vous pourriez avoir votre application (pendant qu’il est en cours d’exécution) comparer périodiquement l’heure du système avec un temps récupéré à partir d’une ressource de serveur quelque part. Si vous constatez soudainement que la différence entre l’heure système et l’heure du serveur a augmenté, cela signifie que l’heure système a été rétablie.

Évidemment, cela ne fonctionnerait pas sur une machine sans access à Internet.

Une idée à ce sujet ci-dessus (bien que je remarque que la vérification par rapport à une horloge externe est la réponse définitive si possible) – vous pouvez également lire régulièrement l’horloge système et la stocker, éventuellement chiffrée, dans un fichier caché. Chaque fois que vous faites cela, vous vérifiez que la nouvelle valeur est plus récente que celle du fichier. Le déclencheur pour le faire pourrait être à chaque démarrage, etc.

Comme toutes les méthodes internes, celle-ci est vulnérable à une personne trouvant le fichier caché. Vous pouvez donc également signaler un problème si le fichier masqué est manquant ou si son horodatage ne correspond pas à son contenu.