Modifier un fichier .exe en cours d'exécution

Signaler
Messages postés
5
Date d'inscription
vendredi 8 décembre 2006
Statut
Membre
Dernière intervention
9 décembre 2006
-
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
-
Bonjour,

Je souhaîte écrire un programme qui est capable de se modier lui-même et de mettre à jour son fichier .exe correspondant. Tout se passe bien si je sauvegarde les modifications sous un autre nom de fichier que celui en cours d'exécution. Mais le problème c'est que je voudrais directement modifier celui qui est exécuté. Windows m'interdit cette modificiation.

Le but est de faire un programme qui se "souvient" de son passé, sans avoir à écrire dans des fichiers auxiliaires.

Existe-t-il une fonction permettant d'outre-passer l'interdiction d'écriture imposée par le système, ou de faire croire au système que le programme a été quitté mais que celui-ci continue de s'éxécuter en RAM ?

Merci!

Jonathan

17 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
N'a aucun sens ton truc, un prog n'est en ram que tant que le système l'y héberge sinon il n'existe plus.

ciao...
BruNews, MVP VC++
Messages postés
5
Date d'inscription
vendredi 8 décembre 2006
Statut
Membre
Dernière intervention
9 décembre 2006

Merci de ta réponse mais tu n'as pas compris mon problème (je me suis probablement mal expliqué, mais je te garanti que ça a un sens puisque ça marche très bien sous Linux).

Je vais plutôt donner un exemple simple qui résume très bien ce que je veux faire:

Disons que je veux un programme "prog.exe" qui lorsqu'on l'exécute affiche "Ce programme a été exécuté 1 fois". Lorsqu'on l'exécute une deuxième fois, il affiche "Ce programme a été exécuté 2 fois". La prochaine fois il affichera "Ce programme a été exécuté 3 fois". Et ainsi de suite. Mais je ne veux pas que le programme utilise de fichier .dat ou .ini pour stocker l'état du compteur. Je veux en fait que ce compteur soit stocké dans l'exécutable lui-même.

Pour cela le programme charge une copie de lui-même dans un buffer, effectue un modification adéquate sur ce buffer, et sauvegarde ce buffer sous le même nom que le programme en cours d'exécution. Encore une fois, pas de problème avec Linux, mais Windows quant à lui m'interdit l'écriture car le fichier est en cours d'exécution.

Voilà, j'espère que c'est un peu plus clair.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Mais j'avais très bien compris sauf que sous Windows on ne modifie pas l'exe qui est chargé, Windows n'autorise qu'un handle SHARE_READ sur le fichier.
Il faut pour cela une mini ruse, prog externe qui se chargera de mettre à jour. Cet auxiliaire peut très bien se trouver en ressource, extrait à l'exécution et se supprimer en fin de parcours.

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
"faire croire au système que le programme a été quitté mais que celui-ci continue de s'éxécuter en RAM"

Tu es vraiment sur que ca à un sens? Je ne pense pas

Je pense que ce ne serai pas logique non plus de modifier un exe en cours d'exécution. Il me semble qu'un exécutable n'est pas chargé entièrement en mémoire dès le début (seulement les parties utiles). Dans ce cas, il serait impossible de retrouver le code correspondant à l'exe qui est en tain de s'exécuter

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
De toutes facons, les fichiers de savegardes externes (ou la base de registres) sont une solution plus propre, par exemple pour revenir facilement à la configuration d'origine (il suffit de supprimer ces fichiers). C'est la solution utilisée par tout le monde, pourquoi vouloir faire autrement?

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
5
Date d'inscription
vendredi 8 décembre 2006
Statut
Membre
Dernière intervention
9 décembre 2006

"C'est la solution utilisée par tout le monde, pourquoi vouloir faire autrement?"

Parce que je ne veux pas faire comme tout le monde. Je cherche à compliquer au maximum la vie de l'utilisateur/cracker qui voudrait traffiquer les fichiers externes afin que le programme lui donne ce qu'il veut. Mon programme est un jeu de lotterie qui a besoin de sauvegarder des infos (comme le solde de crédit de l'utilisateur, un checksum qui permet de voir si les variables du programme ont été modifiées à l'aide d'un debbuger, et d'autres trucs) afin qu'elles soient disponibles lors de la prochaine exécution.

Si le solde créditeur de l'utilisateur est stocké dans un fichier, il suffirait à l'utilisateur de faire une copie de ce fichier et de la restaurer s'il perd afin de récupérer ses crédits.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
La tu peux faire une copie de l'exécutable, c'est pareil :)

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
5
Date d'inscription
vendredi 8 décembre 2006
Statut
Membre
Dernière intervention
9 décembre 2006

"La tu peux faire une copie de l'exécutable, c'est pareil :)"

Non, j'ai trouvé une astuce qui permet de détecter ça (mais que je préfère garder secrète, car elle fait partie de la sécurité de mon programme). Malheureusement cette astuce n'est pas applicable pour un fichier externe.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Il me semble que la cryptographie est faite pour ça, une clef privée sur ton serveur et des clefs publiques pour chacun de tes clients, ou simplement un code de ton cru pour décrypter un fichier externe que l'utilisateur ne verra jamais. Meme si il est vrai que tout est crackable, cela dit ton idée est originale.
Sinon grace à la date de création d'un fichier, on peut empecher la vulgaire copie/remplacement.
Tchao.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
SetFileTime()

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
J'imagine que la protection de [auteurdetail.aspx?ID=930405 JonathanHawke] est ausi basé sur la date. Dans ce cas, on pourrait la contourner avec SetFileTime

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Connection à une base de donnée sur internet
c'est pas plus rapide et beaucoup plus pratique pour toi de gérer tes clients ???

ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
5
Date d'inscription
vendredi 8 décembre 2006
Statut
Membre
Dernière intervention
9 décembre 2006

"J'imagine que la protection de JonathanHawke est ausi basé sur la date"

C'est une possibilité, mais il y a d'autres informations qui sont spécifiques et uniques à chaque fichier.

"Connection à une base de donnée sur internet c'est pas plus rapide et beaucoup plus pratique pour toi de gérer tes clients ???"

Pour ça je ne sais pas encore comment on fait... Il faut que je me renseigne un peu pour savoir comment on peut écrire un programme qui utilise la connection internet...
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Heu, on m'a reproché de mélanger le Français et l'Anglais, alors je vous le dis, conneXion avec un X siouplait...
Tchao.
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Lol mais moi je te l'ai jamais reproché :p
Enfin bref, je mélange moi même le Français et l'Anglais
Et en plus d'après Wikipédia, c'est un erreur hyper courante...

C'est Napoléon qui a instauré le X pour se démarquer des Anglais enfin bref, ptite histoire amusante.

ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tout à fait. Il en est d'ailleurs de même en espagnol :)
Mais ceci n'excuse pas ta très grosse faute!

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Oui suite à l'invasion par Napoléon de cet état :)

ULARGE_INTEGERJokyQi=QI("Joky"