IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Modification de la date du système


Sujet :

C++

  1. #1
    Membre habitué Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Points : 137
    Points
    137
    Par défaut Modification de la date du système
    Bonjour à tous,
    j'aimerai pouvoir modifier la date du système (windows) depuis un .exe écris en c++ (ou en c si c'est plus facile), mais je n'ai trouvé que la manière de récupérer la date actuelle.
    Donc si quelqu'un a une idée, merci d'avance !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour,

    SetSystemTime function
    https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

    Attention il faut des privilèges spécifiques pour pouvoir modifier la date et heure système

    Cordialement

  3. #3
    Membre habitué Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Points : 137
    Points
    137
    Par défaut
    Merci beaucoup
    (Pour les privilèges je suis administrateur donc pas de problème et sinon c'était plutôt la date que je voulais changer mais c'est pas grave puisqu'il y a forcément une fonction équivalente dans le site que tu m'a mis en lien.)
    Par contre j'ai essayé, mais cette fonction n'a pas l'air de modifier l'heure du système (ni l'heure locale d'ailleurs):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <windows.h>
    #include <stdio.h>
     
    int main()
    {
        SYSTEMTIME st, lt;
     
        st.wHour=10;
        st.wMinute=10;
        lt.wHour=10;
        lt.wMinute=10;
        SetSystemTime(&st);
        SetLocalTime(&lt);
     
        GetSystemTime(&st);
        GetLocalTime(&lt);
     
        printf("The system time is: %02d:%02d\n", st.wHour, st.wMinute);
        printf("The local time is: %02d:%02d\n", lt.wHour, lt.wMinute);
    }
    résultat théorique:
    The system time is: 10:10
    The local time is: 10:10

    résultat réel:
    The system time is: 20:25
    The local time is: 22:25

    Où est le problème ?
    Merci d'avance !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Pour les privilèges je suis administrateur donc pas de problème
    Être administrateur désigne bien des choses mais aucunement le droit de tout faire.
    A la rigueur, il désigne le droit de se donner dynamiquement d'autres droits, mais c'est pas les pleins pouvoirs tout le temps.

    je voulais changer mais c'est pas grave puisqu'il y a forcément une fonction équivalente dans le site que tu m'a mis en lien.
    Généralement, il n'y pas de doublon dans les API système.
    Faudrait mieux faire avec, car les contraintes d'utilisation sont des plus "logique".
    Changez l'heure d'une machine est une action extrêmement dangereuse d'un point de vue sécurité car tous les mécanismes de sécurité sont basés directement ou indirectement sur cette heure.

    mais cette fonction n'a pas l'air de modifier l'heure du système (ni l'heure locale d'ailleurs):
    Il s'agit d'une API C, il faut toujours vérifier les valeurs de retour et appliquer les préconisations indiquées dans la documentation pour le traitement des erreurs.

    Le plus probable, c'est que vous n'avez pas donné assez de droit à votre exécutable.

  5. #5
    Membre habitué Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Points : 137
    Points
    137
    Par défaut
    je voulais changer mais c'est pas grave puisqu'il y a forcément une fonction équivalente dans le site que tu m'a mis en lien.
    Généralement, il n'y pas de doublon dans les API système.
    Faudrait mieux faire avec, car les contraintes d'utilisation sont des plus "logique".
    Si on rajoute les quelques mots avant, cela rend tous son sens à la phrase: "c'est la plutôt la date que je voulais changer".
    En effet, j'aimerai pouvoir modifier la date de l'ordi depuis un programme c++ tout en stockant la vraie date dans une variable afin de la rétablir à la fin de l'exécution du programme.
    Niveau sécurité, je ne pense pas que cela soit vraiment problématique puisque j'exécute le programme sans être connecté pour éviter les problèmes de synchronisation de la date; de plus la date ne reste changée que quelques secondes.

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    SetSystemTime() permet de modifier le temps au sens large, heure et date si tu préfères.
    As-tu vérifier la valeur retour de SetSystemTime(), as-tu appeler GetLastError() le cas échéant ?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Si c'est juste pour "berner" ton programme courant (ou un autre), il y a beaucoup beaucoup plus simple, court-circuiter les appels à ces primitives.

    Si c'est pour "berner" tout le système, je voudrais déjà savoir si je ne suis pas sur le point d'aider à commettre un acte illégal.

    En effet, j'aimerai pouvoir modifier la date de l'ordi depuis un programme c++ tout en stockant la vraie date dans une variable afin de la rétablir à la fin de l'exécution du programme.
    Il y a déjà une faille juste dans ce procédé. Vous savez comment que la date sauvegardé sera la bonne à la fin du programme ?

    Niveau sécurité, je ne pense pas que cela soit vraiment problématique puisque j'exécute le programme sans être connecté pour éviter les problèmes de synchronisation de la date; de plus la date ne reste changée que quelques secondes.
    Cela suffit à déglinguer une sécurité, réseau ou pas.

    Concrètement, qu'est-ce qui justifie de potentiellement dézinguer tous les programmes sur votre machine qui ont fait l'assertion que le temps s'écoule toujours dans le même sens ?

    J'ai l'impression que vous cherchez à utiliser un marteau-pilon sur une mouche.

  8. #8
    Membre habitué Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Points : 137
    Points
    137
    Par défaut
    En fait le but n'est aucunement de berner le système, mais ce changement de date qui ne dure que quelques secondes vise un programme en particulier qui se base sur la date au moment de son démarrage. En fait ce que je veux faire en c++ je peux très bien le faire à la main à chaque fois que je veux lancer le programme cible, seulement c'est long et pénible de devoir à chaque fois modifier la date et la remettre ensuite, donc je voudrais automatiser ce processus en faisant un programme qui change la date, lance le programme cible à berner, puis remet la vraie date juste après.

    Vous savez comment que la date sauvegardé sera la bonne à la fin du programme ?
    Il y a peu de risque que la date change entre le changement et le rétablissement de la date, surtout que mon programme ne modifierait que l'année (il faudrait le lancer un 31 décembre entre 23h59m55s et 23h59m59s pour avoir ce problème !).
    Sinon, niveau sécurité, je ne vois pas comment un changement de date pendant 5 secondes hors connexion peut tout chambouler !

    Si c'est juste pour "berner" ton programme courant (ou un autre), il y a beaucoup beaucoup plus simple, court-circuiter les appels à ces primitives.
    Si vous pouvez me donner un peu plus de précision à ce sujet, cela m'intéresse (même si je ne peux pas le mettre en oeuvre dans mon cas, j'aimerai bien comprendre comment marchent ces variables propres au système d'exploitation que sont la date, l'heure,...)

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    En fait le but n'est aucunement de berner le système, mais ce changement de date qui ne dure que quelques secondes vise un programme en particulier qui se base sur la date au moment de son démarrage.
    Le problème, c'est que des programmes comme ça, il y en a plein et qu'en le faisant au niveau du système entier, vous allez potentiellement casser pas mal de programmes qui tournent déjà.
    Quasiment tous les mécanismes de sécurité repose sur un système temporel pour les plages de validité (tokens, aléatoire, etc...), changer leur du système, c'est comme détruire toutes les murailles de protection.
    J'ai pas l'impression que vous soyez très versé dans la programmation système.
    Si vous n'êtes pas là pour de l'apprentissage mais pour résoudre efficacement votre problème, les utilitaires ne manquent pas :
    https://stackoverflow.com/questions/...-return-values
    Avec ceux-ci, vous ne bernez que votre cible, laissant les autres composants "safe".

    je veux faire en c++ je peux très bien le faire à la main à chaque fois que je veux lancer le programme cible
    Quand vous le faites vous-même, vous êtes dans le cadre de l'UAC, avec des droits activées, et pas juste activable.

    Il y a peu de risque que la date change entre le changement et le rétablissement de la date,
    Vous, vous connaissez pas encore Murphy, avec l'expérience, vous le connaitrez de mieux en mieux.

    Sinon, niveau sécurité, je ne vois pas comment un changement de date pendant 5 secondes hors connexion peut tout chambouler
    Faites un peu de sécurité informatique, vous verrez.

    Si vous pouvez me donner un peu plus de précision à ce sujet, cela m'intéresse
    Les outils utilisent généralement le mécanisme de détournement des fonctions du système. Au lieu d'appeler les fonctions comme "GetSystemTime" dans kernel32.dll, on patche le programme cible (en mémoire ou dans le fichier) pour qu'il appelle une fonction "custom" qui va bien.

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par racine carrée Voir le message
    ce changement de date qui ne dure que quelques secondes vise un programme en particulier qui se base sur la date au moment de son démarrage.
    A tout hasard, on parle d'un programme en version d'évaluation et on modifie la date système pour passer outre une licence expirée ?

  11. #11
    Membre habitué Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Points : 137
    Points
    137
    Par défaut
    Si vous n'êtes pas là pour de l'apprentissage mais pour résoudre efficacement votre problème, les utilitaires ne manquent pas
    Non, je veux vraiment savoir comment faire en c++, car ça m'intéresse de savoir un peu mieux comment marche mon système d'exploitation.
    Si c'était juste pour "résoudre efficacement mon problème", je ne poserais pas la question, sachant que j'ai déjà trouver un moyen de le faire en batch:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for /f "tokens=6-8 delims=/ " %%a in ('echo. ^|date') do set jour=%%a&set mois=%%b& set annee=%%c
    date %jour%-%mois%-2017
    start "" "C:\...\programme-à-berner.exe"
    timeout /t 5 /nobreak>nul
    for /f "tokens=6-8 delims=/ " %%a in ('echo. ^|date') do set jour=%%a&set mois=%%b
    date %jour%-%mois%-%annee%
    exit
    Ce code est ensuite à exécuter en faisant clic-droit, exécuter en tant qu'administrateur; mais il y a encore plus efficace: convertir ce code en exécutable avec bat-to-exe-converter, en cochant l'option "fenêtre invisible" (comme ça pas de fenêtre noire gênante, et on a vraiment l'impression d'exécuter directement le programme cible), et en cochant "requiert les droits d'administrateur" pour ne pas avoir besoin de faire clic-droit, exécuter en tant qu'administrateur.

    Et sinon, la loi de Murphy c'est bien quand on a deux possibilités (l'une pouvant devenir catastrophique, et l'autre non), mais ici je n'en ai qu'une, à moins que j'arrive à faire autrement (c'est à dire ne modifier la date que pour le programme cible), ce que je ne sais pas faire pour le moment

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Et sinon, la loi de Murphy c'est bien quand on a deux possibilités (l'une pouvant devenir catastrophique, et l'autre non)
    Non, dès qu'il y a possibilité de merdage, la question n'est pas "est-ce que cela va merdé ?" mais "Quand".
    Si on cherche pas les possibilités, on les trouve pas.

    Il est donc bien moins dangereux de "changer" l'heure du programme cible que celle de la machine entière.

    Alors, pour la version bourrin qui modifie la date et heure du système, vous connaissez déjà la primitive. Il faut juste ajouter les droits nécessaires à votre processus, comme indiqué dans la documentation.

    Pour la version "soft", comme indiqué dans les liens que j'ai donné, c'est juste une histoire de modifier le code qui s'exécute pour demander cette date au système pour qu'il le demande un votre bout de code (c'est assez facile à dire mais assez tricky à mettre en œuvre.)

  13. #13
    Membre habitué Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Points : 137
    Points
    137
    Par défaut
    il y a beaucoup beaucoup plus simple, court-circuiter les appels à ces primitives.
    j'ai fait plusieurs recherches à ce sujet, mais je n'arrive pas à trouver de tutoriel expliquant comment on peut le faire en pratique ?
    Si quelqu'un a ne serait-ce qu'un lien vers un site abordant la question, merci d'avance à lui !

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour ça, ceci pourrait aider: https://stackoverflow.com/questions/...ore-they-start
    Injecter une DLL, puis s'en servir pour faire un API Hooking sur les fonctions temporelles comme GetSystemTimeAsFileTime().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/07/2011, 11h09
  2. Modification de la date du système
    Par sidneyvba dans le forum Langage
    Réponses: 1
    Dernier message: 23/10/2007, 19h11
  3. [MFC]Modification date/heure système
    Par jacklafrip dans le forum MFC
    Réponses: 2
    Dernier message: 24/05/2007, 17h24
  4. [Utilisation] Récupérer les modifications depuis une date donnée
    Par Sapience dans le forum CVS
    Réponses: 1
    Dernier message: 15/02/2006, 12h08
  5. modification formulaire + validation date
    Par cari dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/01/2006, 09h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo