PHP: Генератор последовательных слов (чисел)
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
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 вложенных циклов - слишком напряжно и не универсально. Может кто подскажет другой метод?
|
|
|
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<$len;$i++)
{
echo $i."<br>";
.....................
} Причём длинну строки можно задать неявно,как в примере.То есть указав в переменной $len максимальное значение числа.К примеру если $len= 555, мы будем перебирать все числа от 0 до 554.(Т.к. цикл выполняется,пока $i<$len имеет значение true.)То есть чтобы сюда вошли все трёхзначные числа,надо указать $len=1000. Или длинну брутовой строки можно задать напрямую через функцию strlen(). К примеру,чтобы вывести на экран все трёхзначные числа,можно написать такой код: Код $len=3;
for ($i=0;strlen($i)<=$len;$i++)
{
echo $i."<br>";
} Тут в параметре $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<$lim;$i++)
{
echo $arr[$i]."<br>";
} Казалось бы,всё просто.Но данный пример выводит только элементы массива.А нам нужно их комбинировать! Но данная проблема легко решается с помощью вложенных циклов.То есть во втором цикле нам нужно сделать следующие:1)повторить проход по массиву,сделанный в первом цикле;2)объединить результаты прохода из первого и второго циклов в один.В третьем цикле:1)повторить проход по массиву,сделанный в первом цикле;2)объединить результаты прохода из третьего цикла с объединёнными результатами из первого и второго цикла во втором цикле.И так дале….=) Количество циклов соответствует количеству символов в строке брута.Вот это всё на языке PHP: Код /*1-ый цикл*/ for($i1=0;$i1<$lim;$i1++)
{
$a1=$arr[$i1]; #проход по массиву
/*2-ой цикл*/ for($i2=0;$i2<$lim;$i2++)
{
$a2=$arr[$i2]; #1)повторить проход по массиву,сделанный в первом цикле
$a3=$a1.$a2; #2)объединить результаты прохода из первого и второго циклов в один.
/*3-ий цикл*/ for($i3=0;$i3<$lim;$i3++)
{
$a4=$arr[$i3]; #1)повторить проход по массиву,сделанный в первом цикле
$a5=$a3.$a4; # 2)объединить результаты прохода из третьего цикла с объединёнными
# результатами из первого и второго цикла во втором цикле.
/*4-ый цикл*/ for($i4=0;$i4<$lim;$i4++)
{
$a6=$arr[$i4]; #.............................
$a7=$a5.$a6; #..............................
/*5-ый цикл*/ for($i5=0;$i5<$lim;$i5++)
{
$a8=$arr[$i5]; #...............................
$a9=$a7.$a8; #..............................
.....................
}
}
}
}
}
И таких однообразных операций может быть сколько угодно.В завимости от количества символов в строке для подбора. В моём примере я взял 5 циклов.То есть мой словарь будет иметь значения от "aaaaa" до "ddddd".Вместа многоточия в 5-ом цикле должны быть операторы действий над нашей строкой.Это может быть всё что угодно.К примеру вывод в браузер: Код echo $a9."<br>"; Или вывод в фаил: Код $file=fopen ("C:\Sites\home\localhost\www\dict\brut.txt","a+");
$string=$param2."\n";
fwrite($file,$string);
fclose($file);
echo "Удачно добавлена строка ".$param2;
echo " в фаил <a href=\"$DOCUMENT_ROOT/dict/brut.txt\">";
echo "brut.txt</a><br>"; Только желательно открывать и закрывать фаил до всех циклов,а запись производить внутри последнего. Ну в общем то и всё.Теперь соберём воедино всё вышесказанное в один скрипт: Код <html>
<head>
<title>Brut_force!</title>
</head>
<body>
<?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<$lim;$i1++) #
{ #
$a1=$arr[$i1]; #
/*2-ой символ*/ for($i2=0;$i2<$lim;$i2++) #
{ #
$a2=$arr[$i2]; #
$a3=$a1.$a2; #
/*3-ий символ*/ for($i3=0;$i3<$lim;$i3++) #
{ #
$a4=$arr[$i3]; #
$a5=$a3.$a4; #
/*4-ый символ*/ for($i4=0;$i4<$lim;$i4++) #
{ #
$a6=$arr[$i4]; #
$a7=$a5.$a6; #
/*5-ый символ*/ for($i5=0;$i5<$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 " в фаил <a href=\"$DOCUMENT_ROOT/dict/brut.txt\">"; #
echo "brut.txt</a><br>"; #
-------------------------------------------- #
*/ #
/*Вывод строки*/ echo $a9."<br>"; #
/*-----------------------------------------*/ #
} #
} #
} #
} #
} #
/*-------------------------------------------------------------------------------------*/
// made by a6y #
/*-------------------------------------------------------------------------------------*/
?>
</body>
</html> Данный метод имеет название иттерационного. Казалось бы,что ещё надо=)))))Но данный способ имеет свои недостатки: 1)Фиксированная длинна строки.То есть если нам надо перебрать символы от "aa" до "dddddd",то придётся писать кучу таких вложенных циклов под каждую длину строки. 2)Если в строке,к примеру,25 символов,то написание такого скрипта станет тяжёлой задачей,так как заколебёшся вставлять эти циклы и править переменные. Но из любой ситуации есть выходПопробуем написать рекурсивную функцию,которая которая будет делать то же самое,что и в итеррационном методе.Рекурсивные функции - это функции,выывающие сами себя. Для начала повторим первый цикл из итеррационного метода. Код for($i1=0;$i1<$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<$lim;$i++)
{
$a2=$arr[$i];
$param2=$param1.$a2;
if (strlen($param2)<$len)
recurs($arr,$param2,$len);
echo $param2."<br>";
}
} Теперь принцип действия функции.Она вызывается с входным параметром $param1. В ней повторяется итерация: Код for($i=0;$i<$lim;$i++)
{
$a2=$arr[$i];
.............
} Полученная строка при итерации объединяняется с входной строкой: Код $param2=$param1.$a2;
И если длинна объединённой строки меньше заданной,то функция вызывается ещё раз, но уже со входным параметром $param2(который яв-ся результатом объединения первого входного параметра с итерацией)Таким образом как бы "припаивается" ещё один символ к строке. Код if (strlen($param2)<$len)
recurs($arr,$param2,$len); По достижении условия Код strlen($param2)<$len функция перестаёт вызывать саму себя,и возвращает управление экземпляру,вызвавшему её.Происходит как бы поочерёдный "прогон" всех символов по циклу. И последние штрихи.При переходе "прогона" от символа к символу происходит выпадание символа из переменной $param2.Чтобы отсеч ненужные строки с выпавшими символами используем конструкцию: Код if (strlen($param2)==$len)
echo $param2."<br>"; И добавим ещё один цикл с while для изменения переменной $len. (это даст нам возможность выводить строки в диапазоне от "aa" до нужной нам длинны) Ну вот наверное и всё….Теперь соберём всё а программу: Код <html>
<head>
<title>Brut_force!</title>
</head>
<body>
<?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<$lim;$i++) #
{ #
$a2=$arr[$i]; #
$param2=$param1.$a2; #
if (strlen($param2)<$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 " в фаил <a href=\"$DOCUMENT_ROOT/dict/brut.txt\">"; #
echo "brut.txt</a><br>"; #
} #
*/ #
#-------------------------------------------- #
/*Вывод строки*/ echo $param2."<br>"; #
#
} #
} #
/*-------------------------------------------------------------------------------------*/
//Тело программы: #
$len=0;//Ставим начальный счётчик длинны на 0. #
while ($len<$length) #
{ #
$len++; #
for($i1=0;$i1<$lim;$i1++) #
#
{ #
$a1=$arr[$i1]; #
recurs($arr,$a1,$len); #
} #
} #
/*-------------------------------------------------------------------------------------*/
// made by a6y #
/*-------------------------------------------------------------------------------------*/
?>
</body>
</html> Вот так 25 строк чистого кода решают сложную задачу брута)))
|
|
|
RE: PHP: Генератор последовательных слов (чисел) - 2010-01-23 16:07:08.886666
|
|
|
Pashkela
Сообщений: 3756
Оценки: 736
Присоединился: 2007-01-03 06:19:40.900000
|
<?
// Функция для генерации
// $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<=$TO;$n++)
{
$eval .='for ($'.chr(96+$n).'='.(($n-$TO+$FROM>=1) ? '1' : '0').';$'.chr(96+$n).'<'.$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 . "<br>";'; # вывести на экран
gen(FROM,TO,$todo);
?>
https://forum.antichat.net/showpost.php?p=1030629&postcount=7414
|
|
|
RE: PHP: Генератор последовательных слов (чисел) - 2010-01-23 17:17:30.203333
|
|
|
Parano1d
Сообщений: 423
Оценки: 0
Присоединился: 2008-05-21 13:40:17.093333
|
это делается очень просто, надо использовать рекурсию
|
|
|
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 < $len; $i ++) {
echo $letters[$char_indices[$i]];
}
echo "\n";
}
$last = 0;
$str[0] = 0;
while ($last <= $max_len) {
// ищем символ который надо менять:
for ($i = $last; $i >= 0; $i --) {
str[$i] ++; // поменяем последний символ
if ($str[$i] <= N) { // у нас получилась корректная строка?
add_string ($str, $last + 1); // выведем её
break; //и закончим цикл
} else { // $str[i] > N -- строка оказалась неудачной, номер символа великоват...
$str[i] = 0; // обнулим его, и на следующей итерации будем менять предыдущий
}
}
if ($i == 0 && $str[$i] == 0) { // если мы поменяли все числа в $str на ноль
$str[++$last] = 0; // значит нам пора увеличивать длину строки, или мы начнём повторяться
}
} //если не работает – сорри, на пхп давно не писал, да и интерпретатора в системе почему-то не установлено, так что и проверить не получается. //если не понятно как работает – погоняйте примерчик с цифрами, всё станет ясно Но можно ведь и иначе. Ведь вся операция перехода от одной строки к следующей сильно напоминает добавление 1 к числу, не так ли? Компьютер ведь умеет складывать числа, в частности добавлять 1 к числу, не так ли? Нам лишь останется вывести нужное число в подходящей системе счисления, используя вместо цифр буковки из $letters (а основанием этой системы будет количество буковок в $letters). Правда с одним "но", числа вида 01, 007 не будут появляться в выводе (строчки помеченные *). Но это как-нибудь можно объехать. И самый дубовый способ, который приходит в голову: это добавить в начало $letters символ, который нам не нужен, он будет играть роль нуля, а мы получив следующее число просто не будем ничего выводить, если там в любой позиции появится 0.
|
|
|
RE: PHP: Генератор последовательных слов (чисел) - 2010-01-24 19:23:34.556666
|
|
|
Re.Spawn
Сообщений: 16
Оценки: 0
Присоединился: 2009-06-07 23:59:23.790000
|
Рекурсия помогает перебирать нужные комбинации символов. К примеру, ты знаешь,что пароль из шести символов, и два из них "g8", идущие друг за лругом(подглядел к примеру :). Рекурсивно перебрать все возможные вариенты намного проще (имхо,еси нет,подскажите как :),чем итерационно. А просто составить список можно различными способами. К примеру можно вычитать из счетчика основание ASCII системы,и по количество целых вхождений и остатку формировать строку(тока ща в голову пришло,но лень писать:)Но еси кому надо,сделаю.
|
|
|
|
|