Partage
  • Partager sur Facebook
  • Partager sur Twitter

Scripte de decodage

c'est pas moi qui l'ai pondu

Sujet résolu
    9 août 2006 à 15:53:58

    Salut

    Bon voila je vien de dl un scripte a compiler mais quand je le compile j'ai des erreurs que je ne comprend pas ...

    merci d'avance pour votre aide

    /*
    Freelancer .FL Savegame encode/decoder

    Credits to Sherlog <sherlog@t-online.de> for finding out the algorithm

    (c) 2003 by Jor <flcodec@jors.net>

    This is free software. Permission to copy, store and use granted as long
    as this copyright note remains intact.

    Compilation in a POSIX environment:

       cc -O -o flcodec flcodec.c

    Or in Wintendo 32 (get the free lcc compiler):

       lcc -O flcodec.c
       lcclnk -o flcodec.exe flcodec.obj

    */


    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    #include <stdio.h>

    void usage(const char *prog)
    {
        fprintf(stderr, "usage: %s -d infile.fl outfile.txt\n", prog);
        fprintf(stderr, "  to decode a .fl savegame file into the named text file\n");
        fprintf(stderr, "or: %s -e infile.txt outfile.fl\n", prog);
        fprintf(stderr, "  to encode a text file back into a .fl savegame file.\n");
    }

    /* Very Secret Key - this is Microsoft Security In Action[tm] */
    const char gene[] = "Gene";

    void decode(const char *ifile, const char *ofile)
    {
        int ifd, ofd, i, l, len, rc;
        char *mem, *buff, c, k, r;

        ifd = open(ifile,O_RDONLY);

        if (ifd == -1)
        {
            fprintf(stderr, "Error: open(%s) failed: %s\n", ifile, strerror(errno));
            exit(1);
        }

        len = lseek(ifd, 0, SEEK_END);
        lseek(ifd, 0, SEEK_SET);

        mem = malloc(len + 1);
        if (mem == NULL)
        {
            fprintf(stderr, "Error: malloc(%d) failed: %s\n", len + 1, strerror(errno));
            exit(1);
        }

        rc = read(ifd, mem, len);
        if (rc != len)
        {
            fprintf(stderr, "Error: read() failed: %s\n", strerror(errno));
            exit(1);
        }

        close(ifd);

        if (strncmp(mem, "FLS1", 4) != 0)
        {
            fprintf(stderr, "Error: file %s is not a FLS1 file.\n", ifile);
            exit(1);
        }

        ofd = open(ofile, O_CREAT | O_TRUNC | O_WRONLY, 0640);
        if (ofd == -1)
        {
            fprintf(stderr, "Error: open(%s) failed: %s\n", ofile, strerror(errno));
            exit(1);
        }

        /* skip FLS1 */
        buff = mem + 4;
        l = len - 4;

        i = 0;
        while (i < l)
        {

            c = buff[i];
            k = (gene[i % 4] + i) % 256;

            r = c ^ (k | 0x80);

            rc = write(ofd, &r, 1);
            if (rc != 1)
            {
                fprintf(stderr, "Error: write() failed: %s\n", strerror(errno));
                exit(1);
            }

            i++;
        }
        close(ofd);
    }

    void encode(const char *ifile, const char *ofile)
    {
        int ifd, ofd, i, l, len, rc;
        char *mem, *buff, c, k, r;

        ifd = open(ifile,O_RDONLY);

        if (ifd == -1)
        {
            fprintf(stderr, "Error: open(%s) failed: %s\n", ifile, strerror(errno));
            exit(1);
        }

        len = lseek(ifd, 0, SEEK_END);
        lseek(ifd, 0, SEEK_SET);

        mem = malloc(len + 1);
        if (mem == NULL)
        {
            fprintf(stderr, "Error: malloc(%d) failed: %s\n", len + 1, strerror(errno));
            exit(1);
        }

        rc = read(ifd, mem, len);
        if (rc != len)
        {
            fprintf(stderr, "Error: read() failed: %s\n", strerror(errno));
            exit(1);
        }

        close(ifd);

        ofd = open(ofile, O_CREAT | O_TRUNC | O_WRONLY, 0640);
        if (ofd == -1)
        {
            fprintf(stderr, "Error: open(%s) failed: %s\n", ofile, strerror(errno));
            exit(1);
        }

        buff = mem;
        l = len;

        /* write magic token */
        rc = write(ofd, "FLS1", 4);
        if (rc != 4)
        {
            fprintf(stderr, "Error: write() failed: %s\n", strerror(errno));
            exit(1);
        }

        i = 0;
        while (i < l)
        {

            c = buff[i];
            k = (gene[i % 4] + i) % 256;

            r = c ^ (k | 0x80);

            rc = write(ofd, &r, 1);
            if (rc != 1)
            {
                fprintf(stderr, "Error: write() failed: %s\n", strerror(errno));
                exit(1);
            }

            i++;
        }
        close(ofd);
    }

    int main (int argc, char *argv[])
    {
        char *p;

        if (argc != 4)
        {
            fprintf(stderr, "Error: wrong number of arguments.\n");
            usage(argv[0]);
            exit(1);
        }

        p = argv[1];

        if (*p != '-')
        {
            fprintf(stderr, "Error: invalid argument %s.\n", argv[1]);
            usage(argv[0]);
            exit(1);
        }
        p++;
        switch (*p)
        {
            case 'd':
            decode(argv[2], argv[3]);
            break;
            case 'e':
            encode(argv[2], argv[3]);
            break;
            default:
            fprintf(stderr, "Error: invalid argument %s.\n", argv[1]);
            usage(argv[0]);
            exit(1);
            break;
        }

        exit(0);
    }


    et voila le erreurs de compilation que j'obtien

    F:\Documents and Settings\Administrateur\Bureau\Freelancer\Nouveau Document texte.c: In function `void decode(const char*, const char*)':
    F:\Documents and Settings\Administrateur\Bureau\Freelancer\Nouveau Document texte.c:58: error: invalid conversion from `void*' to `char*'
    F:\Documents and Settings\Administrateur\Bureau\Freelancer\Nouveau Document texte.c: In function `void encode(const char*, const char*)':
    F:\Documents and Settings\Administrateur\Bureau\Freelancer\Nouveau Document texte.c:128: error: invalid conversion from `void*' to `char*'
    Process terminated with status 1 (0 minutes, 0 seconds)
    2 errors, 0 warnings



    je compile avec C::B et je suis sous windows pour ceux que ca aide :D


    Bon merci a tt ceux qui voudront bien pencher sur le probleme
    • Partager sur Facebook
    • Partager sur Twitter
      9 août 2006 à 16:11:55

      Il manque le cast.
      Remplace
      mem = malloc(len + 1);

      par
      mem = (char *)malloc(len + 1);

      aux lignes 58 et 128.
      • Partager sur Facebook
      • Partager sur Twitter
        9 août 2006 à 16:33:45

        Je pense que tu as du compilé en C++ non ?

        En C, le cast avec un malloc n'est pas utile, la conversion void* -> char* se fera implicitement, en C++, il faut employer un cast, mais en C++ il y a new
        • Partager sur Facebook
        • Partager sur Twitter
          9 août 2006 à 20:20:53

          comme ca fait deux fois qu'on me dis que le scripte est sans erreur je me suis poser des question j'ai copier le code source dans un nouveau projet en c sour C::B et la ca as marcher donc je suis desoler de vous avoir fait cherche pour un truc aussi stupide enfin

          merci encors a vous 2

          Bon soir tlm

          p.s. Desoler pour les inversion delettre dans ce message mais j'ai perdu l'habitude de tapper sur un clavier ...


          [EDIT]
          *
          je vien de tester le scrpte j'arrive a le compiler a decoder mon fichier mais pas moyen de le r'encoder il me met erreru eu niveau du read
          Error: read() failed: No error

          [EDIT2]
          *
          ce probleme n'apparait que avec des fichier issu du jeu freelancer (le scripte sert a decoder les fichiers de sauvegarde) donc le probleme ne vien pas ud scripte mais de mon PC donc merci a tous pour votre aide

          p.S. si quelqu'un as une idée pour debloquer le fichier (que je puisse le convertir) qu'l n'hesite pas a me la faire parvenire mais comme mon probleme est resolu au point de vue codage je le cloture


          Bonne nuit a tous et encor merci
          • Partager sur Facebook
          • Partager sur Twitter

          Scripte de decodage

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown