Буквенный перебор C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fire64, 18 Jul 2009.

  1. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    подскажите как на C++ сделать цикл с буквенным перебором

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

    если конкретно то хочу сделать полный буквенный перебор как в брутфорсах
     
    #1 fire64, 18 Jul 2009
    Last edited: 18 Jul 2009
  2. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Буду очень признателен, если переформулируешь вопрос ) Я нифига не понял.
    Перебор чего? Что делать с полученными данными? Какой порядок у них? Какие буквы?
     
  3. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    вариантов несколько. дают разную скорость. но вполне оптимизированный по скорости - заводишь массив интов. сколько символов в пароле - столько элементов в массиве. заводишь массив словаря. например получится так

    // 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) + txt_pass;

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



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

    Code:
    #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 на конце. давайте сыграем в игру "допилите сами" =)
     
    #3 Ra$cal, 18 Jul 2009
    Last edited by a moderator: 7 Jul 2013
  4. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Можно по ascii кодам, + удобней будет с разным регистром.

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

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    по аскам удобно только для одной раскладки и регистра. иначе будут плодиться ифы.
    windows.h проинклюден ибо это отдельный прожект в котором клепаю на скорую руку кодесы =) поэтому основные хидеры подрублены и using namespace добавлен=)
     
  6. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Как раз по аски будет удобней, массивы уже по сути есть, просто нужно выбрать необходимый промежуток. А забивать вручную разные регистры/раскладки - это не удобно.
     
  7. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    ну сделай на асках перебор такого словаря:
    a,b,e,g,x,F,K,L,V,2,6,7,0,~,!,^,_,=,)
     
  8. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Я говорил про полный алфавитный перебор, как видишь ТС говорил про A..Z. Т.е. ему хватит перебора 41h..5Ah
     
  9. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    я о другом. просто A-Z легко перечислить инкрементя и сравнивая с 'Z' это да. Но проще все таки сделать универсальный алго. Правда это мое имхо. Но ты пишешь

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

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Code:
    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);
    }
    
     
    #10 slesh, 19 Jul 2009
    Last edited: 19 Jul 2009
  11. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Я написал вот такой индусский код

    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;
                                }

                            }

                        }

                    }

                }

            }

        }

     
    1 person likes this.
  12. \\ChaOs//

    \\ChaOs// Member

    Joined:
    26 Feb 2009
    Messages:
    102
    Likes Received:
    26
    Reputations:
    5
    Какие у вас у всех(почти у всех) трудные методы.
    вот мое:
    Code:
     int i=65,n=90;
     while(i!=n)
     {
    	 std::cout<<char(i)<<std::endl;
     i++;
     }
    Полный перебор со спец. символами:
    Code:
     
     for(int i=32,n=126;i!=n;i++)
     {
    	 std::cout<<char(i)<<std::endl;
     i++;
     }
     
    #12 \\ChaOs//, 19 Jul 2009
    Last edited: 19 Jul 2009
  13. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    fire64
    ппц =)

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

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Ra$cal, согласен код кошмарный
    но он работает, а это главное :)
     
  15. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    на С. Проверки неправильно переданных параметров в функции нет, конечно следовало бы понаставить assert'ов но мне влом.
    Code:
    #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;
    }
     
    #15 bons, 19 Jul 2009
    Last edited: 19 Jul 2009
  16. fker

    fker Member

    Joined:
    26 Nov 2008
    Messages:
    135
    Likes Received:
    64
    Reputations:
    -1
    мой вариантик, медленно правдо генерерует слова(например 10и символьные), но работает и можно подставлять любые символы.

    Code:
      #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;
     }
     
    #16 fker, 20 Jul 2009
    Last edited: 20 Jul 2009
    1 person likes this.
  17. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Копался в старых файлах, нашел ту программу для которой использовал написанный выше код.

    Удалил тот ужас, сделал замену:

    Сначала массив со списком символов

    PHP:
    static char symbols_table36 ] = 
    {
        
    'a''b''c''d''e''f''g''h',
        
    'i''j''k''l''m''n''o''p',
        
    'q''r''s''t''u''v''w''x',
        
    'y''z''0''1''2''3''4''5',
        
    '6''7''8''9'
    };

    затем сам код:

    PHP:
        int countchar atoi(curText.GetBuffer(0));

        
    int charindex 0;

        
    unsigned char tablebuff[512];
        
    memsettablebuff0sizeof(tablebuff) );

        
    char pWordBuff[512];
        
    memsetpWordBuff0sizeof(pWordBuff) );

        while( 
    true )
        {
            if( 
    tablebuff[countchar 1] >= sizeofsymbols_table ) )
            {
                break;
            }

            if( 
    tablebuff[charindex] >= sizeofsymbols_table ) )
            {
                for( 
    int i 0charindex 1i++ )
                {
                    
    tablebuff[i] = 0;
                }


                for( 
    int j charindex 1countcharj++ )
                {

                    
    tablebuff[j]++;

                    if( 
    tablebuff[j] < sizeofsymbols_table ) )
                    {
                        break;
                    }
                    else
                    {
                        
    tablebuff[j] = 0;
                    }
                }

                
    charindex 0;
            }
            else
            {
                for( 
    int j 0countcharj++ )
                {
                    
    pWordBuff[j] = symbols_tabletablebuff[countchar-j-1] ]; //invert order
                
    }

                
    tablebuff[charindex]++;

                
    WorkFuncpWordBuff );
            }
        }
     
  18. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    _________________________