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

Signaler
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Statut
Membre
Dernière intervention
8 octobre 2007
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
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?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
ça parait viable.

ciao...
BruNews, Admin CS, MVP VC++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
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é.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
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?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Ok merci.
Mais cet EXE a lui aussi besoin d'un petit BAT pour s'auto-supprimer.
Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Statut
Membre
Dernière intervention
8 octobre 2007
1
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
Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Statut
Membre
Dernière intervention
8 octobre 2007
1
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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
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.
Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Statut
Membre
Dernière intervention
8 octobre 2007
1
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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
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.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
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.
Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Statut
Membre
Dernière intervention
8 octobre 2007
1
Dommage, je connais pas encore assez pour essayer.
Je ferai une source dès que j'aurai les outils nécessaires.

eRoZion