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 !
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 !
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
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):
résultat théorique:
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(<); GetSystemTime(&st); GetLocalTime(<); printf("The system time is: %02d:%02d\n", st.wHour, st.wMinute); printf("The local time is: %02d:%02d\n", lt.wHour, lt.wMinute); }
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 !
Être administrateur désigne bien des choses mais aucunement le droit de tout faire.Pour les privilèges je suis administrateur donc pas de problème
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.
Généralement, il n'y pas de doublon dans les API système.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.
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.
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.mais cette fonction n'a pas l'air de modifier l'heure du système (ni l'heure locale d'ailleurs):
Le plus probable, c'est que vous n'avez pas donné assez de droit à votre exécutable.
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".Généralement, il n'y pas de doublon dans les API système.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.
Faudrait mieux faire avec, car les contraintes d'utilisation sont des plus "logique".
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.
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 ?
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.
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 ?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.
Cela suffit à déglinguer une sécurité, réseau ou pas.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.
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.
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.
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 !).Vous savez comment que la date sauvegardé sera la bonne à la fin du programme ?
Sinon, niveau sécurité, je ne vois pas comment un changement de date pendant 5 secondes hors connexion peut tout chambouler !
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,...)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.
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à.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.
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".
Quand vous le faites vous-même, vous êtes dans le cadre de l'UAC, avec des droits activées, et pas juste activable.je veux faire en c++ je peux très bien le faire à la main à chaque fois que je veux lancer le programme cible
Vous, vous connaissez pas encore Murphy, avec l'expérience, vous le connaitrez de mieux en mieux.Il y a peu de risque que la date change entre le changement et le rétablissement de la date,
Faites un peu de sécurité informatique, vous verrez.Sinon, niveau sécurité, je ne vois pas comment un changement de date pendant 5 secondes hors connexion peut tout chambouler
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.Si vous pouvez me donner un peu plus de précision à ce sujet, cela m'intéresse
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 vous n'êtes pas là pour de l'apprentissage mais pour résoudre efficacement votre problème, les utilitaires ne manquent pas
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:
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.
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
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
Non, dès qu'il y a possibilité de merdage, la question n'est pas "est-ce que cela va merdé ?" mais "Quand".Et sinon, la loi de Murphy c'est bien quand on a deux possibilités (l'une pouvant devenir catastrophique, et l'autre non)
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.)
j'ai fait plusieurs recherches à ce sujet, mais je n'arrive pas à trouver de tutoriel expliquant comment on peut le faire en pratique ?il y a beaucoup beaucoup plus simple, court-circuiter les appels à ces primitives.
Si quelqu'un a ne serait-ce qu'un lien vers un site abordant la question, merci d'avance à lui !
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager