Comment en C/C++ et sous Windows XP v=E9rifier la date syst=E8me et =EAtre
certain que l'utilisateur n'est volontairement pas revenu dans le
pass=E9 ? Contrainte : le programme ne peut s'executer qu'une seule fois
et ne doit pas =E9crire quoi que ce soit sur le disque. Mon id=E9e de base
est de v=E9rifier la date d'un fichier syst=E8me Windows (genre un .log).
Mais lequel ?
Je suis preneur de toutes autres astuces plus =E9l=E9gantes...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Sylvain
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.
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.
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
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
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
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
"Patrick Philippot" a écrit dans le 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" <patrick.philippot@mainsoft.xx.fr> a écrit dans le
message de news: 471320b4$0$21551$426a74cc@news.free.fr...
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.
"Patrick Philippot" a écrit dans le 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
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
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
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
"Cameleon974" wrote in message 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
"Cameleon974" <cameleonausud@gmail.com> wrote in message
news:1192348501.048942.103010@z24g2000prh.googlegroups.com...
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...
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
"Patrick Philippot" a écrit dans le 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.
"Patrick Philippot" <patrick.philippot@mainsoft.xx.fr> a écrit dans le
message de news: 47133cd5$0$28582$426a74cc@news.free.fr...
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.
"Patrick Philippot" a écrit dans le 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.