Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Буквенный перебор C++ (https://forum.antichat.xyz/showthread.php?t=130382)

fire64 18.07.2009 21:16

Буквенный перебор C++
 
подскажите как на C++ сделать цикл с буквенным перебором

тоесть перебор английских букв от A до Z

если конкретно то хочу сделать полный буквенный перебор как в брутфорсах

Fata1ex 18.07.2009 21:26

Буду очень признателен, если переформулируешь вопрос ) Я нифига не понял.
Перебор чего? Что делать с полученными данными? Какой порядок у них? Какие буквы?

Ra$cal 18.07.2009 22:05

вариантов несколько. дают разную скорость. но вполне оптимизированный по скорости - заводишь массив интов. сколько символов в пароле - столько элементов в массиве. заводишь массив словаря. например получится так

// 5 символов в словаре
char dictionary [] = { 'a', 'b', 'c', 'e', 'f'};
// 10 символов в пароле
int pass [10];

Значение в массиве pass указывает, какую букву сейчас содержит соответствующий символ пароля. Дальше делаешь инкремент последнего элемента массива pass. проверяешь на переолпнение. причем переполнение происходит когда элемент массива рваен sizeof(dictionary). Когда дошел до последней буквы - сбрасываешь в ноль и плюсуешь 1 следующему элементу массива. В итоге перебор сводится к простой арифметике. По сути это реализация системы счисления. Тока не десятичной, а сколько символов в словаре. Ну а дальше делаешь функцию passToStr(), в которой проходишь по каждому элементу массива и подставляешь вместо числа символ

string txt_pass = "";
txt_pass = string(pass[i]) + txt_pass;

типа такого. плюс данного варианта в простом изменении словаря. минус - можно сделать еще оптимизированнее.
вообще задача имеет туеву хучу решений и зависит тока от наличия моска в черепной коробке.

Ra$cal 18.07.2009 22:27

вот еще вариант набросал за пару минут. плюс - минимум кода(4 строки в цикле). минус - много делений для разбивки на разряды.

Код:

#include <windows.h>
#include <iostream>
using namespace std;

char dic [] = {'a', 'b', 'c', 'd', 'e'};
int dic_size = sizeof(dic);

void show_pass (int pass);
void main()
{

        int pass = 0;
        while (pass < 150){
                show_pass(pass);
                cout << '\n';
                pass++;
        }
}

void show_pass(int pass)
{
        int tmp_pass = pass;

        if(tmp_pass == 0){
                // чтоьбы вывести букву с индексом 0
                // конечно можно словарь завести с 1го байта и обойтись без ифа
                cout << dic[0];
                return;
        }
        while (tmp_pass > 0){
                cout << dic[tmp_pass % dic_size];
                tmp_pass /= dic_size;
        }
}

ps: не хватает вариантов с a на конце. давайте сыграем в игру "допилите сами" =)

.Slip 18.07.2009 22:52

Можно по ascii кодам, + удобней будет с разным регистром.

2Ra$cal, просто ради интереса вопрос, зачем хедер апи?)

Ra$cal 18.07.2009 22:58

по аскам удобно только для одной раскладки и регистра. иначе будут плодиться ифы.
windows.h проинклюден ибо это отдельный прожект в котором клепаю на скорую руку кодесы =) поэтому основные хидеры подрублены и using namespace добавлен=)

.Slip 18.07.2009 23:05

Как раз по аски будет удобней, массивы уже по сути есть, просто нужно выбрать необходимый промежуток. А забивать вручную разные регистры/раскладки - это не удобно.

Ra$cal 18.07.2009 23:12

ну сделай на асках перебор такого словаря:
a,b,e,g,x,F,K,L,V,2,6,7,0,~,!,^,_,=,)

.Slip 18.07.2009 23:24

Я говорил про полный алфавитный перебор, как видишь ТС говорил про A..Z. Т.е. ему хватит перебора 41h..5Ah

Ra$cal 18.07.2009 23:38

я о другом. просто A-Z легко перечислить инкрементя и сравнивая с 'Z' это да. Но проще все таки сделать универсальный алго. Правда это мое имхо. Но ты пишешь

Цитата:

Можно по ascii кодам, + удобней будет с разным регистром.
в чем удобство разных регистров при работе с аски кодами? тут или дублирование кода(два цикла для перебора больших букв и маленьких, еще потом можно добавить цифры) или смена лимита сравнения 'Z' на 'z' ифами. Ито ито имхо не очень удобно. Я старался сделать чтобы из всех изменений при смене набора перебираемых букв были только изменения в данных, никак не в коде, ибо это гораздо безопаснее и не повлечет ошибки.

slesh 19.07.2009 10:45

Код:

unsigned char x ;
unsigned char start_char = 'A';
unsigned char stop_char = 'Z';

// A-z
// ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

// 0-z
// 0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

// ' ' - 'z'
//  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

//  Как что просто указал начало и конец и у тебя есть нужный диапазон

for (x = start_char; x <= stop_char; x++)
{
 printf("%c", x);
}


fire64 19.07.2009 16:19

Я написал вот такой индусский код

PHP код:

char dic [] = 
{
    
'a'
    
'b'
    
'c'
    
'd'
    
'e'
    
'f'
    
'g'
    
'h'
    
'j'
    
'k'
    
'l'
    
'm'
    
'n'
    
'o'
    
'p'
    
'r'
    
'q'
    
'u'
    
's'
    
't'
    
'v'
    
'w'
    
'x'
    
'y'
    
'z'
};



    
int numberchar 5;

    
char pchar[2] = "";
    
char vchar[2] = "";
    
char tchar[2] = "";
    
char chchar[2] = "";
    
char pychar[2] = "";
    
char shestchar[2] = "";
    
char final[8] = "";


    for( 
int a 026a++ )
    {

        
sprintf(pchar"%c"dic[a] );

        if( 
numberchar == )
        {
            
sprintf( final, "%s"pchar );

                
chekdomain( final );

                continue;
        }


        for( 
int b 026b++ )
        {
            
sprintf(vchar"%c"dic[b] );

            if( 
numberchar == )
            {
                
sprintf( final, "%s%s"pcharvchar );

                
chekdomain( final );

                continue;
            }

            for( 
int c 026c++ )
            {
                
sprintf(tchar"%c"dic[c] );


                if( 
numberchar == )
                {
                    
sprintf( final, "%s%s%s"pcharvchartchar );

                    
chekdomain( final );

                    continue;
                }


                for( 
int d 026d++ )
                {
                    
sprintf(chchar"%c"dic[d] );

                    if( 
numberchar == )
                    {
                        
sprintf( final, "%s%s%s%s"pcharvchartcharchchar );

                        
chekdomain( final );

                        continue;
                    }


                    for( 
int e 026e++ )
                    {
                        
sprintf(pychar"%c"dic[e] );

                        if( 
numberchar == )
                        {
                            
sprintf( final, "%s%s%s%s%s"pcharvchartcharchcharpychar );

                            
chekdomain( final );

                            continue;
                        }


                        for( 
int f 025f++ )
                        {
                            
sprintf(shestchar"%c"dic[e] );

                            if( 
numberchar == )
                            {
                                
sprintf( final, "%s%s%s%s%s%s"pcharvchartcharchcharpycharshestchar );

                                
chekdomain( final );

                                continue;
                            }

                        }

                    }

                }

            }

        }

    } 


\\ChaOs// 19.07.2009 20:05

Какие у вас у всех(почти у всех) трудные методы.
вот мое:
Код:

int i=65,n=90;
 while(i!=n)
 {
        std::cout<<char(i)<<std::endl;
 i++;
 }

Полный перебор со спец. символами:
Код:


 for(int i=32,n=126;i!=n;i++)
 {
        std::cout<<char(i)<<std::endl;
 i++;
 }


Ra$cal 19.07.2009 20:54

fire64
ппц =)

\\ChaOs//
это вывод одного символа. теперь скомпонуй код, который будет выдавать все варианты паролей длиной 6 символов. тока не как у fire64 чтоб код получился =))

fire64 19.07.2009 21:16

Ra$cal, согласен код кошмарный
но он работает, а это главное :)

bons 19.07.2009 21:44

на С. Проверки неправильно переданных параметров в функции нет, конечно следовало бы понаставить assert'ов но мне влом.
Код:

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

const unsigned char n_begin = 'a';
const unsigned char n_end = 'z';
const size_t str_len = 3;

int next_element(unsigned char *str, size_t strlen) {
        size_t index = strlen - 1;
        int cond = 0;
        while(!cond) {
                cond = 1;
                if(++str[index] > n_end) {
                        if (index == 0) {
                                return 0;
                        }
                        str[index--] = n_begin;
                        cond = 0;
                }
        }
        return 1;
}

int main(int argc, char** argv) {
        unsigned char str[str_len + 1];
        memset(str, n_begin, str_len);
        str[str_len] = 0;
        do {
                printf("%s\n", str);
        } while(next_element(str, str_len));
        return 0;
}


fker 20.07.2009 15:57

мой вариантик, медленно правдо генерерует слова(например 10и символьные), но работает и можно подставлять любые символы.

Код:

  #include<stdio.h>
  #include<conio.h>
  #include<stdlib.h>
  int M,N;
  void main(){
  clrscr();
  int next(int *);
  char abc[]={'a','b','c','d','e','#',')','_','@'};
  //char abc[]={'a','b','c'};
  int i;
  int *arr;
  M=sizeof(abc);
  printf("DJIuHHa CJIoBa -> ");
  scanf("%d", &N);
  arr=(int *) calloc(N, sizeof(int));
  for(i=1; i<=N; i++)
    arr[i]=1;
  do{
    for(i=1; i<=N; i++)
        printf("%c", abc[arr[i]-1]);
    printf("\n");
  }
  while(next(arr)!=0);
  getch();
 }

int next(int arr[])
{
 int j=N;
 while(j>0 && arr[j]==M)
    arr[j--]=1;
 if(j>0){
    arr[j]++;
    return 1;
    }
 else return 0;
 }



Время: 20:13