Date Système

Le
Cameleon974
Bonjour,

Comment en C/C++ et sous Windows XP vérifier la date système et être
certain que l'utilisateur n'est volontairement pas revenu dans le
passé ? Contrainte : le programme ne peut s'executer qu'une seule fois
et ne doit pas écrire quoi que ce soit sur le disque. Mon idée de base
est de vérifier la date d'un fichier système Windows (genre un .log).
Mais lequel ?
Je suis preneur de toutes autres astuces plus élégantes

Merci !
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Sylvain
Le #9749741
Cameleon974 wrote on 14/10/2007 09:55:
Bonjour,

Comment en C/C++ et sous Windows XP vérifier la date système et être
certain que l'utilisateur n'est volontairement pas revenu dans le
passé ? Contrainte : le programme ne peut s'executer qu'une seule fois
et ne doit pas écrire quoi que ce soit sur le disque. Mon idée de base
est de vérifier la date d'un fichier système Windows (genre un .log).
Mais lequel ?



est-ce que la machine est supposée connectée ?
dans l'affirmative, vous pourriez obtenir une ""clé"" d'autorisation
d'exécution d'un serveur; l'autorisation prendrait en entrée des données
lues depuis la machine client (ID du CPU si dispo ou autre) et
stockerait évidemment ces infos pour ne délivrer qu'une autorisation par
machine.

Sylvain.
Patrick Philippot
Le #9749731
Bonjour,

Comment en C/C++ et sous Windows XP vérifier la date système et être
certain que l'utilisateur n'est volontairement pas revenu dans le
passé ? Contrainte : le programme ne peut s'executer qu'une seule fois
et ne doit pas écrire quoi que ce soit sur le disque. Mon idée de base
est de vérifier la date d'un fichier système Windows (genre un .log).
Mais lequel ?



Vous ne précisez pas si ces utilisateurs sont admin ou non ou éventuellement
si les 2 cas de figure sont possibles?


Dans un premier temps, la question n'est pas de vérifier si l'utilisateur a
changé l'heure système mais de l'empêcher de le faire. La permission de
changer la date système peut être spécifiée par utilisateur ou par groupe
(secpol.msc). Par défaut, un utilisateur non admin sous XP et Vista ne peut
pas changer l'heure. Vous pouvez retirer cette permission aux admins et la
réserver à un seul compte (ou à aucun si l'heure est gérée de manière
centralisée). Attention: sous Vista permission de changer l'heure système et
permission de changer le fuseau horaire sont séparées. Voir mon article sur
le règlement de ce problème: http://cs.mainsoft.fr/forums/thread/865.aspx .

Notez également que si l'utilisateur change l'heure système au niveau du
BIOS au moment du boot, on ne peut rien empêcher si le BIOS n'est pas
protégé par un mot de passe.

Ensuite, la question qui suit est "Oui mais si je veux vérifier si un
utilisateur *admin* a changé l'heure?". Se protéger en comparant l'heure
courante aux données d'un log ou au timestamp d'un fichier quelconque est
illusoire. Si l'heure est changée, elle va affecter tous les fichiers qui
sont mis à jour régulièrement. de plus, le timestamp peut varier si l'option
de mise à jour de la date de dernier accès a été désactivée sur la machine
pour améliorer les performances. Je ne vois aucun fichier système sur lequel
vous puissiez vous appuyer pour prendre une décision valide. Et un
utilisateur décidé n'aura pas de mal à déterminer quel fichier est ouvert
par votre application au démarrage (un petit coup de Filemon pendant
l'exécution et le problème est réglé).

Le seul moyen efficace est de lire l'heure système, de se connecter à un
serveur SNTP, d'envoyer une requête et de comparer.

S'il n'y a pas de connexion disponible sur la machine et/ou si l'accès au
serveur SNTP est bloqué par un pare-feu, une stratégie possible consiste a
démarrer sa propre horloge au démarrage du système (je suppose ici a)
l'utilisation d'un service et b) le fait que l'accès au BIOS est protégé) et
comparer régulièrement à l'heure système "officielle". Si l'écart - qui
existera toujours - dépasse une certaine valeur, c'est qu'il y a eu
manipualtion de l'horloge système. Cette stratégie ne s'applique qu'à un
service. Pour une application, c'est inutilisable car l'heure peut avoir été
modifiée avant le lancement de l'appli.

Mais encore une fois, l'administrateur fait ce qu'il veut et peut donc
mettre à mal la stratégie exposée ci-dessus. Donc si votre propos est
d'empêcher un administrateur de manipuler l'heure système afin d'assurer que
votre application s'exécute dans un contexte horaire exact, je ne vois pas
de solution hors gestion des permissions. Pour les autres, retirer leur
simplement cette permission s'ils en disposent.

Il serait également utile de nous préciser ce que vous cherchez à faire.
Protection d'une version d'essai d'un logiciel? Application de type contrôle
d'accès (mes réflexions sont issues de mon expérience avec PC TimeWatch, une
application de contrôle parental d'accès)?

Cordialement.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Thierry
Le #9749711
"Patrick Philippot" message de news: 471320b4$0$21551$

Le seul moyen efficace est de lire l'heure système, de se connecter à un
serveur SNTP, d'envoyer une requête et de comparer.



NTP, pas SNTP :-)
Patrick Philippot
Le #9747601
Thierry wrote:
Le seul moyen efficace est de lire l'heure système, de se connecter
à un serveur SNTP, d'envoyer une requête et de comparer.



NTP, pas SNTP :-)



La différence est-elle si énorme que ça? L'algorithme NTP est juste plus
compliqué mais grosso modo, on obtient le même résultat. Donc serveur SNTP
ou NTP, dans le cas présent, ça le fera de toute façon.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Vincent Burel
Le #9747591
"Cameleon974" news:
Bonjour,

Comment en C/C++ et sous Windows XP vérifier la date système et être
certain que l'utilisateur n'est volontairement pas revenu dans le
passé ? Contrainte : le programme ne peut s'executer qu'une seule fois
et ne doit pas écrire quoi que ce soit sur le disque. Mon idée de base
est de vérifier la date d'un fichier système Windows (genre un .log).
Mais lequel ?
Je suis preneur de toutes autres astuces plus élégantes...



Peut etre en regardant les historiques systèmes, quelle fichier a été lu
pour la derniere fois ? à quelle date ? est-ce cohérent avec la date
courante ? si oui remonter l'historique jusqu'à trouver une incohérence ?
sinon lire tous les fichiers du disque dur pour voir si aucun fichier
n'aurait une date postérieur à la date courante...

sinon y'a des solutions hardware, des module d'horloge PCI radio-controllée
(ex : DCF77 ou en France c'est l'émetteur d'Allouis), des modules GPS,
ou si vous etes connecté au net, en intérrogeant un serveur d'horloge...

VB
Thierry
Le #9747581
"Patrick Philippot" message de news: 47133cd5$0$28582$
Thierry wrote:
Le seul moyen efficace est de lire l'heure système, de se connecter
à un serveur SNTP, d'envoyer une requête et de comparer.



NTP, pas SNTP :-)



La différence est-elle si énorme que ça? L'algorithme NTP est juste plus
compliqué mais grosso modo, on obtient le même résultat. Donc serveur SNTP
ou NTP, dans le cas présent, ça le fera de toute façon.



Ok, je ne connaissais pas la version "simple" et croyait a un trompage dans
les sigles.
Je me rendort.
Publicité
Poster une réponse
Anonyme