NOmeR1
27.01.2008, 14:24
[ intro ]
Совсем недавно я занялся автореггером, но меня остановила простая капча..
Новый алгоритом расшифровки писать было не охото. Я решил сделать всё гораздо проще.
[ Приспособления ]
[1] => Капча
[2] => Скрипт
[3] => Руки
[ Скрипт ]
Возьмём простую капчу
<?php
$rand = rand(10000,99999);
for($i = 0; $i < 5; $i++)
{
$arr[$i] = substr($rand, $i, 1);
}
$im = imagecreate(89,20);
imagecolorallocate($im, 34, 34, 34);
$a = 0;
for($i = 0; $i < 5;$i++)
{
$color = imagecolorallocate($im, 255, 255, 255);
imagestring($im, 3, $a += 14, 4, $arr[$i], $color);
}
header("Content-type: image/jpeg");
imagejpeg($im, '', 100);
?>
(c) Isis
Нам нужны будут отличительные особенности каждого символа, поэтому мы переводим картинку капчи в символы _ и #, используя такой код:
<?
$captcha_url = 'http://site/captcha.php'; // Урл капчи
$a = 'img.jpg';
$f = fopen($a, 'w');
fwrite($f, file_get_contents($captcha_url));
fclose($f);
?>
<img src="<?=$a?>"><br><br>
<?
$split = 14; //Расстояние от начала одного символа до начала другого (в пикселях)
$i = imagecreatefromjpeg($a);
$o = imagecreate(imagesx($i), imagesy($i));
for ($n = 0; $n < 256; $n++)
{
imagecolorallocate($o, $n, $n, $n);
}
imagecopy ($o, $i, 0, 0, 0, 0, imagesx ($i), imagesy ($i));
$lim = 256/2;
$stroki = array();
for ($y = 0; $y < imagesy ($o); $y++)
{
$stroka = '';
for ($x = 0; $x < imagesx ($o); $x++)
{
if((imagecolorat($o, $x, $y) & 0xFF)>$lim)
{
$stroka .= "_";
}
else
{
$stroka .= "#";
}
}
array_push($stroki, $stroka);
}
$array = array();
for($i = 0; $i < count($stroki); $i++)
{
array_push($array, array());
foreach(str_split($stroki[$i], $split) as $arr)
{
if(strlen($arr) == $split)
{
array_push($array[$i], $arr);
}
}
}
for($k = 0; $k < count($array[0]); $k++)
{
for($pict = '', $i = 0; $i<count($array); $i++)
{
$pict .= $array[$i][$k]."\n";
}
echo(nl2br($pict."\n\n\n"));
}
?>
Как видно - изменять здесь нужно только 2 переменные: $captcha_url и $split.
Теперь необходимо состаить функцию, которая определит, что это за символ.
Как видно, первый символ - пустой, состоит из 20-ти таких строчек:
##############
Поэтому код будет выглядеть так:
if(substr_count($picture,"##############") == 20){return NULL;}
Займёмся цифрой 0 (да, да, и такая есть).
if(substr_count($picture, "___#__") == 1 ){return 0;}
Потому что у неё одной строка ___#__ встречается 1 раз.
У цифры 1 - ##__########## повторяется 5 раз, поэтому и код будет таким
if(substr_count($picture, "##__##########") == 5){return 1;}
И так далее к каждому символу свой код.
И вот, у нас получилась функция для расшифровки капчи.
function what_pictured($picture)
{
if(substr_count($picture,"##############") == 20){return NULL;}
elseif(substr_count($picture, "___#__") == 1 ){return 0;}
elseif(substr_count($picture, "##__##########") == 5){return 1;}
elseif(substr_count($picture, "#__###########") == 1){return 2;}
elseif(substr_count($picture, "####__########") == 3 && substr_count($picture, "#____#########") == 3){return 3;}
elseif(substr_count($picture, "#__#__########") == 1){return 4;}
elseif(substr_count($picture, "####__########") == 2){return 5;}
elseif(substr_count($picture, "#____#########\n__##__########\n__############") == 1){return 6;}
elseif(substr_count($picture, "#__###########") == 2){return 7;}
elseif(substr_count($picture, "__##__########") == 5){return 8;}
else{return 9;}
}
Теперь просто-напросто добавляем в PHP скрипт выше эту функцию (в самый верх) и изменяем echo(nl2br($pict."\n\n\n")); на echo(what_pictured($pict));
[ Итог ]
Подводя итог можно сказать, что этот метод не всегда точен и работает только на простых капчах, но он прост. Я думаю, каждый разберётся, что к чему.
P.S. Получившийся код можете смотреть тут (http://hax0r.in/captcha.txt)
P.P.S. Обо всех ошибках прошу сообщать в этой теме или в личку.
Совсем недавно я занялся автореггером, но меня остановила простая капча..
Новый алгоритом расшифровки писать было не охото. Я решил сделать всё гораздо проще.
[ Приспособления ]
[1] => Капча
[2] => Скрипт
[3] => Руки
[ Скрипт ]
Возьмём простую капчу
<?php
$rand = rand(10000,99999);
for($i = 0; $i < 5; $i++)
{
$arr[$i] = substr($rand, $i, 1);
}
$im = imagecreate(89,20);
imagecolorallocate($im, 34, 34, 34);
$a = 0;
for($i = 0; $i < 5;$i++)
{
$color = imagecolorallocate($im, 255, 255, 255);
imagestring($im, 3, $a += 14, 4, $arr[$i], $color);
}
header("Content-type: image/jpeg");
imagejpeg($im, '', 100);
?>
(c) Isis
Нам нужны будут отличительные особенности каждого символа, поэтому мы переводим картинку капчи в символы _ и #, используя такой код:
<?
$captcha_url = 'http://site/captcha.php'; // Урл капчи
$a = 'img.jpg';
$f = fopen($a, 'w');
fwrite($f, file_get_contents($captcha_url));
fclose($f);
?>
<img src="<?=$a?>"><br><br>
<?
$split = 14; //Расстояние от начала одного символа до начала другого (в пикселях)
$i = imagecreatefromjpeg($a);
$o = imagecreate(imagesx($i), imagesy($i));
for ($n = 0; $n < 256; $n++)
{
imagecolorallocate($o, $n, $n, $n);
}
imagecopy ($o, $i, 0, 0, 0, 0, imagesx ($i), imagesy ($i));
$lim = 256/2;
$stroki = array();
for ($y = 0; $y < imagesy ($o); $y++)
{
$stroka = '';
for ($x = 0; $x < imagesx ($o); $x++)
{
if((imagecolorat($o, $x, $y) & 0xFF)>$lim)
{
$stroka .= "_";
}
else
{
$stroka .= "#";
}
}
array_push($stroki, $stroka);
}
$array = array();
for($i = 0; $i < count($stroki); $i++)
{
array_push($array, array());
foreach(str_split($stroki[$i], $split) as $arr)
{
if(strlen($arr) == $split)
{
array_push($array[$i], $arr);
}
}
}
for($k = 0; $k < count($array[0]); $k++)
{
for($pict = '', $i = 0; $i<count($array); $i++)
{
$pict .= $array[$i][$k]."\n";
}
echo(nl2br($pict."\n\n\n"));
}
?>
Как видно - изменять здесь нужно только 2 переменные: $captcha_url и $split.
Теперь необходимо состаить функцию, которая определит, что это за символ.
Как видно, первый символ - пустой, состоит из 20-ти таких строчек:
##############
Поэтому код будет выглядеть так:
if(substr_count($picture,"##############") == 20){return NULL;}
Займёмся цифрой 0 (да, да, и такая есть).
if(substr_count($picture, "___#__") == 1 ){return 0;}
Потому что у неё одной строка ___#__ встречается 1 раз.
У цифры 1 - ##__########## повторяется 5 раз, поэтому и код будет таким
if(substr_count($picture, "##__##########") == 5){return 1;}
И так далее к каждому символу свой код.
И вот, у нас получилась функция для расшифровки капчи.
function what_pictured($picture)
{
if(substr_count($picture,"##############") == 20){return NULL;}
elseif(substr_count($picture, "___#__") == 1 ){return 0;}
elseif(substr_count($picture, "##__##########") == 5){return 1;}
elseif(substr_count($picture, "#__###########") == 1){return 2;}
elseif(substr_count($picture, "####__########") == 3 && substr_count($picture, "#____#########") == 3){return 3;}
elseif(substr_count($picture, "#__#__########") == 1){return 4;}
elseif(substr_count($picture, "####__########") == 2){return 5;}
elseif(substr_count($picture, "#____#########\n__##__########\n__############") == 1){return 6;}
elseif(substr_count($picture, "#__###########") == 2){return 7;}
elseif(substr_count($picture, "__##__########") == 5){return 8;}
else{return 9;}
}
Теперь просто-напросто добавляем в PHP скрипт выше эту функцию (в самый верх) и изменяем echo(nl2br($pict."\n\n\n")); на echo(what_pictured($pict));
[ Итог ]
Подводя итог можно сказать, что этот метод не всегда точен и работает только на простых капчах, но он прост. Я думаю, каждый разберётся, что к чему.
P.S. Получившийся код можете смотреть тут (http://hax0r.in/captcha.txt)
P.P.S. Обо всех ошибках прошу сообщать в этой теме или в личку.