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

  1. #1
    Nouveau membre du Club
    Ecrire un fichier binaire avec des caractères
    Bonsoir,

    En C on peut faire un prog qui crée un fichier et qui écrit dedans avec la fonction fprintf. Je me demande s'il est possible d'écrire un prog qui crée un fichier .exe, autrement dit de "taper" une chaine de caractères "chaine" telle qu'avec la commande fprintf(fichier, "chaine") on écrirait un fichier .exe.

    Je ne sais pas si je suis clair...

  2. #2
    Nouveau membre du Club
    J'espère être plus clair, je me demande s'il est possible de taper au clavier une chaîne de caractères "bidule" telle que en compilant ce prog :

    int main(int argc, char *argv[])
    {
    FILE *lefichier=NULL;

    lefichier=fopen("lefichierexe.exe", "wb");

    fprintf(lefichier, "bidule");

    fclose(lefichier);

    system("PAUSE");
    return 0;
    }
    on obtiendrait le fichier lefichierexe.exe, qui serait "un vrai" fichier .exe ?

  3. #3
    Expert éminent sénior
    Citation Envoyé par stokastik

    on obtiendrait le fichier lefichierexe.exe, qui serait "un vrai" fichier .exe ?
    Si tu sais quoi y mettre, bien sûr ! Mais dans la phrase précédente, savoir quoi mettre n'est pas généralement une chose facile...

    Jc

  4. #4
    Membre éprouvé
    Citation Envoyé par fearyourself
    Si tu sais quoi y mettre, bien sûr ! Mais dans la phrase précédente, savoir quoi mettre n'est pas généralement une chose facile...

    Jc
    Cela risque quand même d'être difficile avec fprintf() en sachant qu'un ".exe" (sous Windows [1], donc) contiendra au moins un octet à 0 (au moins un '\0')... Mais si tu sais faire, juste avec un `fprintf(lefichier, "bidule");', je veux bien voir

    @stokastik : essaye plutôt avec "fwrite()".



    [1] - ou ReactOS
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  5. #5
    Expert éminent sénior
    Citation Envoyé par David.Schris
    Cela risque quand même d'être difficile avec fprintf() en sachant qu'un ".exe" (sous Windows [1], donc) contiendra au moins un octet à 0 (au moins un '\0')... Mais si tu sais faire, juste avec un `fprintf(lefichier, "bidule");', je veux bien voir

    @stokastik : essaye plutôt avec "fwrite()".



    [1] - ou ReactOS
    Le bourrin en moi dira que c'est possible avec fprintf en faisant un %s et une chaîne de caractères qui sera bien initialisée.

    Par contre, fwrite est plus adapté, je te l'accorde

    Jc

  6. #6
    Membre éprouvé
    Citation Envoyé par fearyourself
    Le bourrin en moi dira que c'est possible avec fprintf en faisant un %s et une chaîne de caractères qui sera bien initialisée.

    Par contre, fwrite est plus adapté, je te l'accorde

    Jc
    Bonjour,

    Je suppose que tu penses à un truc comme ça :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    fprintf(lefichier,"%s","MZblabla\0blibli\0\x90\x90\x90\x90");
    ?? [1]

    Cordialement,
    DS.

    [1] - Je ne dirai rien concernant le fait que ce n'est pas de la forme `fprintf(lefichier, "bidule");'...
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  7. #7
    Expert éminent sénior
    À mon avis, le fprintf() s'arrêtera au premier \0...
    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.

  8. #8
    Expert éminent sénior
    Citation Envoyé par David.Schris
    Bonjour,

    Je suppose que tu penses à un truc comme ça :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    fprintf(lefichier,"%s","MZblabla\0blibli\0\x90\x90\x90\x90");
    ?? [1]

    Cordialement,
    DS.

    [1] - Je ne dirai rien concernant le fait que ce n'est pas de la forme `fprintf(lefichier, "bidule");'...
    Je pensais plutôt une boucle et un fprintf au milieu puisque :
    Citation Envoyé par Médinoc

    À mon avis, le fprintf() s'arrêtera au premier \0...
    Jc

  9. #9
    Membre éprouvé
    Citation Envoyé par fearyourself
    Je pensais plutôt une boucle et un fprintf au milieu puisque :
    Citation Envoyé par Médinoc
    À mon avis, le fprintf() s'arrêtera au premier \0...
    Jc
    Alors nous sommes d'accord
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  10. #10
    Modérateur

    Citation Envoyé par stokastik
    on obtiendrait le fichier lefichierexe.exe, qui serait "un vrai" fichier .exe ?
    Les compilateurs sont la pour ça !!!
    Faire un fichier .exe est particulièrement difficile...
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  11. #11
    Nouveau membre du Club
    Eh bien mon topic a plus de succès que ce que je ne pensais

    Dans ma chaîne "bidule", je ne pourrais pas coller le contenu d'un fichier .exe à quelques modifications près ? C'est bien plus compliqué que ça ?

    (ToTo13, bien sûr on pourrait croire que ça ne sert à rien de créer un fichier .exe que j'ai déjà, mais ce prog permettrait de créer ce fichier chez quelqu'un d'autre)

  12. #12
    Rédacteur

    Citation Envoyé par stokastik

    Dans ma chaîne "bidule", je ne pourrais pas coller le contenu d'un fichier .exe à quelques modifications près ? C'est bien plus compliqué que ça ?
    Faire des "modifications près" directement dans le code machine, ce n'est pas aisée, voir "presque impossible" si tu ne veux pas changer juste une chaine de texte mais des instructions machines.

    Pour s'entrainer avant d'entamer l'assembleur, on avait bosser en codant directement en langage machine, mais il faut le manuel du processeur concernant toutes les intructions (et les équivalences en binaire), au bout de 3 instructions écrites, tu laisses tomber en général...
    Je ne répondrai à aucune question technique en privé

  13. #13
    Membre expérimenté
    Citation Envoyé par stokastik
    ce prog permettrait de créer ce fichier chez quelqu'un d'autre
    Allons bon.

  14. #14
    Membre actif
    Citation Envoyé par stokastik
    (ToTo13, bien sûr on pourrait croire que ça ne sert à rien de créer un fichier .exe que j'ai déjà, mais ce prog permettrait de créer ce fichier chez quelqu'un d'autre)
    Quel intérêt ?
    Au pire, crée un script plutôt, beaucoup plus facile à gérer et à maintenir. Mais quoi qu'il arrive, je ne vois pas bien l'intérêt... tu as une idée précise à nous proposer ?
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  15. #15
    Membre éprouvé
    Citation Envoyé par DaZumba
    Citation Envoyé par stokastik
    ce prog permettrait de créer ce fichier chez quelqu'un d'autre
    Allons bon.
    Ah... Tu penses à la même chose que moi ?
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  16. #16
    Nouveau membre du Club
    Je débute en C, quand je me pose une question j'essaye de comprendre c'est tout. Quand j'ai découvert qu'on pouvait créer un fichier texte en C je me suis demandé si on pouvait faire un .exe voilà. Maintenant la seule chose que je pourrais en faire c'est envoyer ça à un copain pour lui dire "eh regarde ce que j'ai appris à faire".

    millie je crois que tu ne m'as pas bien compris. J'ai essayé de coller le contenu d'un fichier .exe ouvert avec un éditeur de texte et de copier cela dans ma chaîne "bidule", en sorte que le fichier C réécrive le fichier .exe. Je n'ai pas réussi et je me demandais s'il est possible de faire cela.

  17. #17
    Membre actif
    Il est possible d'écrire un fichier dans n'importe quel format. La meilleure preuve en est que ces fichiers ont bien été créés par quelque chose.

    Ton linker, par exemple, crée des fichiers .exe, Word crée des fichiers .doc, etc.
    Après, cela suppose que tu comprennes le format, et que tu l'utilises de manière adéquate. Tu peux recréer un linker, si ça te botte (et si tu as beaucoup, beaucoup de temps devant toi.)
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  18. #18
    Membre éprouvé
    Citation Envoyé par stokastik
    [...] J'ai essayé de coller le contenu d'un fichier .exe ouvert avec un éditeur de texte et de copier cela dans ma chaîne "bidule", en sorte que le fichier C réécrive le fichier .exe. Je n'ai pas réussi et je me demandais s'il est possible de faire cela.
    Pas comme cela (pas en faisant un copier/coller depuis un éditeur de texte).
    Il y a des caractères qui vont "poser problème" et il te faudra les représenter en utilisant une séquence d'échapement. Par exemple, pour un octet égal à 9 tu pourras par exemple avoir "\x09" ou "\t" dans ta chaîne. Dans ce cas on doit "l'encoder" car il s'agit d'une tabulation et tu devras faire la même chose pour les autres caractères non-imprimables et plus généralement ceux dont le code ASCII est strictement inférieur à 32 et, pour être tranquille, ceux dont le code ASCII est strictement supérieur à 127.
    Faire cela à la main peut vite de venir fastidieux, donc tu pourrais...créer un programme qui lit un ".exe" en mode binaire et qui affiche une chaîne de caractères utilisable dans un programme en C en encodant les caractères qui doivent l'être... fopen() pour ouvrir le fichier à convertir, fgetc() pour le lire caractère par caractère, un "if" pour tester le code ASCII du caractère et savoir si il doit être encodé, fputc() pour écrire un caractère non encodé, fprintf() (ou printf()) pour écrire un caractère en hexadécimal, fclose() pour fermer le fichier...et voilà
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  19. #19
    Nouveau membre du Club
    Excellent David.Schris tu m'as compris et tu as répondu impec

###raw>template_hook.ano_emploi###