免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 19657 | 回复: 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版主的灌水程序使用,效果更佳!

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
48 [报告]
发表于 2009-11-21 14:44 |只看该作者
CU好像没有地方要用图形验证码吧。

论坛徽章:
0
47 [报告]
发表于 2009-11-17 14:50 |只看该作者
加油楼主写的不错!!

论坛徽章:
0
46 [报告]
发表于 2007-05-22 08:57 |只看该作者
不错

论坛徽章:
0
45 [报告]
发表于 2007-05-16 11:53 |只看该作者
mark

论坛徽章:
0
44 [报告]
发表于 2006-07-06 13:09 |只看该作者
mark一下,想法不错

论坛徽章:
0
43 [报告]
发表于 2006-04-30 17:00 |只看该作者
原帖由 xuzuning 于 2006-1-12 16:39 发表
我用gif动画做验证码,你就破不掉了吧?


没有东西是破不掉的.只能破掉的时间问题.
黑客守则第一条.
呵呵.

论坛徽章:
0
42 [报告]
发表于 2006-04-30 12:30 |只看该作者
为了精化就顶一贴

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-08-10 06:20:00
41 [报告]
发表于 2006-04-27 20:26 |只看该作者

好贴!

好贴!

论坛徽章:
0
40 [报告]
发表于 2006-04-13 20:12 |只看该作者
hao
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP