IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Ecrire dans un fichier .exe en cours d'éxécution.


Sujet :

Windows

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut Ecrire dans un fichier .exe en cours d'éxécution.
    Bonjour à tous,

    J'ai parcouru les FAQs et forums et je n'ai pas trouvé la réponse à ma question (pardon si je l'ai manquée).

    Alors voilà:

    Je souhaîte écrire un programme qui sauvegarde des données dans son propre fichier exécutable. Pour cela le programme charge une copie de lui-même dans un buffer, je parcours le buffer à la recherche d'une séquence de caractère spécique qui m'indique que les 1000 octets qui suivent sont libres pour stocker mes données.. Ensuite je sauvegarde le buffer en écrasant le fichier en cours d'éxécution. Je m'explique peut-être un peu mal, mais ce que je veux c'est un programme qui se modifie lui-même (un peu comme un virus polymorphe, mais c'est pas pour faire un virus).

    Bon... ça marche très bien sous Linux, mais comme d'habitude c'est refusé par Windows car le système interdit toute modification d'un fichier en cours d'éxécution.

    Je voulais donc savoir s'il y a moyen d'utiliser une fonction qui permet de forcer l'écriture, ou s'il y a moyen de modifier un drapeau pour faire croire au système que le fichier n'est plus en cours d'exécution.

    Merci d'avance pour vos réponses,

    Valy.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Non, tu ne peux.
    Quand les MessageMates faisaient ça, ils enregistraient le nouveau message dans un nouvel exécutable.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Même sur un linux bien configuré, où l'utilisateur n'a pas les droits d'écriture sur l'exécutable, ça devrait logiquement ne pas marcher...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Bon... ça marche très bien sous Linux, mais comme d'habitude c'est refusé par Windows car le système interdit toute modification d'un fichier en cours d'éxécution.
    Aaah ce bon windows...
    Toujours là pour innover dans la loufoquerie !
    Boost ftw

  5. #5
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    salut,

    A mon avis, le plus simple, pour l'avoir expérimenté, est de faire une copie de ton programme sur le disque. De modifier cette copie. de l'executer tout en fermer l'ancien.

  6. #6
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut Précision
    Le problème est que je veux que ce soit transparent pour l'utilisateur. Il exécute le programme, le quite, quand il revient le programme se souvient des précédentes cessions... Je pourrais bien sûr écrire les données dans un fichier séparé, mais je ne veux pas que l'utilisateur puisse les modifier à la main. Evidement je peux crypter les données, mais je ne veux pas que l'utilisateur puisse se contenter d'effacer ce fichier de données afin de réinitialiser le programme.

    Merci en tout cas d'avoir répondu.

    Valy.

  7. #7
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut Ca c'est pas un problème
    Citation Envoyé par JolyLoic
    Même sur un linux bien configuré, où l'utilisateur n'a pas les droits d'écriture sur l'exécutable, ça devrait logiquement ne pas marcher...
    L'utilisateur utilise une copie du programme. La copie lui appartient, donc il n'a pas de problème pour obtenir l'accès en écriture.

  8. #8
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Autre solution:
    A la sortie de ton programme tu lance un petit exe qui va modofier le code de ton exe principale qui vient de se fermé. Ni vue ni connu par l'utilisateur!

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En transparent ? OK.

    Lorsque l'utilisateur lance le programme sans paramètre:
    Avant même d'afficher une fenêtre, tu le copies (tu peux afficher un SplashScreen pendant ce temps) et tu lances la copie avec un paramètre secret, voire un mécanisme plus compliqué. Tu quittes le premier processus avant d'afficher une vraie fenêtre (ou juste après avoir affiché un splash screen).
    La copie, elle affiche directement la fenêtre, exécute ce que tu veux, et écrit les modifications dans l'original... Et elle peut sûrement s'effacer elle-même en quittant si elle s'ouvre en lecture avec CreateFile() et le flag FILE_FLAG_DELETE_ON_CLOSE...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut C'est une solution
    Oui en effet, ça pourrait être la bonne solution... Merci. Mais je suis surpris qu'il n'y ait pas moyen de forcer le système à accepter l'écrasement du fichier.

    Je vais essayer vos suggestions, qui clairement devraient marcher.

    Valy.

  11. #11
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut Encore un problème
    Citation Envoyé par Médinoc
    Et elle peut sûrement s'effacer elle-même en quittant si elle s'ouvre en lecture avec CreateFile() et le flag FILE_FLAG_DELETE_ON_CLOSE...
    Alors j'ai essayé: mon programme effectue une copie temporaire qu'il exécute en rendant ainsi l'exécutable initial accessible en écriture. La copie temporaire sauvegarde toutes les infos voulue dans l'exécutable initial. Parfait.

    Le dernier problème survient si je veux que la copie s'efface toute seule à la fin de son exécution: Si je la créée avec le flag que tu dis, FILE_FLAG_DELETE_ON_CLOSE, alors je ne peux pas fermer le handle du fichier avant de l'exécuter, sinon il s'efface évidement avant l'exécution. Ca ne marche pas non plus si je ferme le handle après l'exécution, car le système refuse de lancer un processus d'exécution sur un fichier en cours d'utilisation...

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Non, je proposait que la copie s'ouvre elle-même avec FILE_FLAG_DELETE_ON_CLOSE.
    Mais ça risque de ne pas marcher. Au pire, la copie peut créer un mini-exécutable qui aura pour fonction d'attendre qu'il se termine et de l'effacer...
    Elle peut même demander à l'original modifié de le faire...

    Oui, c'est tordu...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 376
    Points
    20 376
    Par défaut
    Citation Envoyé par ValyGator
    Je souhaîte écrire un programme qui sauvegarde des données dans son propre fichier exécutable.
    Valy.
    Quel est le but du projet ? C'est pour faire quoi au final ?


    Citation Envoyé par ValyGator
    Je souhaîte écrire un programme qui sauvegarde des données dans son propre fichier exécutable. Pour cela le programme charge une copie de lui-même dans un buffer, Je m'explique peut-être un peu mal, mais ce que je veux c'est un programme qui se modifie lui-même
    C'est possible avec des API Windows sur des variables pas sur du code.
    Mais c'est pas du tout viable....l'adresse mémoire qui pointe sur une variable d'un programme peut changer au cours du temps selon les méchanismes de l'OS

  14. #14
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut Le but
    Citation Envoyé par Mat.M
    Quel est le but du projet ? C'est pour faire quoi au final ?
    C'est pour faire un jeu de lotterie, pour de l'argent. Le programme génère une clef numérique que l'utilisateur m'envoit. Il me fait un paiement électronique (via PayPal) et je lui envoie en échange un fichier de crédit qu'il charge dans le programme. L'utilisateur peut alors jouer les mises qu'il souhaîte, gagner, ou perdre. Bien sûr je veux que ce fichier de crédit ne soit utilisable qu'une seule fois. C'est pour cela que je veux que le programme garde en mémoire que le fichier de crédit (qui contient une clef numérique) a déjà été utilisé. Je veux également que le programme garde en mémoire le solde de l'utilisateur, au cas où il quitterait volontairement ou non le programme et le relancerait. La solution la plus simple est de d'écrire dans un fichier auxiliaire crypté. Mais je ne veux pas que l'utilisateur/cracker s'amuse à faire des copies de ce fichier et le restaurer au cas où il perd ses crédits.

    J'ai en fait résolu mon problème: Le programme crée une copie de lui-même et l'exécute. Lorsque l'utilisateur quitte le programme, la copie modifie l'exécutable original et met à jour les données. La copie avant de se fermer réexécute l'exécutable original. Celui-ci fait un test pour savoir si la copie existe. Si oui, il l'efface et se termine. Si non, cela signifie que c'est le début d'une cession, qu'il faut créer la copie et l'exécuter. Ca marche.

    Merci de vos réponses.

    Valy.

  15. #15
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 376
    Points
    20 376
    Par défaut
    Il ya aussi la possibilité de créer un petit programme qui échange en mémoire des données avec un autre ( intercommunications entre processus..)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/07/2014, 15h45
  2. [JAR] Lire et Ecrire dans un fichier contenu dans un jar
    Par lipao17 dans le forum Général Java
    Réponses: 5
    Dernier message: 02/05/2005, 12h01
  3. Ecrire dans un fichier
    Par gibet_b dans le forum Linux
    Réponses: 5
    Dernier message: 25/04/2005, 20h11
  4. Ecrire dans un fichier grace à un trigger ?
    Par zigoo dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 29/10/2004, 20h03
  5. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo