利用JavaScript破解验证码

【.com 独家翻译】

 

原文:http://ejohn.org/blog/dom-insertadjacenthtml/

 

近日,网上惊现可以破解验证码的JavaScript脚本——GreaseMonkey!由“Shaun Friedle”开发的这段脚本可以轻松搞定Megaupload站点的CAPTCHA。如果您不相信的话,可以到http://herecomethelizards.co.uk/mu_captcha/亲自尝试一下!

 

现在,Megaupload站点提供的CAPTCHA在上述代码面前已经败下阵来,说实话,这里的验证码设计的不不太好,下面给出一些例子:

图1

但是,更有趣的是:

1.HTML 5中的Canvas应用程序接口getImageData可以用来从验证码图像中取得像素数据。利用Canvas,我们不仅可以将一个图像嵌入一个画布中,而且之后还可以再从中重新提取出来。

2.上述的脚本中包含一个完全使用JavaScript实现的神经网络。

3.使用Canvas从图像中提取出像素数据后,将其送入神经网络,通过一种简单的光学字符识别技术来推测验证码中到底使用了哪些字符。

通过阅读源代码,我们不仅可以更好地理解其工作原理,也可以领会这个验证码究竟是如何实现的。就像前面看到的那样,这里使用的验证码不是很复杂——每个验证码有三个字符组成,每个字符使用一种不同的颜色,并且只使用26个字母中的字符,而所有字符都使用同一种字体。

第一步的用意很明显,那就是把验证码拷贝到画布上,并且把它转化为灰度图。

function convert_grey(image_data){

  for (var x = 0; x < image_data.width; x++){

    for (var y = 0; y < image_data.height; y++){

      var i = x*4+y*4*image_data.width;

      var luma = Math.floor(image_data.data[i] * 299/1000 +

        image_data.data[i+1] * 587/1000 +

        image_data.data[i+2] * 114/1000);

 

      image_data.data[i] = luma;

      image_data.data[i+1] = luma;

      image_data.data[i+2] = luma;

      image_data.data[i+3] = 255;

    }

  }

}

 

然后,将画布分成三个单独的像素矩阵,每个矩阵包含一个字符。这一步实现起来非常容易,因为每个字符都使用一种单独的颜色,所以通过颜色就可以将其区分开来。

filter(image_data[0], 105);

filter(image_data[1], 120);

filter(image_data[2], 135);

function filter(image_data, colour){

  for (var x = 0; x < image_data.width; x++){

    for (var y = 0; y < image_data.height; y++){

      var i = x*4+y*4*image_data.width;

 

      // Turn all the pixels of the certain colour to white

      if (image_data.data[i] == colour) {

        image_data.data[i] = 255;

        image_data.data[i+1] = 255;

        image_data.data[i+2] = 255;

    

      // Everything else to black

      } else {

        image_data.data[i] = 0;

        image_data.data[i+1] = 0;

        image_data.data[i+2] = 0;

      }

    }

  }

}

 

最终,所有无关的干扰像素都被剔除出去。为此,可以先查找那些前面或者后面被黑色(未匹配的)像素围绕的白色(匹配过的)像素,然后将匹配过的像素删除即可。

var i = x*4+y*4*image_data.width;

var above = x*4+(y-1)*4*image_data.width;

var below = x*4+(y+1)*4*image_data.width;

 

if (image_data.data[i] == 255 &&

    image_data.data[above] == 0 &&

    image_data.data[below] == 0)  {

  image_data.data[i] = 0;

  image_data.data[i+1] = 0;

  image_data.data[i+2] = 0;

}

 

现在我们已经得到了字符的大约图形,但在将其载入神经网络之前,脚本还会进一步对它进行必要的边缘检测。脚本会寻找图形最左、右、上、下方的像素,并将其转化为一个矩形,接着把矩形重新转换为一个20*25像素的矩阵。

cropped_canvas.getContext(“2d”).fillRect(0, 0, 20, 25);

var edges = find_edges(image_data[i]);

cropped_canvas.getContext(“2d”).drawImage(canvas, edges[0], edges[1],

  edges[2]-edges[0], edges[3]-edges[1], 0, 0,

  edges[2]-edges[0], edges[3]-edges[1]);

 

image_data[i] = cropped_canvas.getContext(“2d”).getImageData(0, 0,

  cropped_canvas.width, cropped_canvas.height);

 

经过上面的处理,我们得到了什么呢? 一个20*25的矩阵,其中包含单个矩形,其中填由黑白色。真是太好了!

然后,会对这个矩形做进一步的简化。我们策略性地从矩阵中提取一些点,作为“光感受器”,这些光感受器将输送到神经网络。举例而言,某个光感受器具体对应的可能是位于9*6位置像素,有像素或者没有像素。脚本会提取一系列这样的状态(远少于对 20*25矩阵整个计算的次数——只提取64种状态),并将这些状态送入神经网络。

您可能要问,为什么不直接对像素进行比较?有必要使用神经网络吗?问题的关键在于,我们要去掉那些模棱两可的情况。如果您试过前面的演示就会发现,直接进行像素比较比通过神经网络比较,更容易出错,尽管出错的时候不多。但我们必须承认,对于大部分用户来说,直接的像素比较应该已经够用了。

下一步就是尝试猜字母了。神经网络中导入了64个布尔值(由其中的一个字符图像获取而来),同时包含一系列预先计算好的数据。神经网络的理念之一,就是我们希望得的结果事先就是知道的,所以我们可以针对结果对神经网络进行相关的训练。脚本作者可以多次运行脚本,并收集了一系列最佳评分,这些评分能帮助倒推出产生它们的那些值,从而帮神经网络猜出答案,除此之外,这些评分没有任何特殊意义。

当神经网络对验证码中一个字母对应的64个布尔值进行计算以后,和一个预先计算好的字母表相比较,然后为和每个字母的匹配都给出一个分数。(最后的结果可能类似:98%的可能是字母A,36%的可能是字母B等。)

当对验证码中的三个字母都经过处理以后,最终的结果也就出来了。需要注意的是,该脚本无法达到100%正确性(不知道如果在开始的时候不将字母转换成矩形,是不是可以提高评分的精度),但这已经相当好了,至少对于当前的用途来说是这样。而且所有的操作都是在基于标准的客户端技术实现的浏览器中完成的!

补充说明一下,这个脚本应该算是一个特例吧,这项技术可能会很好的工作在在其它简陋的验证码上,但对于复杂的验证码来说,就有点鞭长莫及了(尤其是这种基于客户端的分析)。但愿有更多人能从这个项目中受到启发而开发出更奇妙的东西来,因为它的潜力实在是太大了。【.COM 独家翻译,转载请注明出处及译者!】

【编辑推荐】

  1. 黑客入侵全球提款机 10小时盗领逾千万
  2. SQL注入攻击及其防范检测技术研究
  3. 分析ARP病毒是如何利用的Javascript技术的

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/127196.html<

(0)
管理的头像管理
上一篇2025-02-24 13:46
下一篇 2025-02-24 13:48

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注