Peut-on écrire dans un fichier EXE en cours d'exécution?
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 2014
-
8 sept. 2004 à 17:14
cs_eRoZion
Messages postés241Date d'inscriptionvendredi 23 mai 2003StatutMembreDerniè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.
A voir également:
Peut-on écrire dans un fichier EXE en cours d'exécution?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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?
Vous n’avez pas trouvé la réponse que vous recherchez ?
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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é.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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?
cs_eRoZion
Messages postés241Date d'inscriptionvendredi 23 mai 2003StatutMembreDernière intervention 8 octobre 20071 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.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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.
cs_eRoZion
Messages postés241Date d'inscriptionvendredi 23 mai 2003StatutMembreDernière intervention 8 octobre 20071 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.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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.