Annonce

Réduire
Aucune annonce.

Mon générateur de dictionnaires en C

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Mon générateur de dictionnaires en C

    Bonsoir,

    En plaçant en ligne le code source de mon générateur de dictionnaires ( servant en particulier pour le crack de clefs WPA ) en ligne sur le forum ( ) j'ai promis de convertir ce code en C afin de permettre une génération plus rapide.

    C'est chose faîtes.

    Ce code en C n'a pas toute les fonctionnalités du code python (manque de temps de ma part) je suis toutefois à l'écoute de toute amélioration et bug.

    iSanzo est un ami à moi qui a codé le logo de notre Dev Team.

    Ce code permet sur un intel dualcore de générer un fichier de environ 1Go en une minute.
    Prenez donc garde de ne pas laisser générer pendant une heure ou alors prévoyez un espace suffisant :-).

    Ceci dit voici le code:

    Code:
    /*
        Auteurs:iSanzo
                   Anonyme77
    
        Date: 19/11/2012
    
        Version: 1.2
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define TRUE 1
    #define FALSE 0
    
    #define MMAX 3
    
    #define FICHIER 51
    #define CLEFS 51
    #define MAXIMUM 50
    
    /*<=== Prototypes ===>*/
    void chiffres();
    void aleatoire();
    void mots();
    void file(char *fich);
    void bornes(int *min,int *max);
    void bornes_max(int *min,int *max,int maximum);
    void logo();
    
    /*<=== Main ===>*/
    int main()
    {
        /*Declarations*/
        char reco;
        int menu;
    
        /*Initialisation*/
        reco='o';
            do
            {
                /*Menu*/
                logo();
                menu=0;
                printf("\n\n\t\tGenerateur de dictionnaire\n");
                printf("\t\t--------------------------\n\n");
                printf("\t1.Generer des chiffres\n");
                printf("\t2.Generer des clefs aleatoires\n");
                printf("\t3.Generer des mots aleatoires\n");
                do
                {
                    printf("\n\tVotre choix: ");fflush(stdin);scanf("%d",&menu);
                }while(menu<1||menu>MMAX);
    
                /*Gestion des cas*/
                switch (menu)
                {
                    case 1:
                        chiffres();
                        break;
                    case 2:
                        aleatoire();
                        break;
                    case 3:
                        mots();
                        break;
                }
    
                /*Gestion de la répétition du programme*/
                do
                {
                    printf("\tRecommencer (o-n) ?");fflush(stdin);scanf("%c",&reco);
                }while(reco!='n' && reco!='o');
                printf("\n");
            }while(reco=='o');
    
        return 0;
    }
    
    /* <=== Fonctions ===>*/
    void bornes(int *min,int *max)
    {
        printf("Borne inférieure: ");fflush(stdin); scanf("%d",min);
        do
        {
            printf("Borne superieure: ");fflush(stdin); scanf("%d",max);
        }while(*max<*min);
    }
    void bornes_max(int *min,int *max, int maximum)
    {
        do
        {
            printf("Borne inférieure: ");fflush(stdin); scanf("%d",min);
            printf("Borne superieure: ");fflush(stdin); scanf("%d",max);
        }while(*max<*min||*max>maximum||*min>maximum);
    }
    void file(char fich[])
    {
        printf("Entrez le nom de votre fichier: "); fflush(stdin); scanf("%s",fich);
    }
    void mots()
    {
        /*Declarations*/
        FILE* fichier=NULL;
        char min[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        char maj[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        char result[CLEFS];
        char nom[FICHIER];
        int longu,maxi,longueur,choix,i,lettre,minmaj,mini;
    
        /*Preparation de l'aleatoire*/
        srand(time(NULL));
    
        /*Saisie d'informations*/
        printf("\n\tQuel taille de clef souhaitez-vous ?");
        printf("\n\t\t1.Aleatoire");
        printf("\n\t\t2.fixe");
        do
        {
            printf("\n\tVotre choix: ");fflush(stdin);scanf("%d",&longu);
        }while(longu<1||longu>2);
        if(longu==1)
        {
            do
            {
                printf("\n\tBorne superieure (MAX 50): ");fflush(stdin);scanf("%d",&maxi);
                printf("\n\tBorne inférieure (MIN 1): ");fflush(stdin);scanf("%d",&mini);
            }while(maxi>50||maxi<mini||mini<1);
        }
        else
        {
            do
            {
                printf("\n\tLongueur (MAX 50): ");fflush(stdin);scanf("%d",&longueur);
            }while(longueur>50||longueur<1);
        }
    
        printf("\n\tQuel type de lettre souhaitez-vous ?");
        printf("\n\t\t1.Aleatoire");
        printf("\n\t\t2.Majuscule");
        printf("\n\t\t3.Minuscules");
        do
        {
            printf("\n\tVotre choix: ");fflush(stdin);scanf("%d",&choix);
        }while(choix<1||choix>3);
    
        /*Fichier*/
        file(nom);
        fichier=fopen(nom,"w");
        if(fichier!=NULL)
        {
            /*Message de prevention*/
            printf("\n\tOperation en cours...");
            printf("\n\tCTRL+C pour stopper ...");
            /*Boucle principale*/
            if(longu==1)
            {
                switch(choix)
                {
                    case 1:
                        while(TRUE)
                        {
                            longueur = (rand() % (maxi - mini + 1)) + mini;
                            for(i=0;i<=longueur-1;i++)
                            {
                                lettre=rand()%26;
                                minmaj=rand()%2;
                                if(minmaj==0)result[i]=maj[lettre];
                                else result[i]=min[lettre];
                            }
                            result[i]='\0';
                            fprintf(fichier,"%s\n",result);
                        }
                        break;
                    case 2:
                        while(TRUE)
                        {
                            longueur = (rand() % (maxi - mini + 1)) + mini;
                            for(i=0;i<=longueur-1;i++)
                            {
                                lettre=rand()%26;
                                result[i]=maj[lettre];
                            }
                            result[i]='\0';
                            fprintf(fichier,"%s\n",result);
                        }
                        break;
                    case 3:
                        while(TRUE)
                        {
                            longueur = (rand() % (maxi - mini + 1)) + mini;
                            for(i=0;i<=longueur-1;i++)
                            {
                                lettre=rand()%26;
                                result[i]=min[lettre];
                            }
                            result[i]='\0';
                            fprintf(fichier,"%s\n",result);
                        }
                        break;
                }
    
            }
            else
            {
                switch(choix)
                {
                    case 1:
                        while(TRUE)
                        {
                            for(i=0;i<=longueur-1;i++)
                            {
                                lettre=rand()%26;
                                minmaj=rand()%2;
                                if(minmaj==0)result[i]=maj[lettre];
                                else result[i]=min[lettre];
                            }
                            result[i]='\0';
                            fprintf(fichier,"%s\n",result);
                        }
                        break;
    
                    case 2:
                        while(TRUE)
                        {
                            for(i=0;i<=longueur-1;i++)
                            {
                                lettre=rand()%26;
                                result[i]=maj[lettre];
                            }
                            result[i]='\0';
                            fprintf(fichier,"%s\n",result);
                        }
                        break;
    
                    case 3:
                        while(TRUE)
                        {
                            for(i=0;i<=longueur-1;i++)
                            {
                                lettre=rand()%26;
                                result[i]=min[lettre];
    
                            }
                            result[i]='\0';
                            fprintf(fichier,"%s\n",result);
                        }
                        break;
                }
    
            }
    
        }
    }
    void aleatoire()
    {
        /*Declarations*/
        FILE* fichier=NULL;
        char min[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        char maj[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        char result[CLEFS];
        char nom[FICHIER];
        int longueur,i,typ,typ2,lettre,chiffre,longu,maxi,choix,mini;
    
        /*Preparation de l'aleatoire*/
        srand(time(NULL));
    
        /*Saisie d'informations*/
        printf("\n\tQuel taille de clef souhaitez-vous ?");
        printf("\n\t\t1.Aleatoire");
        printf("\n\t\t2.fixe");
        do
        {
            printf("\n\tVotre choix: ");fflush(stdin);scanf("%d",&longu);
        }while(longu<1||longu>2);
        if(longu==1)
        {
            do
            {
                printf("\n\tBorne superieure (MAX 50): ");fflush(stdin);scanf("%d",&maxi);
                printf("\n\tBorne inférieure (MIN 1): ");fflush(stdin);scanf("%d",&mini);
            }while(maxi>50||maxi<mini||mini<1);
        }
        else
        {
            do
            {
                printf("\n\tLongueur (MAX 50): ");fflush(stdin);scanf("%d",&longueur);
            }while(longueur>50||longueur<1);
        }
    
        printf("\n\tQuel type de lettre souhaitez-vous ?");
        printf("\n\t\t1.Aleatoire");
        printf("\n\t\t2.Majuscule");
        printf("\n\t\t3.Minuscules");
        do
        {
            printf("\n\tVotre choix: ");fflush(stdin);scanf("%d",&choix);
        }while(choix<1||choix>3);
        if(choix==2)typ2=1;
        if(choix==3)typ2=0;
    
        /*Fichier*/
        file(nom);
        fichier=fopen(nom,"w");
        if(fichier!=NULL)
        {
            /*Message de prevention*/
            printf("\n\tOperation en cours...");
            printf("\n\tCTRL+C pour stopper ...");
            /*Boucle principale*/
            if(choix==1)
            {
                while(TRUE)
                {
                    if(longu==1) longueur = (rand() % (maxi - mini + 1)) + mini;
                    for(i=0;i<=longueur-1;i++)
                    {
                        typ=rand()%2;
                        if(typ==0)
                        {
                            typ2=rand()%2;
                            lettre=rand()%26;
                            if(typ2==0)result[i]=min[lettre];
                            else result[i]=maj[lettre];
                        }
                        else
                        {
                            chiffre=rand()%10;
                            result[i] = chiffre+48;
                        }
                    }
                    result[i]='\0';
                    fprintf(fichier,"%s\n",result);
                }
    
            }
            else
            {
                if(typ2==0)
                {
                    while(TRUE)
                    {
                        if(longu==1) longueur = (rand() % (maxi - mini + 1)) + mini;
                        for(i=0;i<=longueur-1;i++)
                        {
                            typ=rand()%2;
                            if(typ==0)
                            {
                                lettre=rand()%26;
                                result[i]=min[lettre];
                            }
                            else
                            {
                                chiffre=rand()%10;
                                result[i] = chiffre+48;
                            }
                        }
                        result[i]='\0';
                        fprintf(fichier,"%s\n",result);
    
                    }
                }
                else
                {
                    while(TRUE)
                    {
                        if(longu==1) longueur = (rand() % (maxi - mini + 1)) + mini;
                        for(i=0;i<=longueur-1;i++)
                        {
                            typ=rand()%2;
                            if(typ==0)
                            {
                                lettre=rand()%26;
                                result[i]=maj[lettre];
                            }
                            else
                            {
                                chiffre=rand()%10;
                                result[i] = chiffre+48;
                            }
                        }
                        result[i]='\0';
                        fprintf(fichier,"%s\n",result);
                    }
                }
            }
            fclose(fichier);
        }
        else printf("\n\tErreur sur le nom de fichier");
    }
    void chiffres()
    {
        /*Initialisations*/
        FILE* fichier=NULL;
        int choix1;
        long int sup,inf;
        double i;
        char nom[FICHIER];
    
        /*Recolte d'informations*/
        printf("\n\n\tSouhaitez- vous une generation: \n");
        printf("\t1. Illimitee \n");
        printf("\t2. Limitee \n\n");
        do
        {
            printf("\n\tVotre choix: ");scanf("%d",&choix1);
        }while(choix1<1 || choix1>2);
    
        if(choix1==2)
        {
            printf("\n\n\tEntrez la borne inferieure: "); scanf("%ld",&inf);
            printf("\n\n\tEntrez la borne superieure: "); scanf("%ld",&sup);
        }
        else
        {
            printf("\n\n\tEntrez la borne inferieure: "); scanf("%ld",&inf);
        }
    
        /*Creation du fichier*/
        file(nom);
        fichier=fopen(nom,"w");
        if(fichier==NULL)printf("\nErreur lors de la creation du fichier...");
        else
        {
            printf("\n\tFichier cree avec succes...\n");
            printf("\n\n\tGeneration en cours...");
            printf("\n\tPour stopper faites la combinaison CTRL+C\n");
            /*Generation*/
            if(choix1==1)
            {
                for(i=inf;TRUE;i++)fprintf(fichier,"%.0lf\n",i);
            }
            else
            {
                for(i=inf;i<=sup;i++)fprintf(fichier,"%.0lf\n",i);
            }
    
            /*Fermeture du fichier*/
            fclose(fichier);
        }
    }
    void logo()
    {
        printf("\t   @@@  @@@@@@@   @@@@@@@@  @@@  @@@       @@@   @@@  @@@ \n");
        printf("\t   @@@  @@@@@@@@  @@@@@@@@  @@@  @@@      @@@@   @@@  @@@ \n");
        printf("\t        @@!  @@@  @@!       @@!  @@@     @@[email protected]!   @@!  @@@ \n");
        printf("\t   [email protected]!  [email protected]!  @[email protected]  [email protected]!       [email protected]!  @[email protected]    [email protected][email protected]!   [email protected]!  @[email protected] \n");
        printf("\t   [email protected]  @[email protected]  [email protected]!  @!!!:!    @[email protected]  [email protected]!   @!! @!!   @[email protected]  [email protected]! \n");
        printf("\t   !!!  [email protected]!  !!!  !!!!!:    [email protected]!  !!!  !!!  [email protected]!   [email protected]!  !!! \n");
        printf("\t   !!:  !!:  !!!  !!:       :!:  !!:  :!!:!:!!:  !!:  !!! \n");
        printf("\t   :!:  :!:  !:!  :!:        ::!!:!   !:::!!:::  :!:  !:! \n");
        printf("\t    ::   :::: ::   :: ::::    ::::         :::   ::::: :: \n");
        printf("\t   :    :: :  :   : :: ::      :           :::    : :  :  \n");
        printf("\t   _____________________________________________________\n");
    }
    Vous remarquerez peut-être que j'ai multiplié le nombre de boucle de génération.
    J'ai fais cela pour diminuer au maximum le nombre de conditions effectuées dans la boucle de génération et donc d'optimiser le programme.

    Voilà j'espère que ce code vous aidera :-p.

    Je vais de ce pas le proposer dans le sujet concernant le crack de clés WPA.

    Bonne soirée à vous.

  • #2
    Salut et bravo pour tes travaux

    Je suis actuellement entrain de créer le mien en C aussi ( c'est surtout pour me faire la main sur le C étant donné que je débute )
    Faudrait qu'on test qui de nous est le plus performant Mon code est encore en travaux, je n'ai fait pour l'instant que deux mode hexa en Majuscules et hexa en Minuscules

    Bon courage a++
    Qui est le maître, le peintre ou le faussaire... ?

    ㅡ La solidité d'une chaine est égale à la solidité de son maillon le plus faible ㅡ

    Commentaire


    • #3
      Bonsoir,

      Je serais honoré de voir otn code également lorsque tu l'auras terminé si tu l'acceptes bien entendu.

      Pour ma part au niveau de la performance, j'ai vraiment fais mon maximum.
      J'ai multiplié les boucles de génération afin de réduires les conditions dans celles-ci au strict minimum et augmenter la performance et de cette manière j'arrive à générer 2Go/min sur un bon Intel I7 avec 6Go de ram donc pas mal je pense.

      Si tu as une question sur le C ou que tu es bloqué dans ton code n'hésite pas à m'envoyer un MP.

      Bien à toi.

      Laurent

      Commentaire


      • #4
        No problèm Je t'ai envoyé mon code par MP (Je le posterai dans un topic plus tard quand j’estimerai avoir une version 1.0)
        Sinon moi niveau perf je ne sait pas exactement... J'ai créer un dico de 1 milliards de clef de type hexa majuscule, clef de taille de 8 caractères en moins de 8 min(je peut pas être plus précis )
        Le fichier dico faisait en sortie 9,31 Go(De mémoire, vu que je l'ai effacer)

        Mon CPU est un intel core i7 - 2670QM, 2.2 GHz et j'ai 4GB de RAM

        PS: j'avais plusieurs applications de lancées en même temps, donc en gros je sait pas vraiment quelles sont les perf' de mon prog
        (Sorry j'ai zapper de mettre des balises code dans le MP donc pour l'indentation..... )
        Dernière modification par Yodark, 09 décembre 2012, 00h01.
        Qui est le maître, le peintre ou le faussaire... ?

        ㅡ La solidité d'une chaine est égale à la solidité de son maillon le plus faible ㅡ

        Commentaire


        • #5
          En combien de temps as tu généré ton dico la est la question.
          As tu enlevé les inévitables doublons ?

          J'ai bien reçu ton code. En effet, saurais tu me le renvoyer avec l'indentation ? Il sera bien plus lisible pour moi :-)

          Bien à toi

          Commentaire


          • #6
            Bon voila j'ai posté le mien Je n'ai pas encore enlevé les doublons, et toi ?
            Pour répondre à ta question sur la perf' je viens de faire un test sur un wordlist de type hexa majuscule, taille de clef 8 à 64 caractère
            et j'en suis à 1,37Go/minute après ça dépend du pc et des applications ouvertes en même temps...
            Dernière modification par Yodark, 15 décembre 2012, 20h28.
            Qui est le maître, le peintre ou le faussaire... ?

            ㅡ La solidité d'une chaine est égale à la solidité de son maillon le plus faible ㅡ

            Commentaire


            • #7
              Bon du nouveau, après optimisation j'en suis à 1,61Go/minute je vais essayé d'optimiser encore !
              Sinon là je m'attaque au doublons.

              [EDIT]

              Nouveau record 9,31 Go en 5 minutes 30 exactement soit ~1,69Go et des berrwouettes/minute si je ne me suis pas trompé

              pour les doublons je suis sur une piste, je poursuis...
              Dernière modification par Yodark, 19 décembre 2012, 09h07.
              Qui est le maître, le peintre ou le faussaire... ?

              ㅡ La solidité d'une chaine est égale à la solidité de son maillon le plus faible ㅡ

              Commentaire


              • #8
                Pour les doublons tu peux utiliser les commandes sort et uniq sur Linux.

                Personnellement c'est ce que je fais :-).

                Commentaire


                • #9
                  Bah je pensais plutôt utiliser les listes chaînées..
                  Qui est le maître, le peintre ou le faussaire... ?

                  ㅡ La solidité d'une chaine est égale à la solidité de son maillon le plus faible ㅡ

                  Commentaire


                  • #10
                    Salut, sous quelle extension est le dictionnaire une fois généré ?
                    Merci

                    Commentaire


                    • #11
                      Salut, sous quelle extension est le dictionnaire une fois généré ?
                      Merci
                      Bah visiblement aucune, ce sera un fichier. Mais tu peux en mettre une : txt, lst ..
                      Qui est le maître, le peintre ou le faussaire... ?

                      ㅡ La solidité d'une chaine est égale à la solidité de son maillon le plus faible ㅡ

                      Commentaire


                      • #12
                        Bonjour,

                        Peux-tu détailler les fonctions que fait ton programme?

                        J'ai lu en diagonale ton code, mais je te conseille de lire cet écrit... limite je saute au plafond (c'est pas beau à voir )

                        Limite en faisant simple on peut générer une ligne simple

                        Code:
                        #include <stdio.h>
                        #include <stdlib.h>
                        #include <string.h>
                        #include <time.h>
                        
                        char *generate(int n);
                        FILE *open(const char *name, const char *mode);
                        void write(FILE *f, int value, int n);
                        
                        int main(void)
                        {
                            FILE *fic = open("example.txt", "w");
                            write(fic, 1, 8);
                            return 0;
                        }
                        
                        char *generate(int n)
                        {
                            int i;
                            char *res;
                            int line, column;
                        
                            const char mini[3][50] = {
                                                      "abcdefghijklmnopqrstuvwxyz",
                                                      "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
                                                      "1234567890"
                                                  };
                            res = malloc(2 + (sizeof(char) * n));
                            if (res == NULL)
                                exit(-1);
                        
                            for (i=0; i<n; i++)
                            {
                                line = rand() % 3;
                                column = rand() % strlen(mini[line]);
                                res[i] = mini[line][column];
                            }
                        
                            res[n] = '\0';
                        
                            return res;
                        }
                        
                        void write(FILE *f, int value, int n)
                        {
                            int i;
                        
                            char *result = NULL;
                        
                            srand(time(NULL));
                        
                            for (i=0; i<value; i++)
                            {
                                result = generate(n);
                                fwrite(result, sizeof(char), n, f);
                                fwrite("\n", sizeof(char), 1, f);
                                free(result);
                            }
                        
                            fclose(f);
                        }
                        
                        FILE *open(const char *name, const char *mode)
                        {
                            FILE *f = fopen(name, mode);
                            if (f == NULL)
                            {
                                perror("");
                                exit(-1);
                            }
                            return f;
                        }
                        J'écris 1 Go en moins d'une minute avec un pauvre core i3-330M en utilisant un algorithme naïf.
                        Dernière modification par SAKAROV, 30 mai 2013, 11h18.

                        Commentaire


                        • #13
                          Juste avant ton Edit, je me disait : "mais pourquoi fait-il un code si LONG pour CA ?!".

                          Puis j'ai vu ton Edit qui résumait ma pensée^^
                          sigpic

                          Cyprium Download Link

                          Plus j'étudie plus j'me rends compte que je n'sais rien.

                          †|

                          Commentaire


                          • #14
                            Bonjour et bonne année, en passant sur le forum à la recherche d'une wordlist je suis tombé sur ce sujet pouvez-vous s'il vous plaît m'expliquer le principe de ce script. Si je comprends il s'agit d'un script qui génère des mots sans avoir de wordlist de 30Go ?!

                            Commentaire


                            • #15
                              Mon générateur de dictionnaires en C

                              Cela fait bien longtemps que je n'y ai pas retouché mais en effet, le but est de générer des mots pouvant servir dans une attaque par brute force.
                              Le code est certainement très mal écrit et j'en suis bien désolé. J'avais avant tout pensé à la performance.
                              Au niveau des options, je dois bien avouer ne plus m'en souvenir. Je pense avoir présenté ça sous forme de menu posant les questions adéquates (mais sûrement mal formulées).
                              Au niveau du fichier de sortie, si vous souhaitez une extension, il faudra la donner dans le nom du fichier.
                              Je termine par une question. Pensez vous que générer 10 ou 100 enregistrements avant l'écriture dans le fichier augmenterait les performances ? Le programme ne passerait il pas moins de temps en attente d'entrée/sortie ?

                              Commentaire

                              Chargement...
                              X