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

C Discussion :

Fichiers Binaires


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut Fichiers Binaires
    Yop yop à tous,
    J'ai un problème avec ma source, j'essaye de modifier une valeur dans un binaires (ne me suspectez pas ce n'est pas du illegal lol), mais ca ne marche pas, et donc je pense que ma source n'est pas bonne, voilà comment je précède:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #include <stdio.h>
     
    #define OFFSET 1595
     
    int main (void){
     
        FILE *me; 
        char him[32] = "";
        const char *KEY = "74\0";
     
        printf("me source:");
        gets (him);
         if ((me=fopen(him, "rb+"))==NULL){
                printf("\nNot found\n");
                 return -1;                
                 }
          fseek (me, OFFSET, SEEK_SET);
           fwrite (KEY, 1, sizeof (KEY), me);
            fclose (me);
          printf("done");
           system("pause>>null");
       return 0; 
        }
    Merçi d'avance
    Compil your life guy!
    The Aures Project

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Bah c'est quoi qui marche pas.

    Oula il ne faut surtout pas utiliser gets (pas de verification de la taille) il FAUT utiliser fgets

  3. #3
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Citation Envoyé par Skyrunner
    il FAUT utiliser fgets
    Oui oui je sais, et comme c'est juste pour moi, je l'utilise ^_^
    Ce qui ne va pas, ben enfait voilà je vais aller directement au but,
    Je m'amusait avec un p'tit crackme, et la j'essaye de faire le cracker de ce crackme (juste for fun^^), et apparament il ne modifie pas l'offset :/.

    J'ai un 75, que je change par 74, est-ce que normalement mon code est correcte pour cette opération? (je n'ai pas vraiment traîter les fichiers en mode binaire auparavant)

    Merçi
    Compil your life guy!
    The Aures Project

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut Re: Fichiers Binaires
    Citation Envoyé par Goundy
    const char *KEY = "74\0";
    Pourquoi est ce qu'il y a un un \0 a la fin? le \0 est mis automatiquement et la avec ce que tu fais tu met 2 caracteres \ et 0 (il me semble)

    Ensuite tu devrai auparavant te deplacer au debut du fichier pour etre sur que tu es au debut justement.

    Ensuite pour fwrite tu a melange les arguments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    size_t fwrite (const void *ptr, size_t size, size_t nmemb,
           FILE *stream);
    Pour toi ce serai plutot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fwrite (KEY, sizeof (KEY), 1, me);

  5. #5
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Merçi sky mais ca va toujours pas c'est zarb :/

    Sinon, pour le positionnement j'ai mis seek_set dans la fonction fseek, donc pour trouver l'offset il va commencer la recherche du début du fichier

    SEEK_SET emplacement trouvé à partir du début du fichier (il faut depl>=0).
    http://www.lri.fr/~aze/page_c/aide_c/fseek.html

    Pour le \0 je l'ai retiré, mais ca ne marche toujours pas, il y'a quelque chose qui cloche ^^
    Compil your life guy!
    The Aures Project

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut Re: Fichiers Binaires
    Citation Envoyé par Goundy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       const char *KEY = "74\0";
     
     
           fwrite (KEY, 1, sizeof (KEY), me);
    sizeof(KEY) me semble très suspect.

  7. #7
    Membre éclairé
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Par défaut
    en plus de ce qui a été dit, rien n'est correct.
    1) le mode binaire ne sert à rien
    2) tu as ouvert ton fichier en mode lecture + ajout
    -> le mode lecture ne set à rien
    -> le mode ajout écrit tjs à la fin du fichier
    3) comment sont représentés les entiers dans ton fichier ? Si c'est du binaire, ce que as fait c'est écrire les caractères '7' et '4' et '\0', qui sont différents de l'entier 74.
    4) la solution est de tout copier en passant par un fichier temporaire, sauf les caractères que tu veux changer, en prenant soin de convertir 74 en binaire.

  8. #8
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    1)
    2) Lecture + (ecriture), car je me positionne (donc forcément il y a lecture) ensuite j'écris.
    3) je suis bête ^_^, je dois convertir 74 :/
    4) non, je veux le modifier directe
    Compil your life guy!
    The Aures Project

  9. #9
    Membre éclairé
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Par défaut
    bon oubliez ce que j'ai dit, je viens de faire un test et "r+" ça permet d'écrire où l'on veut en effet..., par contre il faut ne faut pas que ce que l'on écrit soit plus gros que ce l'on veut remplacer, sinon ça va écraser la suite.

  10. #10
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    j'ai besoin du mode binaire, car je modifie un offset, je ne veux pas écrire un hello world dans mon fichier !!!
    Compil your life guy!
    The Aures Project

  11. #11
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    capture

    Voilà une capture qui peut mieu vous expliquer mon cas ^_^
    Compil your life guy!
    The Aures Project

  12. #12
    Membre éclairé
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Par défaut
    Citation Envoyé par Goundy
    j'ai besoin du mode binaire, car je modifie un offset, je ne veux pas écrire un hello world dans mon fichier !!!
    man fopen() :
    La chaîne mode peut également inclure la lettre ``b'' comme 3ème carac-
    tere, ou même entre les deux caractères d'une des séquences à 2 lettres
    vues ci-dessus. Ce mode sert uniquement à assurer la compatibilité
    avec ANSI X3.159-1989 (``ANSI C'') et n'a aucun effet. Le ``b'' est
    ignoré sur tous les systèmes compatibles POSIX, y compris Linux.
    tu veux écrire 74 ?
    74 <= 255, ça tient dans un char. -> à l'offset XXX fputc((char)74)

    edit: je viens de voir ta capture, c'est de l'hexadecimal, donc faut convertir en décimal ce que j'ai écris. pis pk tu es sous windows avec ta tete de pingouin?

  13. #13
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Citation Envoyé par ciol2.6.12
    pis pk tu es sous windows avec ta tete de pingouin?
    comment dois-je prendre cette question?!

    ca va toujours pas,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <stdio.h>
     
    #define OFFSET 1595
     
    int main (void){
     
        FILE *crackme; 
        char crackit[32] = "";
        const char KEY =0x74;
     
        printf("Crackme source:");
        gets (crackit);
         if ((crackme=fopen(crackit, "r+"))==NULL){
                printf("\nNot found\n");
                 return -1;                
                 }
          fseek (crackme, OFFSET, SEEK_SET);
           fwrite (&KEY, sizeof (KEY), 1, crackme);
            fclose (crackme);
          printf("cracked");
           system("pause");
       return 0; 
        }
    Compil your life guy!
    The Aures Project

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu es sous Windows, remets donc le b.
    Il n'est ignoré que pour les systèmes qui utilisent le \n seul comme caractère de saut de ligne.

    Les anciens mac utilisaient \r et Windows utilise \r\n, aussi le mode binaire n'est absolument pas inutile.

    PS: Ton 0x74, tu le vois quelque part dans le fichier en sortie?
    Ou bien le fichier n'est pas modifié du tout?
    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.

  15. #15
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    arf oui je n'ai pas enlevé le b, en haut je me suis gouré car j'avais quand même effectué un teste, sinon c'est tout con, je passe à fseek l'offset en hexa hors c'est pas bon, donc je le passe en decimal et ca marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define OFFSET 5525
    Merçi à tous
    Compil your life guy!
    The Aures Project

  16. #16
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Citation Envoyé par Médinoc
    PS: Ton 0x74, tu le vois quelque part dans le fichier en sortie?
    Ou bien le fichier n'est pas modifié du tout?
    ben enfait j'ai 75 que je modifie par 74
    Compil your life guy!
    The Aures Project

  17. #17
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ciol2.6.12
    en plus de ce qui a été dit, rien n'est correct.
    1) le mode binaire ne sert à rien
    Pour être portable, si.

  18. #18
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Goundy
    capture

    Voilà une capture qui peut mieu vous expliquer mon cas ^_^
    Ben oui, Tu veux modifier un byte valant 0x75 en 0x74. Rien à voir avec la chaine "75"!
    fopen() avec "r+"
    fseek(kivabien);
    fputc();
    fclose();
    fin de l'histoire.

    Bon, je vais quand même vérifier...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    #include <stdio.h>
     
    static void create_file (char const *fname, long n, int val)
    {
       FILE *fp = fopen(fname, "wb");
       if (fp != NULL)
       {
          long i;
          for (i = 0; i < n; i++)
          {
             fputc(val, fp);
          }
          fclose (fp), fp = NULL;
       }
       else
       {
          perror (fname);
       }
    }
     
    static void dump_file (char const *fname)
    {
       FILE *fp = fopen(fname, "rb");
       if (fp != NULL)
       {
          int c;
     
          /* ultra simpliste... */
          while ((c = fgetc(fp)) != EOF)
          {
             printf("%02X ", (unsigned)c);
          }
          printf ("\n");
          fclose (fp), fp = NULL;
     
       }
       else
       {
          perror (fname);
       }
    }
     
    static void modif_file (char const *fname, long ofs, int val)
    {
       FILE *fp = fopen(fname, "rb+");
       if (fp != NULL)
       {
          fseek(fp, ofs, SEEK_SET);
          if (!ferror(fp))
          {
             fputc(val, fp);
          }
          fclose (fp), fp = NULL;
     
       }
       else
       {
          perror (fname);
       }
    }
     
    int main (void)
    {
    #define fname "data.bin"
       create_file(fname, 10, 0xAA);
       dump_file(fname);
     
       modif_file (fname, 4, 0x55);
       dump_file(fname);
     
       return 0;
    }
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA 55 AA AA AA AA AA
    Ce qui me parait correct...

  19. #19
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ciol2.6.12
    Citation Envoyé par Goundy
    j'ai besoin du mode binaire, car je modifie un offset, je ne veux pas écrire un hello world dans mon fichier !!!
    man fopen() :
    De quoi ? de GNU/Linux ? Le résultat n'est donc pas neutre...
    La chaîne mode peut également inclure la lettre ``b'' comme 3ème carac-
    tere, ou même entre les deux caractères d'une des séquences à 2 lettres
    vues ci-dessus. Ce mode sert uniquement à assurer la compatibilité
    avec ANSI X3.159-1989 (``ANSI C'') et n'a aucun effet. Le ``b'' est
    ignoré sur tous les systèmes compatibles POSIX, y compris Linux.
    GNU/Linux et ses frères ne sont que des systèmes parmi d'autres... Je préfère rester portable, donc indépendant du système...

    La norme dit :
    Citation Envoyé par n1124
    7.19.5.3 The fopen function
    Synopsis
    1 #include <stdio.h>
    FILE *fopen(const char * restrict filename,
    const char * restrict mode);
    Description
    2 The fopen function opens the file whose name is the string pointed to by filename,
    and associates a stream with it.
    3 The argument mode points to a string. If the string is one of the following, the file is
    open in the indicated mode. Otherwise, the behavior is undefined.231)
    r open text file for reading
    w truncate to zero length or create text file for writing
    a append; open or create text file for writing at end-of-file
    rb open binary file for reading
    wb truncate to zero length or create binary file for writing
    ab append; open or create binary file for writing at end-of-file
    r+ open text file for update (reading and writing)
    w+ truncate to zero length or create text file for update
    a+ append; open or create text file for update, writing at end-of-file
    231) If the string begins with one of the above sequences, the implementation might choose to ignore the
    remaining characters, or it might use them to select different kinds of a file (some of which might not
    conform to the properties in 7.19.2).
    r+b or rb+ open binary file for update (reading and writing)
    w+b or wb+ truncate to zero length or create binary file for update
    a+b or ab+ append; open or create binary file for update, writing at end-of-file
    4 Opening a file with read mode ('r' as the first character in the mode argument) fails if
    the file does not exist or cannot be read.
    5 Opening a file with append mode ('a' as the first character in the mode argument)
    causes all subsequent writes to the file to be forced to the then current end-of-file,
    regardless of intervening calls to the fseek function. In some implementations, opening
    a binary file with append mode ('b' as the second or third character in the above list of
    mode argument values) may initially position the file position indicator for the stream
    beyond the last data written, because of null character padding.
    6 When a file is opened with update mode ('+' as the second or third character in the
    above list of mode argument values), both input and output may be performed on the
    associated stream. However, output shall not be directly followed by input without an
    intervening call to the fflush function or to a file positioning function (fseek,
    fsetpos, or rewind), and input shall not be directly followed by output without an
    intervening call to a file positioning function, unless the input operation encounters endof-
    file. Opening (or creating) a text file with update mode may instead open (or create) a
    binary stream in some implementations.
    7 When opened, a stream is fully buffered if and only if it can be determined not to refer to
    an interactive device. The error and end-of-file indicators for the stream are cleared.
    Returns
    8 The fopen function returns a pointer to the object controlling the stream. If the open
    operation fails, fopen returns a null pointer.
    Le reste...

  20. #20
    Membre éclairé
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Par défaut
    si la norme le dit... désolé.

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

Discussions similaires

  1. Afficher un fichier binaire sous Windows
    Par Atomikx dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 14/12/2004, 00h29
  2. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30
  3. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20
  4. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19
  5. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39

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