logo Homepage
+  NewbieContest
|-+  Programmation» Langages compilés» [C] Algo de brute force
Username:
Password:
Pages: 1 [2]
  Imprimer  
Auteur Fil de discussion: [C] Algo de brute force  (Lu 15834 fois)
_o_
Relecteur

Profil challenge

Classement : 42/54283

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #15 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.
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
Invit
Invité
« #16 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...
Journalisée
Chilly
Relecteur

Profil challenge

Classement : 266/54283

Membre Senior
*
Hors ligne Hors ligne
Messages: 307


Voir le profil
« #17 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.
Journalisée

Non au langage SMS !!! http://sms.informatiquefrance.com
Invit
Invité
« #18 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.
Journalisée
Zmx

Profil challenge

Classement : 71/54283

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 559


Voir le profil WWW
« #19 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
Journalisée

Invit
Invité
« #20 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...
Journalisée
neoflo
Profil challenge

Classement : 8124/54283

Membre Complet
***
Hors ligne Hors ligne
Messages: 171


Voir le profil WWW
« #21 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
Journalisée

Deamos10

Profil challenge

Classement : 7398/54283

Néophyte
*
Hors ligne Hors ligne
Messages: 5


Voir le profil
« #22 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 
Journalisée
mogg41

Profil challenge

Classement : 449/54283

Membre Senior
****
Hors ligne Hors ligne
Messages: 267

Mogg41 pour vous aider!


Voir le profil
« #23 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
Journalisée

"Il ne savait pas que c'était impossible alors il l'a fait." Mark Twain
hypothetik
Profil challenge

Classement : 1037/54283

Néophyte
*
Hors ligne Hors ligne
Messages: 14


Voir le profil
« #24 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 

Journalisée
Ge0

Profil challenge

Classement : 16/54283

Membre Senior
****
Hors ligne Hors ligne
Messages: 377


Voir le profil WWW
« #25 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.
Journalisée
Spl3en

Profil challenge

Classement : 145/54283

Membre Junior
**
Hors ligne Hors ligne
Messages: 53


Voir le profil
« #26 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;
}
« Dernière édition: 29 Mai 2010 à 18:15:24 par SpleenKirby » Journalisée
Pages: 1 [2]
  Imprimer  
 
Aller à: