Peut-on écrire dans un fichier EXE en cours d'exécution?

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 8 sept. 2004 à 17:14
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 - 10 sept. 2004 à 05:53
Salut à tous,
Je viens de lire le forum sur l'auto-suppression d'un fichier exécutable. Ton astuce est géniale Brunews.
Mon idée est de stocker un mot de passe, modifiable plutard, dans le fichier exécutable de l'application sans avoir recours aux ressources. J'ai déjà essayé, après avoir repéré l'emplacement de la chaine contenant le mot de passe grâce à un éditeur hexa. J'ai mis cet emplacement dans le fichier source, sans rien changer d'autre pour que la taille de l'exécutable reste la même. Quand l'application tente de sauvegarder le nouveau mot de passe, l'accès en écriture au fichier lui est refusée.
J'aimerais bien savoir s'il y'a un moyen pour y parvenir.
Merci beaucoup.

19 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 sept. 2004 à 17:23
Avec WriteProcessMemory() on peut ecrire dans l'image chargee en memoire.
Par contre on n'ecrit pas dans l'exe sur disque tant qu'il est charge, faut un second petit module pour cela.

ciao...
BruNews, Admin CS, MVP VC++
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
8 sept. 2004 à 18:51
Merci Brunews,
Bref, la réponse est donc "NON". Quand on est sûr que c'est impossible on ne se casse plus la tête avec. Cela nous évite la perte de temps et nous permet de penser à un autre moyen. Je viens d'apprendre sur MSDN que même en utilisant les ressources, on ne peut pas modifier une ressource dans un fichier en cours d'exécution.
Encore une fois merci.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 sept. 2004 à 18:59
Moi je n'ai pas dit non... tout a fait possible, le second petit module en ressource binare de l'exe principal, tu vois ou ça peut mener ?

ciao...
BruNews, Admin CS, MVP VC++
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
8 sept. 2004 à 19:22
Je viens d'avoir une idée qui pourrait peut-être marcher grâce à ton astuce du BAT:
1- Copier le contenu du fichier EXE de l'application en cours dans un buffer.
2- Modifier la chaine voulue dans le buffer.
3- Ecrire le buffer dans un fichier portant un nom différent de celui de l'application.
4- Supprimer le fichier EXE en cours grâce à l'astuce du BAT.
5- Renommer (dans le BAT) le fichier créé à partir du buffer en lui donnant le nom de celui qu'on vient de supprimer.

Ca parait un peu lourd, mais logiquement ça devrait marcher.
Qu'en pensez-vous?
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 sept. 2004 à 19:29
ça parait viable.

ciao...
BruNews, Admin CS, MVP VC++
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
8 sept. 2004 à 19:53
A propos de la ressource binaire, elle doit être dans un fichier supplémentaire, alors que moi je veux tout faire dans le même fichier exécutable de l'application.
Dès que j'ai un peu de temps, j'essaierai d'ajouter la commande "RENAME", suivie du chemin du fichier à renommer, au code d'auto-suppression, puis faire des tests pour voir ce que cela donnera.
A très bientôt.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 sept. 2004 à 20:00
Une ressource binaire est interne a l'exe, j'ai fait exemple ici:

DLL HOOK EN RESSOURCE BINAIRE DU PROG (WIN32)
http://www.cppfrance.com/code.aspx?id=25450

pourrait y avoir idem un exe a la place de la dll.

ciao...
BruNews, Admin CS, MVP VC++
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
8 sept. 2004 à 20:30
Quand on inclut une ressource binaire dans un fichier EXE , on ne peut pas la modifier pendant son exécution. Les fonctions BeginUpdateResource(), UpdateResource() et EndUpdateResource() ne peuvent pas modifier une resource dans un fichier EXE en cours d'exécution. L'accès en écriture leur est refusé.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 sept. 2004 à 20:32
Si tu mets un exe en ressource c'est pour que soit lui qui te modifie et pas le contraire.

ciao...
BruNews, Admin CS, MVP VC++
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
8 sept. 2004 à 22:01
D'accord, si j'ai bien compris, je mets un EXE en ressource, l'application le copie dans le disque dur puis le lance. Ce dernier s'occupe de la modification de la chaine de mot de passe. Il ne peut le faire que si l'application principale est arrêtée. Il faudra ensuite qu'il s'efface lui même en utilisant l'astuce du BAT. C'est pas mal comme idée mais je pense que la solution du RENAME est préférable. Non?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 sept. 2004 à 22:16
Les 2 faisables, exe a plus de possibilites qu'un pauvre bat seul, a toi de voir si suffit.

ciao...
BruNews, Admin CS, MVP VC++
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
8 sept. 2004 à 22:29
Ok merci.
Mais cet EXE a lui aussi besoin d'un petit BAT pour s'auto-supprimer.
0
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 1
9 sept. 2004 à 00:29
Pasbesoin de bat, il suffit qu'une fois le programme initial modifié relancé par le programme modifieur, le programme
initial se charge de supprimer celui qui vient de le modifier.

En clair (je fais du mieux que je peux mais c'est pas évident) :
_ exe A copie son exe B en ressources sur le disque
_ exe A se ferme en lancant B
_ exe B modifie exe A
_ exe B se ferme en lancant A modifié
_ exe A modifié supprime exe B

C'est l'opération de quelques millièmes de secondes (pour quelques octets de modifiés).
Totalement invisible.

eRoZion
0
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 1
9 sept. 2004 à 00:37
Oui au fait, petite note...
Au début j'ai cru que tu voulais qu'un exe C écrive dans un exe D déjà en cours d'execution (les deux indépendants).

Si c'était en partie ça que tu te demandais, je crois vraiment pas que ce soit possible sans tuer le processus, modifier, puis relancer.


eRoZion
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 sept. 2004 à 04:05
C'est une bonne idée eRoZion mais ce serait dommage de quitter puis relancer l'application pour un simple changement de mot de passe. En effet, pour que le changement soit effectif, il faudra quitter l'application principale. Ce serait lourd de la relancer une deuxième fois juste pour effacer l'exe modifieur. Pour eviter cela, je pense que l'auto-suppression par BAT est préférable.
0
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 1
9 sept. 2004 à 12:07
Non mais tout se fait automatiquement et très rapidement.
Il n'y a qu'une seule fermeture de l'exe pricncipale et qu'un seul relancement, le tout fait par les programme eux-même, pas besoin de clic utilisateur.

Si tu veux revenir à l'endroit exact de la fenêtre de changement du pass, et bien tu n'a qu'à te servir d'un argument particulier que le modifieur enverrait au principal en le relancant après modification (donc que B en se fermant envoie à A penant qu'il le relance) et qui ferait sauté directement au bon endroit.

C'est pas évident à expliquer.
Mais pas besoin de bat.

eRoZion
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 sept. 2004 à 16:47
Ok merci eRoZion,
Tu as raison car si les deux EXE communiquent à travers quelques paramètres tout se fera automatiquement. Je vais essayer les différentes méthodes pour voir les résultats.
A bientôt.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 sept. 2004 à 02:48
Salut,
La solution des 2 EXEs n'est pas aussi facile qu'on peut le croire. Ca ne dure pas des millisecondes mais plutot des secondes. L'accès en écriture à l'EXE qui vient de quitter est refusé. Il faut attendre quelques secondes avant de pouvoir effacer le fichier. C'est peut-être dû au système d'exploitation. La fonction DeleteFile() n'est pas asynchrone comme le BAT.
0
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 1
10 sept. 2004 à 05:53
Dommage, je connais pas encore assez pour essayer.
Je ferai une source dès que j'aurai les outils nécessaires.

eRoZion
0
Rejoignez-nous