NewbieContest

Programmation => Langages compilés => Discussion démarrée par: IoNAce le 17 Avril 2007 à 15:55:59



Titre: [C] Algo de brute force
Posté par: IoNAce le 17 Avril 2007 à 15:55:59
Hello all !
Sa fait longtemps que je cherche a coder mon propre algo de brute force. J'ai vue beaucoup de code a ce sujet mais la plupart ce contente d'une attaque par dictionnaire (pas dur a faire) ou sinon, le code est relativement mal commente et je galere a comprendre.
Est-ce que quelqu'un pourait m'expliquer comment on fait ?

J'ai reussi a en faire un mais sa ne fonctionne plus au bout de 3 lettres :oops; et je repete souvent les memes groupes de lettres (genre plusieurs fois aaa).

Merci =)


Titre: [C] Algo de brute force
Posté par: offw0rld le 17 Avril 2007 à 17:12:00
Ben tu peux toujours regarder le code de john the ripper, sinon un bruteforce que je trouve bien optimiser et en c, y'a celui la : http://www.geocities.com/dxp2532/unhash.zip


Titre: [C] Algo de brute force
Posté par: IoNAce le 18 Avril 2007 à 12:17:27
Cool merci je vais regarder sa.


Titre: [C] Algo de brute force
Posté par: Bug_Bug le 11 Juillet 2007 à 22:42:28
Tu peut aussi mire ce petit tuto (un peut) intéressant:
http://www.mixman.biz/brutusforce.htm


Titre: [C] Algo de brute force
Posté par: Folcan le 18 Juillet 2007 à 10:17:18
En meme temps un bruteforce, c'est ce qu'il y'a de plus simple a faire...

Tu initialise une chaine de caractere : abcdefghijklmnopqrstuvwxyz
et apres tu boucle sur les caracteres, ca me semble pas bien mechant, sinon c'est que j'ai pas tout compris...


Titre: [C] Algo de brute force
Posté par: offw0rld le 27 Juillet 2007 à 10:30:54
C'est sur, la logique du bruteforce est simple, mais l'optimisation (qui est très importante) n'est pas le plus simple a faire.


Titre: [C] Algo de brute force
Posté par: Invit le 07 Août 2007 à 11:25:50
Bonjour, voici mon problème

Code:
#include <stdio.h>
#include <stdlib.h>

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

for(i = 'a'; i <= 'z' ; i++)
{
      printf("%c\n", i);
}
return 0;
}

}
ensuite je sais qu'il faut ajouter +1 pour avoir un deuxieme caractere mais si je fais ajouter +1 sur la variable crack ensuite il va m'inscrire le 128 caractere du code ASCII, comment faire pour avoir deux caractere ?


Titre: [C] Algo de brute force
Posté par: micka13 le 07 Août 2007 à 13:33:55
Un appel reccursif ?


Titre: [C] Algo de brute force
Posté par: Invit le 07 Août 2007 à 15:05:32
je suis d'accord montre comment on fait pour mettre des caracteres en plus...

- exemple de code source ou autre....


Titre: [C] Algo de brute force
Posté par: _o_ le 07 Août 2007 à 15:19:19
Citation de: ECHELON
je suis d'accord montre comment on fait pour mettre des caracteres en plus...
Il va falloir être un tout petit peu plus précis sur ce que tu cherches à faire, car pour le moment, je n'ai trouvé personne qui ait compris ta demande (à part micka13 peut-être, mais je n'ai pas compris sa réponse :/ ).


Titre: [C] Algo de brute force
Posté par: Invit le 07 Août 2007 à 15:28:58
Ok voila si vous voulez je crée un logiciel de brutforce mon problème c'est qu'il affiche un seul caractere est je voudrais qu'il affiche plusieur caractères  

exemple:

2 caractères
-------------
ab
ac
ad
...
ensuite 3 caractères
aab
aac
aad
...
ainsi de suite...


Titre: [C] Algo de brute force
Posté par: _o_ le 07 Août 2007 à 15:49:20
Bon, ben déjà, suite à la modification de ton code source, je te propose un truc encore plus simple, sous réserve que tu te limites à de l'US_ASCII :

Code:
 
for(i = 'a'; i <= 'z' ; i++)
{
      printf("%c\n", i);
}
Citation de: ECHELON
Ok voila si vous voulez je crée un logiciel de brutforce mon problème c'est qu'il affiche un seul caractere est je voudrais qu'il affiche plusieur caractères.
C'est un simple problème d'algorithmique. Mais j'ai peur que ce soit un peu mettre la charrue avant les boeufs. Commence par te documenter sur la manipulation de chaînes en C, c'est un pré-requis impératif pour pouvoir réaliser ce genre de chose.


Titre: [C] Algo de brute force
Posté par: Invit le 07 Août 2007 à 18:52:15
Pardon, j'ai essayé ton code ça n'a rien fait je suis toujours à un seul caractere


Titre: [C] Algo de brute force
Posté par: _o_ le 07 Août 2007 à 19:02:17
Citation de: ECHELON
Pardon, j'ai essayé ton code ça n'a rien fait je suis toujours à un seul caractere
Évidemment, ça fait la même chose que ton code, mais écrit un peu plus dans la philosophie C. Pour le reste, je suis désolé, mais il va vraiment falloir que tu te formes à ce langage pour espérer aller plus loin.


Titre: [C] Algo de brute force
Posté par: Invit le 07 Août 2007 à 19:10:51
Code:
écrit un peu plus dans la philosophie C.
lool,c'est la même chose à part que t'as changer les nombres par les caractères...

Code-Source
------------------

for(i = 'a'; i <= 'z' ; i++)
{
      printf("%c\n", i);
}

------------------------------
for(i = 0; i < 26; i++)
{
     printf("%c\n", i);
}
------------------------------

alors sinon si je comprend bien personne ne sais comment ajouter des caractères en plus..


Titre: [C] Algo de brute force
Posté par: _o_ le 07 Août 2007 à 19:18:46
Citation de: ECHELON
lool,c'est la même chose à part que t'as changer les nombres par les caractères...
Heuuuuu... J'ai surtout viré le tableau de 26 caractères, hein.


Titre: [C] Algo de brute force
Posté par: Invit le 07 Août 2007 à 19:21:20
Oui, t'as fait comme mon premier code source que j'ai fait t'as utiliser le code Ascii...


Titre: [C] Algo de brute force
Posté par: Chilly le 07 Août 2007 à 19:39:53
Citation de: _o_
C'est un simple problème d'algorithmique. Mais j'ai peur que ce soit un peu mettre la charrue avant les boeufs. Commence par te documenter sur la manipulation de chaînes en C, c'est un pré-requis impératif pour pouvoir réaliser ce genre de chose.
Pour moi c'est effectivement un problème d'algorithmique, et je pense qu'il faudrait que tu commences à réfléchir tout seul, avec un papier et un crayon sur l'enchaînement des "actions" à effectuer. Sans chercher à écrire en C ou autre. En écrivant des instructions en pseudo-langage, par exemple, ou en faisant des petits diagrammes décrivant les enchaînements de ce que ton programme devra faire pour aboutir au résultat que tu souhaites. Et en déroulant à la main ce que tu auras écrit.

Ne le prends pas mal, mais ce que tu demandes est assez simple à coder. Et vu ce que tu as écrit tu n'as visiblement pas la logique d'un programmeur pour l'instant.

Alors peut être que tu as besoin que quelqu'un t'aide dans ton apprentissage, je ne dis pas qu'il faut que tu te débrouilles tout seul, que tu ne trouveras aucune aide. Mais te donner un algorithme tout fait pour ton brute-force, ne t'aiderait pas spécialement, à mon avis, à progresser en programmation.

Pour moi, tu devrais réfléchir avec un papier et un crayon à la logique que doit suivre ton programme. Bien sûr il n'est pas question de tout coder tout le temps en passant par le papier/crayon, mais c'est une étape - je pense - importante pour un débutant. C'est comme ça que j'ai débuté personnellement, et je pense que je me débrouille bien en algorithmique.

Une fois que tu auras trouvé sur papier une suite d'instructions et qu'en la déroulant à la main, tu obtiendras ton résultat, là, il sera temps de voir comment on manipule les chaînes de caractères en C, pour écrire enfin ton programme.


Après c'est mon avis personnel qui n'engage que moi.

Et ce n'est pas une attaque personnelle ni rien dans le genre, mais juste mon avis pour que tu progresses en programmation.


Titre: [C] Algo de brute force
Posté par: Invit le 07 Août 2007 à 19:45:57
tu parles de quoi là pardon mais la boucle avec un code ascii je l'avais déjà fait ?(pour la question de programmation je pense bien le problème c'est que je sais pas tous)
deuxiement je n'ai jamais demander le code source juste de comprendre avoir un tuto ou autre...

Sinon, je trouve que c'est une trés bonne idée que je prenne un bloc de feuille est un crayon pour aller réfléchir...
le probléme c'est que je connais pas tous le language [C] c'est pour ça que je vous demandez un tuto qui pourrais m'apprendre à mettre des caractères en plus.


Titre: [C] Algo de brute force
Posté par: Zmx le 07 Août 2007 à 21:52:22
Citation de: ECHELON
c'est pour ça que je vous demandez un tuto qui pourrais m'apprendre à mettre des caractères en plus.
http://www.commentcamarche.net/forum/affich-144034-concatenation-en-c


Titre: [C] Algo de brute force
Posté par: Invit le 07 Août 2007 à 22:32:08
Je suis d'accord Zmx
ça va me servire à quoi de mettre deux variable de même valeur...
Code:
strcat("hello ","world");
à ce moment la utilisons un pointeur

sinon j'ai trouver un code source qui montre [algorithme  brute force]

http://www.cppfrance.com/codes/ALGO-BRUTE-FORCE_28799.aspx

j'ai garder l'essentiel du code source

Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int venix(int LongueurMax, char begin, char end, int err)
{

char code[255]; // tableau contenant le code
int i; // indice tableau
int longueur; // longueur en traitement

// ouverture fichier

// on traite toutes les longueurs possible jusqu'a longueurmax
for (longueur=1; longueur <= LongueurMax; longueur++)
{
// marque de fin de génération de longueur
// initialisation du premier "mot"
for (i=0; i < longueur; code[i++] = begin)
code[longueur] = 0;

// on fait toute les lettres
        while(code[longueur-1] <= end)
{
i = 0; // init indice
while(code[i] > end && code[i+1] != 0)
{
code[i] = begin;
code[++i]++;

if((code[i] == ('9'+1)) && (err == 0)) code[i] = 'A';
if((code[i] == ('Z'+1)) && (err == 0)) code[i] = 'a';
if((code[i] == ('9'+1)) && (err == 1)) code[i] = 'a'; // cas particulier (5)
}


code[0]++;
}
}
return 1;
}
dites moi si je me trompe ?
je comprend la premiere boucle du code source ensuite c'est flood....
pourriez-vous me l'expliquer...


Titre: [C] Algo de brute force
Posté par: neoflo le 19 Septembre 2007 à 22:21:24
Il n'y a pas besoin de strcat pour ça. Ce que tu veux faire, c'est générer l'ensemble des combinaisons.
C'est le même principe que pour des entiers ;) Il est possible d'utiliser toujours le même buffer tout au long du calcul.

Par exemple en s'inspirant de : http://www.developpez.net/forums/showthread.php?t=228599


Titre: Re : [C] Algo de brute force
Posté par: Deamos10 le 16 Juin 2008 à 22:06:39
Amis du soir bonsoir,

Petite question existentielle venue du fin fond de mon esprit :

Pour coder concretement un soft de bruteforcing, faut-il lancer un logiciell ssh genre putty avec un Createprocess pour ensuite lui envoyer une série de mdp à tester ?

A moins qu'il ne faille creer son propre ssh client ?

Ce point me parait important étant donné que dans ce topic il ne s'agit que de la génération de l'ensemble des combinaisons, mais que faut-il en faire ensuite ? :p

Amicalement tousa  =)


Titre: Re : [C] Algo de brute force
Posté par: mogg41 le 16 Juin 2008 à 22:19:51
Je ne suis pas expert en bruteforcing mais pour répondre à ta question tout dépend de ce que tu veux cracker. Admettons que tu veuilles bruteforcer un login et un password qur un site. Tu crées ton bruteforce et après tu ouvres un socket (puisqu'on est dans un topic de C) et tu y envoies tes login/password.
Pour ce qui est de bruteforcer une boîte mail, une archive ou tout autre programme je ne sais pas comment il faut s'y prendre.
J'espère t'avoir aider.
Mogg


Titre: Re : [C] Algo de brute force
Posté par: hypothetik le 17 Juin 2008 à 09:09:00
ce topic m'intéresse beaucoup ! pas tant sur l'algo mais plutôt sur la façon de se "connecter" a un programme en local histoire de tester ses mots de passes;

J'ai vu dernièrement un tuto sur le hook windows (http://tcharles.developpez.com/simul/) qui m'avait l'air pas mal, existerait il des fonctions pour remplir les champs d'un programme après avoir trouvé son Class Name sans avoir a simuler l'appui des touches ?

 pour intercepter la réponse ?

J'ai vu qu'un hook WH_GETTEXT existait mais je n'ai pas compris son  utilisation, apparemment on peut même l'utiliser sur une fenêtre fille ce qui devient très intéressant  :twisted:



Titre: Re : [C] Algo de brute force
Posté par: Ge0 le 14 Décembre 2008 à 14:21:14
Salut salut.
Pour ma part, je suis plus intéressé par l'algorithme qu'autre chose ; de plus, je voulais faire un nouveau sujet mais celui-ci a toujours lieu d'être malgré les vieilles réponses, donc allons-y...

Ce que j'ai pu faire en C, c'est une fonction récursive - enfin, plus une procédure puisqu'elle ne retourne pas de valeur - qui reçoit un argument un nombre allant de 0 à n, et qui va appeler printf() plusieurs fois pour afficher un caractère à la fois. Je m'explique :
Code:
char tab[] = "0123456789";

Le but sera de faire afficher de 0 à 9, puis de 00 à 99, puis de 000 à 999... etc, jusqu'à une taille donnée (je ne me suis pas encore penché sur la condition d'arrêt).

J'ai donc employé l'usage d'un compteur.
Code:
int cpt = 0;

Et j'ai pensé aux conditions suivantes :
Citation
si cpt = 0, retourner 0
si cpt = 9, retourner 9

par contre, si cpt = 10, retourner "00"
            si cpt = 11, retourner "01
            ...
            si cpt = 20, retourner "10"
            ...
            si cpt = 100, retourner "90"
            si cpt = 110, retourner "000"

L'algorithme appellera donc la division et le modulo :
- Les divisions successives pour connaître la taille de la chaîne courante en fonction du compteur ;
- Le modulo pour connaître le caractère en question dans la table.

Enfin, je vous avoue que j'ai vraiment du mal à m'expliquer car entre le repas et la douche, j'ai réfléchi à plusieurs trucs sans garder les traces de mon boulot ; cet algo est vraiment casse-tête...

Néanmoins, j'ai trouvé une fonction récursive qui marchait :
Code:
Procedure BruteForce(E : num : Entier, E : tab : chaine de catactères : E : taille : Entier)
Debut
   Si num / taille = 0 Alors
       Afficher tab[num]
   Sinon
       Executer BruteForce((num/longueur)-1 ,tab, taille)
       Afficher tab[(num%longueur)]
   FinSi
Fin

En C :
Code:
void BruteForce(size_t num, char *tab, int longueur) {
    if(!(num / longueur)) {
        printf("%c",tab[num]);
    } else {
        BruteForce((num/longueur)-1,tab,longueur);
        printf("%c",tab[(num%longueur)]);
    }
}

Bien que je ne puisse réexpliquer mon raisonnement, ce code marche parfaitement dans une boucle comme celle-ci - je rappelle que je n'ai pas fait de condition d'arrêt :

Code:
i <- 0
Tant que 1 Faire
    Executer BruteForce(i, tab, LongueurTab)
    Afficher "\n"
    i <- i + 1
Fin Tant que

Code:
while(1) {
    BruteForce(i,tab,LongueurTab);
    printf("\n");
    i++;
}

Bref, ça commence à me prendre un peu la tête, tout ça...

Je voulais savoir si quelqu'un saurait comment me traduire cette fonction en itérative qui retournerait la bonne chaîne de caractères ? Car j'avoue que je stagne là.

Si vous avez besoin de plus de précisions sur la chose, j'essaierai de faire de mon mieux.


Titre: Re : [C] Algo de brute force
Posté par: Spl3en le 29 Mai 2010 à 18:13:12
Je déterre un très vieux topic, mais bon, puisque je suis tombé dessus et qu'il m'intéressait :)
En réponse à Geo, j'ai essayé de faire ce que tu demandais ;
J'ai repris ton idée de compteur, et évité d'une certaine façon la récursivité.
Ca me donne ça ... Avec une grosse optimisation possible de la fonction get_pass_len_max :

Je n'arrive tout bêtement pas à récupérer la longueur du mot de passe en fonction de son id (le compteur), alors que l'inverse est très simple à faire...
Du coup ça me donne du code très bourrin pour cette fonction qui réduit beaucoup les perfs, c'est bien dommage car le reste tourne niquel :(

Code:

#include <stdio.h>
#include <string.h>
#include <math.h>

#define BUFFER_LEN_MAX  1024
#define PASS_LEN        6

int
get_gen_id_max      (int tab_len, int pass_len);

int
get_pass_len_max    (int tab_len, int gen_id);

void
bruteforce_gen      (char *tab, int gen_id, char *dest);


int main()
{
    char tab[] = "012345",
         output[BUFFER_LEN_MAX];

    int tab_len = strlen(tab),
        gen_id_max = get_gen_id_max(tab_len, PASS_LEN),
        i;

    printf("Nombre de caract\x8Ares : %d \n", tab_len);
    printf("Nombre de possibilit\x82s : %d \n\n", gen_id_max);

    for (i = 1; i < gen_id_max; i++)
    {
        bruteforce_gen(tab, i, output);
        printf("%6d > %s\n", i, output);
    }

    return 0;
}


void bruteforce_gen (char *tab, int gen_id, char *dest)
{
    int tab_len  = strlen(tab);
    int pass_len = get_pass_len_max(tab_len, gen_id);
    int i;

    for (i=0; i < pass_len; i++)
    {
        dest[i] = tab [ ( (gen_id-1) / (i * (tab_len-1) + 1) ) % tab_len ];
    }

    dest[pass_len+1] = '\0';
}


int get_gen_id_max (int tab_len, int pass_len)
{
    int i;
    int n = 0;

    for (i = pass_len + 1; --i;)
        n += pow (tab_len, i);

    return n;
}

int get_pass_len_max (int tab_len, int gen_id)
{
    int pass_len = 0,
        cur_gen_id = 0;

    for (cur_gen_id = 0; cur_gen_id < gen_id; pass_len++)
        cur_gen_id = get_gen_id_max(tab_len, pass_len);

    return pass_len - 1;
}