//-----------------------------------------------------------------------------------------------------------------------------------------------//
//----Fonction Brute Force multi thread avec l'exemple d'utilisation qui met en oeuvre le calcul du pourcentage, du dbit et du temps restant----//
//-----------------------------------------------------------------------------------------------------------------------------------------------//
Cette fonction permet d'effectuer un Brute Force (technique consistant  tester toutes les combinaisons de lettres) ne contenant qu'un seul threadmais aussi un brute force multi-thread. 
Le multi-Thread vous sera utile si vous devez faire un test  chaque nouvelle combinaison trouve et que ce test implique l'attente d'une rponse (la rponse d'un serveur par exemple), je m'explique : si vous tes dans ce cas-l et que vous n'utilisez qu'un seul thread, vous devez par exemple attendre 2 secondes entre chaque mots de passe et donc la capacit de votre ordinateur n'est pas utilise au maximum !
Alors que si vous vous servez de plusieurs threads (par exemple 20 threads), vous irez 20 fois plus vite !
La fonction permet :
    -de choisir les caractres  utiliser dans le brute force.
    -de choisir le nombre maximum de caractres gnrs.
    -de reprendre le brute force  partir d'une chane de caractres.
L'exemple d'utilisation de la fonction (donc le programme) permet de calculer :
    -le pourcentage effectu.
    -le dbit (nombre de combinaison trouvs par secondes)
    -le temps restant.

Tous les tests ncessaires au bon fonctionnement du programme sont aussi prsents dans l'exemple, donc normalement, il ne doit y avoir aucun bug...  part la limitation du nombre maximum de caractres gnrs !

Les fonctions permettant de lancer un simple thread et un multi thread sont diffrentes, le code se trouvant si dessous ne permet que de faire un brute force simple....





//-------------------------//
//-CODE DU SIMPLE THREAD :-//
//-------------------------//
Procedure TMain.BruteForce(Caracteres: ShortString; NbCarMax, NbCarBegin: SmallInt; StartFrom: ShortString);
Var I: Integer;
    Chaine: Array of Char;
    StrChaine: ShortString;
    NumeroPossibility, NbPossibilities: Extended;
begin
        // Calcul du nombre de possibilits
        NbPossibilities:=0;
        For I:=NbCarBegin To NbCarMax do
                NbPossibilities:=NbPossibilities+Power(Length(Caracteres), I);
        // Si on doit commencer  partir d'une chane, compter le nombre de possibilits dj effectues
        NumeroPossibility:=0;
        For I:=1 To Length(StartFrom) do
                NumeroPossibility:=NumeroPossibility + (Pos(StartFrom[I], Caracteres)-1) * Power(Length(Caracteres), Length(StartFrom)-I );
        For I:=1 To Length(StartFrom)-1 do
                NumeroPossibility:=NumeroPossibility + Power(Length(Caracteres), I);
        // Mettre toutes les variables  0
        SetLength(Chaine, NbCarMax);
        // Regarder  partir de quelle chaine il faut commencer
        // La Chaine  la fin de la boucle va ressembler  a par ex : "#0#0#0#0#0#0a" ou "#0#0testa"
        For I:=0 To NbCarMax-1 do
        begin
                // Si il faut reprendre  partir d'une chane
                If (Length(StartFrom)>0) and (I>=NbCarMax-Length(StartFrom)) Then
                        Chaine[I]:=StartFrom[I-(NbCarMax-Length(StartFrom)-1)]
                else begin
                        If I>=NbCarMax-NbCarBegin Then
                                Chaine[I]:=Caracteres[1]
                                else
                                Chaine[I]:=Chr(0);
                end;
        end;

        While (NumeroPossibility<NbPossibilities) and (StopSimpleBruteForce=False) do
        begin
                // Si on est en mode pause
                While PauseSimpleBruteForce=True do
                        Sleep(1000);

                // Ajouter une possibilite essaye
                NumeroPossibility:=NumeroPossibility+1;

                // Monter un "string" avec la chaine du tableau
                // Je ne sais pas comment effectuer un "Copy" pour directement mettre dans le string
                // et donc, cette technique fait paumer du temps (le for)
                For I:=0 To NbcarMax-1 do
                        If Chaine[I]<>chr(0) Then StrChaine:=StrChaine+Chaine[I];

                // C'EST ICI QU'IL FAUT METTRE LES DIFFERENTS TESTS SUR CHAQUE CHAINE
                // LA CHANE EST "StrChaine"
		// La progression peut tre reprsete comme a : NumeroPossibility/NbPossibilities

                // Trouver une autre chane
                StrChaine:='';
                For I:=NbcarMax-1 downto 0 do
                begin
                        If Pos(Chaine[I], Caracteres)<Length(Caracteres) Then
                        begin
                                Chaine[I]:=Caracteres[Pos(Chaine[I], Caracteres)+1];
                                Break;
                        end else begin
                                Chaine[I]:=Caracteres[1];
                        end;
                end;

                // Laisser les vnements extrieur se drouler
                Application.ProcessMessages;
        end;
end;









//-------//
//-FIN :-//
//-------//
J'ai besoin d'aide (pour amliorer la performance du code) : savez-vous comment faire pour convertir un tableau de caractres en string (le tableau contient des caractres nuls au dbut de la chane et je ne veux pas qu'ils soient inclus dans la convertion) ?
Le tableau ressemble  a par ex : "[#0], [#0], [a], [b], [c]" et je veux le convertir en a : "abc" sans utiliser de boucle car a ralenti.
Si vous avez une solution, vous seriez cool de me la communiquer...

Pour information, normalement, je vais crer un programme utilisant cet exemple permettant de retrouver le mot de passe d'une adresse email...

Voil, sinon, vous pouvez commenter et noter, a serait sympa  vous !