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 :

Programme freeze, aide ajouter thread


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Points : 48
    Points
    48
    Par défaut Programme freeze, aide ajouter thread
    Bonjour, je suis nouveau dans le domaine de c# et j'apprends sur le tas^^

    Je viens de créer un petit programme qui hash du texte en sha1 ou md5 et maintenant je me suis lancé dans un programme de BruteForce.

    Le problème est donc que le programme va utiliser une boucle pour tester les toutes les combinaisons possibles et que cela le fige...

    Je me suis un peu renseigné et je pense que la solution est la création de Threads.

    Voici le code du bouton pour lancer l'application :



    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
     
    //=== Bouton "Brute force" ==========================================
            //===================================================================
            private void button1_Click(object sender, EventArgs e)
            {
     
                //Si l'input du hash est vide
                if (textBox1.Text.Length <= 0)
                {
                    MessageBox.Show("Vous devez entrez un hash avant de lance le programme !", "Brute-Tools By D3L1");
                }
                //Si l'input du hash est checked et MD5 est plus petit ou plus grand que 32
                else if (radioButton1.Checked & textBox1.Text.Length != 32)
                {
                    MessageBox.Show("Une chaine hacher en MD5 doit faire 32 caractères de long !", "Brute-Tools By D3L1");
                }
                //Si le hash est correct alors on commence
                else
                {
     
                    enCour = 0;
     
                    //Récupère la valeur du hash
                    string hash = textBox1.Text;
     
                    //Récupère la valeur de la chaine de caractères "ABCD...."
                    String lowerAlpha = textBox2.Text;
     
                    //La longeur minimal du password en clair
                    int passLengthMin = 1;
     
                    //La longeur maximal du password en clair
                    int passLengthMax = 30;
     
                    //Calcul la longeur du hash et appel la fonction BruteForce
                    for(int i = passLengthMin; i <= passLengthMax; i++)
                    {
                        if (enCour == 0)
                        {
                            BruteForce(lowerAlpha, i, hash);                    
                        }
                        else
                        {
                            i = passLengthMax;
                        }
                    }
     
                }
     
            }
    Cela appel donc plusieurs fois la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //=== Fonction de Brute Force ======================================= 
    //===================================================================
    private void BruteForce(String charset, int wordLength, string pass)
    {
       ....
    }
    Qui elle même appel plusieurs fois la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <code type="csharp">
    //=== Fonction de hachage MD5 =======================================
    //===================================================================
    private string GetMD5Hash(string str)
    {
       ....
    }
    Le Programme fonctionne parfaitement si la valeur de "passLengthMax" ne dépasse pas 4. Au delà sa se fige...

    Donc maintenant je tente de créer un thread, j'ajoute la bibli --->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.Threading;
    et je le crée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //On crée le thread.
    Thread t1 = new Thread(new ThreadStart(BruteForce(lowerAlpha, i, hash)));
     
    //Puis on le lance !
    t1.Start();
    mais je ne sais pas ou le mettre et si c'est correct

    Merci d'avance pour votre aide...

  2. #2
    Membre éprouvé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Points : 1 215
    Points
    1 215
    Par défaut
    Salut,

    Bon c'est presque ca. Pour les thread c'est bon, la syntaxe est bonne, mais c'est au niveau du fonctionement.

    Tu devrais mettre le "for" dans ta fonction de brute force, et lui passer comme parametres lowerAlpha, lengthMin et lenghtMax.

    Comme ca, tu n'a qu'un seul thread a lancer et c'est bien mieux.

    SAUF (j'y songe a l'instant) si tu souhaites utiliser tous les coeurs de la machine. La, tu va devoir effectivement lancer plusieurs threads en meme temps, mais le probleme est que de lancer 30 thread qui tournent a fond en parallele fait perdre de l'efficacité (sauf si la machine a 30 coeurs, ce qui je suppose n'est pas le cas).

    Dans ce cas, tu peux bidouiller avec ca : http://msdn.microsoft.com/en-us/libr...ssorcount.aspx.
    Ce qui te permet de lancer [nProc] threads, puis quand un thread finit, tu lance le thread suivant, etc...

    Good luck

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Avec la version de .Net 4, paralléliser un traitement est très simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private void BruteParallel()
    {
       Parallel.For(passLengthMin, passLengthMax, i => 
         {
            BruteForce(lowerAlpha, i, hash); 
         });
    }
    Sinon, en effet, il est recommandé de limiter le nombre de threads actifs concurrents

    A la rigueur ce traitement est lui déclenché dans un thread pour ne pas figer ta gui, et c'est réglé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Thread(new ThreadStart(() => BruteParallel())).Start();

  4. #4
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Je vous conseille plutôt d'utiliser les tread de pool pour plus d'efficacité et moins de travail de gestion de la création et la destruction du thread.

Discussions similaires

  1. compteur al'aide de threads
    Par bechirdali dans le forum C#
    Réponses: 1
    Dernier message: 18/12/2007, 13h20
  2. Programmation réseau : socket et thread
    Par roms712 dans le forum POSIX
    Réponses: 12
    Dernier message: 12/01/2007, 17h27
  3. Pas d'erreur au debugage mais le programme freeze
    Par bob2356 dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 25/09/2006, 19h16
  4. automatiser un programme à l'aide de perl
    Par moitoujours dans le forum Langage
    Réponses: 8
    Dernier message: 15/03/2006, 20h10

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