免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 19598 | 回复: 47
打印 上一主题 下一主题

用php破解chinaunix的验证码图片,已通过测试 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-06 16:54 |只看该作者 |倒序浏览

  1. <?php
  2. /**
  3. * 破解图片验证码
  4. * 一、要求图片没有背景,没有杂点。
  5. * 二、图片上的数字和字母字体大小不随机改变,不扭曲,对颜色没要求
  6. * 三、通过对$charconfig配置的修正,可以让程序学会认识更多的数字和字母。本程序仅以chinaunix.net的数字验证码为例
  7. *
  8. * @author      superspice<AT>yeah.net
  9. */

  10. /* 0-9数字的点阵配置 */
  11. $charconfig = array("9" => array('1,1','1,1,1,1,0,0,1,1','1,1,0,0,1,1,0,0,1,1','1,0,0,0,0,1,0,0,0,1','1,0,0,0,0,1,0,0,0,1','1,1,0,0,1,0,0,0,1,1','1,1,1,1,1,1,1,1','1,1,1,1,1,1'),
  12.                     "8" => array('1,0,0,0,1,1','1,1,1,0,1,1,1,1','1,1,0,1,1,1,0,0,1,1','1,0,0,0,1,0,0,0,0,1','1,0,0,0,1,0,0,0,0,1','1,1,0,1,1,1,0,0,1,1','1,1,1,0,1,1,1,1','1,0,0,0,1,1'),
  13.                     "7" => array('1,0,0,0,0,0,0,0,1,1','1,0,0,0,0,0,0,1,1,1','1,0,0,0,0,0,1,1','1,0,0,0,0,1,1','1,0,0,0,1,1','1,0,0,1,1','1,1,1,1','1,1,1'),
  14.                     "6" => array('1,1,1,1,1,1','1,1,1,1,1,1,1,1','1,1,0,0,0,1,0,0,1,1','1,0,0,0,1,0,0,0,0,1','1,0,0,0,1,0,0,0,0,1','1,1,0,0,1,1,0,0,1,1','1,1,0,0,1,1,1,1','1,1' ),
  15.                     "5" => array('1,1,1,1,1,0,0,1','1,1,1,1,1,0,0,1,1','1,0,0,0,1,0,0,0,1,1','1,0,0,1,0,0,0,0,0,1','1,0,0,1,0,0,0,0,0,1','1,0,0,1,1,0,0,0,1,1','1,0,0,0,1,1,1,1,1','1,1,1'),
  16.                     "4" => array('1,1','1,1,1','1,1,0,1','1,1,0,0,1','1,1,0,0,0,1','1,1,1,1,1,1,1,1,1,1','1,1,1,1,1,1,1,1,1,1','1'),
  17.                     "3" => array('1,0,0,0,0,0,0,1','1,1,0,0,0,0,0,0,1,1','1,0,0,0,0,0,0,0,0,1','1,0,0,0,1,0,0,0,0,1','1,0,0,0,1,0,0,0,0,1','1,1,0,1,1,1,0,0,1,1','1,1,1,0,1,1,1,1','1,0,0,0,1,1'),
  18.                     "2" => array('1,0,0,0,0,0,0,1','1,1,0,0,0,0,0,1,1','1,1,0,0,0,0,0,1,1,1','1,0,0,0,0,0,1,1,0,1','1,0,0,0,0,1,1,0,0,1','1,1,0,0,1,1,0,0,0,1','1,1,1,1,0,0,0,0,1','1,1,0,0,0,0,0,1'),
  19.                     "1" => array('1,0,0,0,0,0,0,1','1,1,0,0,0,0,0,0,1','1,1,1,1,1,1,1,1,1,1','1,1,1,1,1,1,1,1,1,1','1','1'),
  20.                     "0" => array('1,1,1,1','1,1,1,1,1,1','1,1,0,0,0,0,1,1','1,1,0,0,0,0,0,0,1,1','1,1,0,0,0,0,0,0,1,1','1,1,0,0,0,0,1,1','1,1,1,1,1,1','1,1,1,1')
  21. );

  22. /* 定义图片文件名,并根据尺寸遍历整个图片上的所有像素点,生成点阵数组 */
  23. $image = "1317.png";    // 文件名也可以用http://bbs.chinaunix.net/seccode.php这样的url
  24. $size = getimagesize($image);
  25. $im = imagecreatefrompng($image);
  26. $width = $size[0];
  27. $height = $size[1];
  28. for($x = 1; $x < $width; $x ++)
  29. {
  30.    
  31.     $flag[$x] = false;
  32.     for($y = 1; $y < $height; $y ++)
  33.     {
  34.         $color = imagecolorat($im, $x, $y);
  35.         if($color > 0 && $flag[$x] == false)
  36.         {
  37.             $flag[$x] = true;
  38.         }
  39.         if($flag[$x] == true)
  40.         {
  41.             $col[$x][] = $color;
  42.         }
  43.     }
  44. }

  45. /* 去末尾空白 */
  46. foreach($col as $k => $v)
  47. {
  48.     $col[$k] = delbackzero($v);
  49. }

  50. /* 分字,前提是:字符在竖向没有重叠部分 */
  51. $n = 0;
  52. foreach($col as $k => $v)
  53. {
  54.     $tmparray[] = join(",", $v);
  55.     if(is_array($col[$k-1]) && !is_array($col[$k+1]))
  56.     {
  57.         $n ++;
  58.         $char[$n] = $tmparray;   
  59.         $tmparray = array();
  60.     }
  61. }

  62. /* 认字 */
  63. foreach($char as $numorder => $pixelarray)
  64. {
  65.     $thischar .= recog($pixelarray);   
  66. }

  67. /* 输出显示 */
  68. echo $thischar;


  69. /************************************* 以下是函数部分 *******************************/

  70. /**
  71. * 根据字符点阵配置文件认出字符
  72. *
  73. * @author  superspice<AT>yeah.net
  74. * @param   array   $pixelarray   字符块的点阵数组
  75. * @global  array   $charconfig   点阵配置数组
  76. * @return  string                返回字符块点阵对应的字符
  77. */
  78. function recog($pixelarray)
  79. {
  80.     global $charconfig;
  81.     foreach($charconfig as $char => $pixel)
  82.     {
  83.         if($pixel == $pixelarray)
  84.         {
  85.             return $char;   
  86.             break;
  87.         }   
  88.     }   
  89. }


  90. /**
  91. * 去除竖向点阵末尾为空的部分
  92. *
  93. * @author  superspice<AT>yeah.net
  94. * @param   array   $array         竖向宽度为1像素的图片点阵数组
  95. * @return  array                  去除掉末尾连续的空白后的点阵数组
  96. */
  97. function delbackzero($array)
  98. {
  99.     foreach($array as $k => $v)
  100.     {
  101.         $array[$k] = ($v == 0) ? 0 : 1;   
  102.     }
  103.     $count = count($array);
  104.     for($i = $count-1; $i >= 0; $i --)
  105.     {
  106.         if($array[$i] > 0) break;
  107.         if($array[$i] == 0 && $array[$i-1] == 0)
  108.         {
  109.             $zeroarray = array_pop($array);
  110.         }
  111.     }
  112.     $zeroarray = array_pop($array);
  113.     return $array;
  114. }
  115. ?>

复制代码


该程序请配合HonestQiao版主的灌水程序使用,效果更佳!

论坛徽章:
0
2 [报告]
发表于 2006-01-06 17:03 |只看该作者
做的比较简单,换个地方就不能用了,还请见谅!

论坛徽章:
0
3 [报告]
发表于 2006-01-06 17:03 |只看该作者
好象没啥实际意义吧,

图象复杂点,能破吗?

论坛徽章:
0
4 [报告]
发表于 2006-01-06 17:20 |只看该作者
能破,就看点阵配置是否够强了。
点阵配置可以让程序学习增强。

论坛徽章:
0
5 [报告]
发表于 2006-01-06 18:18 |只看该作者
原来一些网站增加图片验证还加杂点是有原因的。
学到东西

论坛徽章:
0
6 [报告]
发表于 2006-01-06 22:01 |只看该作者
强!

论坛徽章:
0
7 [报告]
发表于 2006-01-07 00:53 |只看该作者
楼主的实在太简单了,严重不够用.
不如我这个.
但总的来说,这都是属于对点阵,
据说还有种根据微积分曲线特征来识别的方法,不知哪个大大可以讲一讲,那个才有用,要对付变形的

code.jpg (17.86 KB, 下载次数: 121)

code.jpg

论坛徽章:
0
8 [报告]
发表于 2006-01-07 09:22 |只看该作者
想法不错。。

用英文字母和数字组合就更难破解了

论坛徽章:
0
9 [报告]
发表于 2006-01-07 13:39 |只看该作者
原帖由 gydoesit 于 2006-1-7 00:53 发表
楼主的实在太简单了,严重不够用.
不如我这个.
但总的来说,这都是属于对点阵,
据说还有种根据微积分曲线特征来识别的方法,不知哪个大大可以讲一讲,那个才有用,要对付变形的


使用模版才是最简单的,但是适应性最差。PHP搞这个并不是很好。用C++写最方便

论坛徽章:
0
10 [报告]
发表于 2006-01-08 23:13 |只看该作者
楼主。加油!
谢谢你的成果!
楼主辛辛苦苦做出来不容易
大家应该多鼓励
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP