Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un problème de boucle de fgets!!

    23 juin 2020 à 15:21:18

    Bien le bonjour!

    Je suis entrain en ce moment de créer une simulation de programme de crack de mot de passe par brute force avec dictionnaire.

    Pas de panique, je n'ai aucune mauvaise intention, tout cela est un exercice purement théorique, et je n'ai de toute façons pas du tout le niveau pour créer un tel programme fonctionnel. (c'est l'exercice du pendu qui m'a donné cette idée)

    seulement j'ai un problème avec une boucle, voici la fonction:

    void BruteForce(char motDePasse)
    {
    char chaineNombres[3];
    char Mot[100] = {0};
    char Stockage[100];
    FILE *fichierTest = NULL;
    fichierTest = fopen("test.txt", "r");
        if (fichierTest != NULL)
        {
    
        rewind(fichierTest);
            do
            {
                fgets(Mot, 100, fichierTest);
                Mot[strlen(Mot) - 1] = '\0';
                int i = 0;
                do
                {
                    //on crée stockage, copie de Mot, que l'on utilisera pour la comparaison
                    //Cela évite de devoir rechercher le mot a chaque réinitialisation
                    strcpy(Stockage, Mot);
    
                    //on récupere notre chaine de nombres
    
                    ChaineNombres(chaineNombres , i);
                    i++;
    
                    //on concatène les deux chaines
    
                    strcat(Stockage, chaineNombres);
                    printf("%s\n", Stockage);
                } while (i < 100);
            } while (strcmp(Stockage, motDePasse) != 0 && fichierTest != NULL);
        }
        else
            {
            printf ("Probleme d'ouverture du dictionnaire");
            }
    
    }

    La fonction prend comme paramètre le mot de passe à trouver (entré dans une chaîne par le "joueur", plus haut dans le programme)
    Ensuite, la fonction pioche le premier mot de la liste du document "test.txt" et l'intègre dans la chaine "Mot"

    Puis la fonction ChaineNombres reçois un nombre entre 1 et 99  et renvois une chaine contenant ce nombre reçu avec un \0 a la fin

    ex: pour une entrée de 54, on obtient la chaine suivante:

         chaineNombres[0] = '5'

         chaineNombres[1] = '4'

         chaineNombres[2] = '\0'

    Puis le programme concatène Mot (devenu StockageMot ici) et ChaineNombre pour obtenir pour chaque mot de la liste 99 variantes avec des nombres a la fin de 0 a 99

    La fonction continue tant que le MotDePasse n'a pas été trouvé, et tant qu'il reste des mots dans le dico.

    Mon problème est le suivant: La boucle va prendre le premier mot et lui associer tous les nombres possibles comme prévu, mais ne va pas passer au mot suivant après que ma boucle Do While se termine...

    J'espère que mon problème est assez clair! 

    Merci et bonne journée!

    -
    Edité par AlexandrePlouvier2 23 juin 2020 à 15:23:06

    • Partager sur Facebook
    • Partager sur Twitter
      23 juin 2020 à 15:40:13

      Bonjour !

      AlexandrePlouvier2 a écrit:

      La fonction prend comme paramètre le mot de passe à trouver (entré dans une chaîne par le "joueur", plus haut dans le programme)

      Du coup il y a déjà une erreur dans le paramètre : tu as mis un caractère tout court. Il faudrait plutôt :

      void BruteForce(char motDePasse[])

      Après, il y a peut-être d'autres erreurs.

      - Ligne 15 : tu ajoutes le caractère nul en fin de chaîne. Tu es sûr qu'il n'y est pas déjà ? D'autant que tu utilises pour ça la fonction 'strlen', qui se base justement sur celui-ci pour calculer la longueur.

      - Ligne 21 : inutile. La variable 'Mot' contient le mot, et ensuite tu lui ajoutes les nombres entre 0 et 99 grâce à la ligne 30, mais 'Mot' n'est jamais perdu. Pour faire cette opération, tu pouvais aussi utiliser la fonction 'sprintf' :

          sprintf(Stockage, "%s%02d", Mot, i);

      Ça remplace l'enchaînement de 'strcpy', 'ChanîneNombre' et 'strcat'.

      Mais comme les boucles sont écrites, tu testes si le mot de passe est égal au mot sans les nombres (une fois corrigée l'erreur du paramètre). Elles sont donc mal écrites. Une méthode possible serait de procéder ainsi :

      mdp_trouvé = Faux
      Faire :
      {   Lire Mot dans le fichier
          Pour i = 0 à 99 :
              Construire Stockage := Mot + 'i'
              Si Stockage = Mot_de_Passe alors :
                  mdp_trouve = Vrai
                  break
          Fin Pour
          // Ici, soit on est sorti du "Pour" parce qu'on a trouvé le mot de passe,
          // soit on est sorti parce qu'on a parcouru tous les nombres sans rien trouver
      } Tant Que Non mdp_trouvé
      // Ici, soit on est sorti du "Faire Tant Que" parce qu'on a trouvé le mot de passe,
      // soit on est sorti parce qu'on a parcouru tout le fichier sans rien trouver
      Si mdp_trouvé alors :
          (conclure...)

      -
      Edité par robun 23 juin 2020 à 16:02:17

      • Partager sur Facebook
      • Partager sur Twitter
        23 juin 2020 à 16:04:37

        Ouaou bah c'était bien ça le problème merci beaucoup! Apparemment c'était la seule erreur!

        Je fais beaucoup d'erreurs d'inattentions dans ce genre et j'ai du mal a les trouver dans mon programme à la relecture..

        C'est super d'avoir la possibilité de faire relire par des gens plus compétents, aussi je vous remercie de prendre de votre temps pour lire et répondre!

        Bien cordialement!

        • Partager sur Facebook
        • Partager sur Twitter
          23 juin 2020 à 16:10:24

          Mais il me semble que tu ne compares pas toutes les combinaisons mot + nombres, seulement mot + '99' non ?
          • Partager sur Facebook
          • Partager sur Twitter
            23 juin 2020 à 17:33:01

            Merci pour votre réponse exhaustive! 
            En ce qui concerne le \0 a la ligne 15:
            J'ai considéré que dans mon document texte les mots se terminent par un retour à la ligne, puisque je l'ai écris comme une liste. La fonction fgets ne prend pas le \n en compte? 
            Pour la ligne 21:
            Effectivement c'est nettement plus propre je vais faire ça!
            mais pour être sur de comprendre, "%s%02d" ca signifie que "%s" est pour Mot et "%02d" un nombre composé de 2 chiffres incarné par la variable i? C'est comme ça que je l'ai compris mais j'avais jamais vu ce genre de notations!
            Pour le test sans les nombres je viens de corriger le problème, j'ai rajouté des return 1 dans des if de vérification de conformité MP/Mot testé. 
            Par contre j'ai bien vérifié et le programme teste bien tous les nombres de 0 a 99 pour chaque mots, la dessus pas de problème! 
            J'ai aussi rajouté une boucle avec une majuscule au début du mot pour augmenter les chances de trouver.
            Voici mon programme modifié (j'ai pas encore ajouté les modifications que vous m'avez suggéré, je n'avais pas vu votre réponse complète)
            Grace à votre méthode, le code sera bien plus propre et concis!
            int BruteForce(char motDePasse[], char Stockage[])
            {
            char chaineNombres[3];
            char Mot[100] = {0};
            FILE *Dico = NULL;
            Dico = fopen("DICTIONNAIRE.txt", "r");
            int lignes = nombredelignes ();
                if (Dico != NULL)
                {
            
                rewind(Dico);
                    do
                    {
                        fgets(Mot, 100, Dico);
                        Mot[strlen(Mot) - 1] = '\0';
            
            
                        strcpy(Stockage, Mot);
            
                        // si le mot sans nombres est le même que mot de passe, la fonction s'arrete
            
                        if (strcmp(Stockage, motDePasse) == 0)
                                {
                                //printf ("ok\n");
                                fclose(Dico);
                                return 1;
                                }
                        int i = 0;
                        lignes --;
            
                        // premiere boucle sans majuscules
            
                        do
                        {
            
                            // on refais la copie pour la boucle
                            strcpy(Stockage, Mot);
            
                            //on récupere notre chaine de nombres
            
                            ChaineNombres(chaineNombres , i);
                            i++;
            
                            //on concatène les deux chaines
            
                            strcat(Stockage, chaineNombres);
                            
                            //on vérifie la conformité MP/Mots testés
                            if (strcmp(Stockage, motDePasse) == 0)
                                {
                                fclose(Dico);
                                return 1;
                                }
                        } while (i < 100);
            
                        // deuxieme boucle avec majuscule
            
                        i = 0;
                        do
                        {
                            // on refais la copie pour la boucle
                            strcpy(Stockage, Mot);
            
                            Stockage[0] = toupper(Stockage[0]);
            
                            //on récupere notre chaine de nombres
            
                            ChaineNombres(chaineNombres , i);
                            i++;
            
                            //on concatène les deux chaines
            
                            strcat(Stockage, chaineNombres);
                            //on vérifie la conformité MP/Mots testés
            
                            if (strcmp(Stockage, motDePasse) == 0)
                                {
                                fclose(Dico);
                                return 1;
                                }
                        } while (i < 100);
                    } while (lignes != 0 );
                }
                else
                    {
                    printf ("Probleme d'ouverture du dictionnaire");
                    }
            return 0;
            }
            et mon main:
            int main()
            {
                char MotDePasse[] = "pantalon32";
                char RechercheMot[100] = {0};
                if (BruteForce(MotDePasse, RechercheMot) == 1)
                {
                    printf ("Mot trouve: %s", RechercheMot);
                }
                else
                {
                    printf ("Le mot n'a pas ete trouve");
                }
                return 0;
            }
            
            • Partager sur Facebook
            • Partager sur Twitter

            Un problème de boucle de fgets!!

            × 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