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

JonathanHawke Messages postés 5 Date d'inscription vendredi 8 décembre 2006 Statut Membre Dernière intervention 9 décembre 2006 - 8 déc. 2006 à 15:54
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 - 9 déc. 2006 à 18:51
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 déc. 2006 à 16:00
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++
0
JonathanHawke Messages postés 5 Date d'inscription vendredi 8 décembre 2006 Statut Membre Dernière intervention 9 décembre 2006
8 déc. 2006 à 16:13
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 déc. 2006 à 16:20
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++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 déc. 2006 à 16:24
"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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 déc. 2006 à 16:27
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
0
JonathanHawke Messages postés 5 Date d'inscription vendredi 8 décembre 2006 Statut Membre Dernière intervention 9 décembre 2006
8 déc. 2006 à 16:43
"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.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 déc. 2006 à 16:45
La tu peux faire une copie de l'exécutable, c'est pareil :)

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
JonathanHawke Messages postés 5 Date d'inscription vendredi 8 décembre 2006 Statut Membre Dernière intervention 9 décembre 2006
8 déc. 2006 à 16:51
"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.
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
8 déc. 2006 à 22:40
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 déc. 2006 à 22:45
SetFileTime()

ciao...
BruNews, MVP VC++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 déc. 2006 à 23:52
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
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
9 déc. 2006 à 03:42
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"
0
JonathanHawke Messages postés 5 Date d'inscription vendredi 8 décembre 2006 Statut Membre Dernière intervention 9 décembre 2006
9 déc. 2006 à 10:38
"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...
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
9 déc. 2006 à 10:58
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.
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
9 déc. 2006 à 18:45
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"
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 déc. 2006 à 18:48
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
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
9 déc. 2006 à 18:51
Oui suite à l'invasion par Napoléon de cet état :)

ULARGE_INTEGERJokyQi=QI("Joky"
0
Rejoignez-nous