Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

PHP: Генератор последовательных слов (чисел)

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Веб-программинг] >> PHP: Генератор последовательных слов (чисел)
Имя
Сообщение << Старые топики   Новые топики >>
PHP: Генератор последовательных слов (чисел) - 2010-01-23 15:07:20.743333   
Agent Smith

Сообщений: 976
Оценки: 0
Присоединился: 2007-04-10 21:56:49.593333
Для простоты, пускай у нас есть массив букв $leters=array ("a","b","c","d","e","f","g")
Как создать ряд слов вида aa, ab, ac,…, gggggggggggggggg. То есть пытаюсь создать ряд ВСЕХ возможных слов с этими буквами, которые бы имели длину от 2 до 16 букв. И никак не получается. Писать 16 вложенных циклов - слишком напряжно и не универсально. Может кто подскажет другой метод?
Post #: 1
RE: PHP: Генератор последовательных слов (чисел) - 2010-01-23 15:36:46.530000   
Re.Spawn

Сообщений: 16
Оценки: 0
Присоединился: 2009-06-07 23:59:23.790000
Моя статья с другого форума =) Лень править,но суть в ней - то что тебе нужно.

Недавно на одном из хакерских форумов увидел вопрос:
"Как создать с помощью PHP словарь для брута?С цифрами легко,а
вот с буквами никак…".Вот решил маленько по рассуждать на этут тему

Перво наперво цифрыДействительно,тут ничего сложного.Нужно написать
простой цикл for.
Код
for ($i=0;$i&lt;$len;$i++) { echo $i."&lt;br&gt;"; ..................... }
Причём длинну строки можно задать неявно,как в примере.То есть указав
в переменной $len максимальное значение числа.К примеру если $len= 555,
мы будем перебирать все числа от 0 до 554.(Т.к. цикл выполняется,пока $i<$len
имеет значение true.)То есть чтобы сюда вошли все трёхзначные числа,надо указать $len=1000.
Или длинну брутовой строки можно задать напрямую через функцию strlen().
К примеру,чтобы вывести на экран все трёхзначные числа,можно написать такой код:
Код
$len=3; for ($i=0;strlen($i)&lt;=$len;$i++) { echo $i."&lt;br&gt;"; }
Тут в параметре $len уже задаётся количество цифр в строке.

Ну вот.С числами вроде разобрались=)Едем дальше.
Для начала определимя с алфавитом для перебора.Его лучше задать через массив(или считать
из файла в массив).Я задам его напрямую.
Код
$arr[0]="a"; $arr[1]="b"; $arr[2]="c"; $arr[3]="d";
При желании можно задать так
Код
$arr=array("a","b","c","d","e"...);
Так же необходимо записать в переменную количество элементов массива.Ведь оно может измениться,
и каждый раз править его в условии цикла не удобно.Сделаем это с помощью функции count():
Код
$lim=count($arr);
Принцип составления строки для брута такой же,как и с числами.Только вместо чисел мы увеличиваем
индексы элементов массива.То есть цикл выглядит так:
Код
for($i=0;$i&lt;$lim;$i++) { echo $arr[$i]."&lt;br&gt;"; }
Казалось бы,всё просто.Но данный пример выводит только элементы массива.А нам нужно их комбинировать!
Но данная проблема легко решается с помощью вложенных циклов.То есть во втором цикле
нам нужно сделать следующие:1)повторить проход по массиву,сделанный в первом цикле;2)объединить результаты прохода из
первого и второго циклов в один.В третьем цикле:1)повторить проход по массиву,сделанный в первом цикле;2)объединить результаты прохода из третьего цикла с объединёнными результатами из первого и второго цикла во втором цикле.И так дале….=)
Количество циклов соответствует количеству символов в строке брута.Вот это всё на языке PHP:
Код
/*1-ый цикл*/ for($i1=0;$i1&lt;$lim;$i1++) { $a1=$arr[$i1]; #проход по массиву /*2-ой цикл*/ for($i2=0;$i2&lt;$lim;$i2++) { $a2=$arr[$i2]; #1)повторить проход по массиву,сделанный в первом цикле $a3=$a1.$a2; #2)объединить результаты прохода из первого и второго циклов в один. /*3-ий цикл*/ for($i3=0;$i3&lt;$lim;$i3++) { $a4=$arr[$i3]; #1)повторить проход по массиву,сделанный в первом цикле $a5=$a3.$a4; # 2)объединить результаты прохода из третьего цикла с объединёнными # результатами из первого и второго цикла во втором цикле. /*4-ый цикл*/ for($i4=0;$i4&lt;$lim;$i4++) { $a6=$arr[$i4]; #............................. $a7=$a5.$a6; #.............................. /*5-ый цикл*/ for($i5=0;$i5&lt;$lim;$i5++) { $a8=$arr[$i5]; #............................... $a9=$a7.$a8; #.............................. ..................... } } } } }
И таких однообразных операций может быть сколько угодно.В завимости от количества символов в строке для подбора.
В моём примере я взял 5 циклов.То есть мой словарь будет иметь значения от "aaaaa" до "ddddd".Вместа многоточия в
5-ом цикле должны быть операторы действий над нашей строкой.Это может быть всё что угодно.К примеру вывод в браузер:
Код
echo $a9."&lt;br&gt;";
Или вывод в фаил:
Код
$file=fopen ("C:\Sites\home\localhost\www\dict\brut.txt","a+"); $string=$param2."\n"; fwrite($file,$string); fclose($file); echo "Удачно добавлена строка ".$param2; echo " в фаил &lt;a href=\"$DOCUMENT_ROOT/dict/brut.txt\"&gt;"; echo "brut.txt&lt;/a&gt;&lt;br&gt;";
Только желательно открывать и закрывать фаил до всех циклов,а запись производить внутри последнего.
Ну в общем то и всё.Теперь соберём воедино всё вышесказанное в один скрипт:
Код
&lt;html&gt; &lt;head&gt; &lt;title&gt;Brut_force!&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;?php /*-------------------------------------------------------------------------------------*/ //Начальный массив с символами для брута! # /* # При желании можно задать так: # $arr=array("a","b","c","d","e"...); # */ # $arr[0]="a"; # $arr[1]="b"; # $arr[2]="c"; # $arr[3]="d"; # /*-------------------------------------------------------------------------------------*/ //Пересчитываем все элементы массива в переменную $lim # $lim=count($arr); # /*-------------------------------------------------------------------------------------*/ //Тело программы: # /*1-ый символ*/ for($i1=0;$i1&lt;$lim;$i1++) # { # $a1=$arr[$i1]; # /*2-ой символ*/ for($i2=0;$i2&lt;$lim;$i2++) # { # $a2=$arr[$i2]; # $a3=$a1.$a2; # /*3-ий символ*/ for($i3=0;$i3&lt;$lim;$i3++) # { # $a4=$arr[$i3]; # $a5=$a3.$a4; # /*4-ый символ*/ for($i4=0;$i4&lt;$lim;$i4++) # { # $a6=$arr[$i4]; # $a7=$a5.$a6; # /*5-ый символ*/ for($i5=0;$i5&lt;$lim;$i5++) # { # $a8=$arr[$i5]; # $a9=$a7.$a8; # /* # Блок действий с полученным словом. # В данном примере мы просто выврдим его в браузер. # Можно,к примеру,записать все слова в фаил и # получить словарь для брута.Это делается так: # -------------------------------------------- # $file=fopen ("C:\Sites\home\localhost\www\dict\brut.txt","a+"); # $string=$a9."\n"; # fwrite($file,$string); # fclose($file); # echo "Удачно добавлена строка ".$a9; # echo " в фаил &lt;a href=\"$DOCUMENT_ROOT/dict/brut.txt\"&gt;"; # echo "brut.txt&lt;/a&gt;&lt;br&gt;"; # -------------------------------------------- # */ # /*Вывод строки*/ echo $a9."&lt;br&gt;"; # /*-----------------------------------------*/ # } # } # } # } # } # /*-------------------------------------------------------------------------------------*/ // made by a6y # /*-------------------------------------------------------------------------------------*/ ?&gt; &lt;/body&gt; &lt;/html&gt;
Данный метод имеет название иттерационного.
Казалось бы,что ещё надо=)))))Но данный способ имеет свои недостатки:
1)Фиксированная длинна строки.То есть если нам надо перебрать символы
от "aa" до "dddddd",то придётся писать кучу таких вложенных циклов под каждую
длину строки.
2)Если в строке,к примеру,25 символов,то написание такого скрипта станет тяжёлой
задачей,так как заколебёшся вставлять эти циклы и править переменные.
Но из любой ситуации есть выходПопробуем написать рекурсивную функцию,которая
которая будет делать то же самое,что и в итеррационном методе.Рекурсивные функции -
это функции,выывающие сами себя.
Для начала повторим первый цикл из итеррационного метода.
Код
for($i1=0;$i1&lt;$lim;$i1++) { $a1=$arr[$i1]; ......................
А вот теперь самое время написать нашу функцию.
Для начала обзовём её и определимя с количеством входных параметров:
Код
function recurs($arr,$param1,$len) { ................ }
Имя нашей функции recurs,а входные параметры следующие:
1)$arr - массив,из которого берутся символы
2)$param1 -входная строка.О ней скажу позже.
3)$len -длинна нашей строки(Нужна для организации выхода из рекурсии,иначе функция зациклится)
Теперь о самой функции.Её задача повторить итерацию,и вызвать саму себя,но уже с другим
параметром(как раз тот самый $param1):
Код
function recurs($arr,$param1,$len) { global $lim; for($i=0;$i&lt;$lim;$i++) { $a2=$arr[$i]; $param2=$param1.$a2; if (strlen($param2)&lt;$len) recurs($arr,$param2,$len); echo $param2."&lt;br&gt;"; } }
Теперь принцип действия функции.Она вызывается с входным параметром $param1.
В ней повторяется итерация:
Код
for($i=0;$i&lt;$lim;$i++) { $a2=$arr[$i]; ............. }
Полученная строка при итерации объединяняется с входной строкой:
Код
$param2=$param1.$a2; И если длинна объединённой строки меньше заданной,то функция вызывается ещё раз,
но уже со входным параметром $param2(который яв-ся результатом объединения первого
входного параметра с итерацией)Таким образом как бы "припаивается" ещё один символ к строке.
Код
if (strlen($param2)&lt;$len) recurs($arr,$param2,$len);
По достижении условия
Код
strlen($param2)&lt;$len
функция перестаёт вызывать саму себя,и возвращает
управление экземпляру,вызвавшему её.Происходит как бы поочерёдный "прогон" всех символов
по циклу.
И последние штрихи.При переходе "прогона" от символа к символу происходит выпадание символа из
переменной $param2.Чтобы отсеч ненужные строки с выпавшими символами используем конструкцию:
Код
if (strlen($param2)==$len) echo $param2."&lt;br&gt;";
И добавим ещё один цикл с while для изменения переменной $len.
(это даст нам возможность выводить строки в диапазоне от "aa" до нужной нам длинны)
Ну вот наверное и всё….Теперь соберём всё а программу:
Код
&lt;html&gt; &lt;head&gt; &lt;title&gt;Brut_force!&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;?php /*-------------------------------------------------------------------------------------*/ //Начальный массив с символами для брута! # /* # При желании можно задать так: # $arr=array("a","b","c","d","e"...); # */ # $arr[0]="a"; # $arr[1]="b"; # $arr[2]="c"; # $arr[3]="d"; # /*-------------------------------------------------------------------------------------*/ //Длинна строки брута.То есть если указать 5,то будут перебираться все # //символы от "aa" до "zzzzz". # $length=8; # /*-------------------------------------------------------------------------------------*/ //Пересчитываем все элементы массива в переменную $lim # $lim=count($arr); # /*-------------------------------------------------------------------------------------*/ //Рекурсивная функция: # function recurs($arr,$param1,$len) # { # global $lim; # for($i=0;$i&lt;$lim;$i++) # { # $a2=$arr[$i]; # $param2=$param1.$a2; # if (strlen($param2)&lt;$len) # recurs($arr,$param2,$len); # if (strlen($param2)==$len) # /* # Блок действий с полученным словом. # В данном примере мы просто выврдим его в браузер. # Можно,к примеру,записать все слова в фаил и # получить словарь для брута.Это делается так: # -------------------------------------------- # { # $file=fopen ("C:\Sites\home\localhost\www\dict\brut.txt","a+"); # $string=$param2."\n"; # fwrite($file,$string); # fclose($file); # echo "Удачно добавлена строка ".$param2; # echo " в фаил &lt;a href=\"$DOCUMENT_ROOT/dict/brut.txt\"&gt;"; # echo "brut.txt&lt;/a&gt;&lt;br&gt;"; # } # */ # #-------------------------------------------- # /*Вывод строки*/ echo $param2."&lt;br&gt;"; # # } # } # /*-------------------------------------------------------------------------------------*/ //Тело программы: # $len=0;//Ставим начальный счётчик длинны на 0. # while ($len&lt;$length) # { # $len++; # for($i1=0;$i1&lt;$lim;$i1++) # # { # $a1=$arr[$i1]; # recurs($arr,$a1,$len); # } # } # /*-------------------------------------------------------------------------------------*/ // made by a6y # /*-------------------------------------------------------------------------------------*/ ?&gt; &lt;/body&gt; &lt;/html&gt;
Вот так 25 строк чистого кода решают сложную задачу брута)))
Post #: 2
RE: PHP: Генератор последовательных слов (чисел) - 2010-01-23 16:07:08.886666   
Pashkela

Сообщений: 3756
Оценки: 736
Присоединился: 2007-01-03 06:19:40.900000
&lt;? // Функция для генерации // $FROM, $TO - Начальное / Конечное количество символов // $todo - Что делать со словом // $alfa - Алфавит для генераци, нулевой элемент ДОЛЖЕН быть пустой строкой, иначе заменяется на нее function gen($FROM, $TO , $todo, $alfa=array("","a", "b", "c", "d", "e", "f", "g")) { $alfa=array_values($alfa); $alfa[0]=""; $count=count($alfa); $eval=''; $eval2=array(); $slovo=''; for ($n=1;$n&lt;=$TO;$n++) { $eval .='for ($'.chr(96+$n).'='.(($n-$TO+$FROM&gt;=1) ? '1' : '0').';$'.chr(96+$n).'&lt;'.$count.';$'.chr(96+$n).'++) {'."\r\n"; $eval2[]='$alfa[$'.chr(96+$n).']'; } if (eval($eval.'$slovo = '.implode('.',$eval2).'; '.$todo.str_repeat('}',$TO))) return true; else return false; } define(FROM,2); // Начальное количество букв define(TO,4); // Конечное количество букв // Что делать с текущим словом, которое хранится в переменной $slovo // Например запишем в файл $todo='echo $slovo . "&lt;br&gt;";'; # вывести на экран gen(FROM,TO,$todo); ?&gt;
https://forum.antichat.net/showpost.php?p=1030629&postcount=7414
Post #: 3
RE: PHP: Генератор последовательных слов (чисел) - 2010-01-23 17:17:30.203333   
Parano1d

Сообщений: 423
Оценки: 0
Присоединился: 2008-05-21 13:40:17.093333
это делается очень просто, надо использовать рекурсию
Post #: 4
RE: PHP: Генератор последовательных слов (чисел) - 2010-01-24 05:08:22.683333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
Хм, как всё сложно выглядит. На асме проще будет. Это во-первых. А во-вторых: без рекурсии слабо?
Всё ведь элементарно, вот прикинем, что $letters содержит все цифры от 0 до 9, то на выходе нам бы неплохо получить что-то в стиле:0 1 2 ... 9 00 01 ... 09 * 01 02 ... 09 * 10 11... 19 20 ... 29 ... 90 ... 99 001 ... 009 * ... 100 ... 109 Не напоминает операцию ++? Есть конечно отличия – строки помеченные *, – но всё же очень похоже. А алгоритм добавления 1 к числу, я думаю все знают с первого класса. Надо лишь его обобщить слегка на случай, когда различных цифр у нас не 10, а больше.
$letters=array ("a","b","c","d","e","f","g"); // @add_string -- выводит на экран $len символов, из $letters // массив $char_indices содержит номера символов (в $letters) которые надо вывести. function add_string ($char_indices, $len) { for ($i = 0; $i &lt; $len; $i ++) { echo $letters[$char_indices[$i]]; } echo "\n"; } $last = 0; $str[0] = 0; while ($last &lt;= $max_len) { // ищем символ который надо менять: for ($i = $last; $i &gt;= 0; $i --) { str[$i] ++; // поменяем последний символ if ($str[$i] &lt;= N) { // у нас получилась корректная строка? add_string ($str, $last + 1); // выведем её break; //и закончим цикл } else { // $str[i] &gt; N -- строка оказалась неудачной, номер символа великоват... $str[i] = 0; // обнулим его, и на следующей итерации будем менять предыдущий } } if ($i == 0 && $str[$i] == 0) { // если мы поменяли все числа в $str на ноль $str[++$last] = 0; // значит нам пора увеличивать длину строки, или мы начнём повторяться } } //если не работает – сорри, на пхп давно не писал, да и интерпретатора в системе почему-то не установлено, так что и проверить не получается.
//если не понятно как работает – погоняйте примерчик с цифрами, всё станет ясно
Но можно ведь и иначе. Ведь вся операция перехода от одной строки к следующей сильно напоминает добавление 1 к числу, не так ли? Компьютер ведь умеет складывать числа, в частности добавлять 1 к числу, не так ли? Нам лишь останется вывести нужное число в подходящей системе счисления, используя вместо цифр буковки из $letters (а основанием этой системы будет количество буковок в $letters). Правда с одним "но", числа вида 01, 007 не будут появляться в выводе (строчки помеченные *). Но это как-нибудь можно объехать. И самый дубовый способ, который приходит в голову: это добавить в начало $letters символ, который нам не нужен, он будет играть роль нуля, а мы получив следующее число просто не будем ничего выводить, если там в любой позиции появится 0.
Post #: 5
RE: PHP: Генератор последовательных слов (чисел) - 2010-01-24 19:23:34.556666   
Re.Spawn

Сообщений: 16
Оценки: 0
Присоединился: 2009-06-07 23:59:23.790000
Рекурсия помогает перебирать нужные комбинации символов. К примеру, ты знаешь,что пароль из шести символов, и два из них "g8", идущие друг за лругом(подглядел к примеру :). Рекурсивно перебрать все возможные вариенты намного проще (имхо,еси нет,подскажите как :),чем итерационно. А просто составить список можно различными способами. К примеру можно вычитать из счетчика основание ASCII системы,и по количество целых вхождений и остатку формировать строку(тока ща в голову пришло,но лень писать:)Но еси кому надо,сделаю.
Post #: 6
Страниц:  [1]
Все форумы >> [Веб-программинг] >> PHP: Генератор последовательных слов (чисел)







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.