• 您的信息
      • 日期时间
        2025年3月8日 星期六
        【蛇】己卯月丙子日
        乙巳年 二月初九
        妇女节
        您的信息
        您的IP:
        3.145.109.147
        操作系统:
        未知操作系统
        浏览器:
        未知浏览器
        分辨率:
        1280x720
        位置:
        缂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽幃銏ゅ礂鐏忔牗瀚介梺璇查叄濞佳勭珶婵犲伣锝夘敊閸撗咃紲闂佺粯鍔﹂崜娆撳礉閵堝洨纾界€广儱鎷戦煬顒傗偓娈垮枛椤兘骞冮姀銈呯閻忓繑鐗楃€氫粙姊虹拠鏌ュ弰婵炰匠鍕彾濠电姴浼i敐澶樻晩闁告挆鍜冪床闂備胶绮崝锕傚礈濞嗘挸绀夐柕鍫濇缁♀偓闂侀€炲苯澧繛鐓庣箻閸╋繝宕掗妶鍡欑◥闂傚倷绀佸﹢閬嶅磿閵堝钃熼柨鐔哄Т绾惧鏌熼崜褏甯涢柡鍛叀楠炴牜鍒掗崗澶婁壕闁圭粯甯╁Λ婊呯磽閸屾艾鈧兘鎮為敂鑺ユ珷閹兼番鍔岄悿鐐節婵犲倹鍣虹€规洖寮剁换娑㈠箣閻戝洣绶甸梺鍝ュ枎閹冲繘濡甸崟顖氱睄闁搞儜鍐╁劒闂備胶鍎甸弲娑㈡煀閿濆钃熸繛鎴欏灩鍞梺鎸庢濡嫰宕径濞炬斀妞ゆ梻銆嬫Λ姘箾閸滃啰绉€规洜濞€瀵粙顢橀悙鎻掔ギ闂備胶绮ú鎴犳媼閺屻儱纾婚柟鎹愵嚙楠炪垺绻涢幋鐐垫噮闁告ɑ鎮傚娲川婵犱胶绻侀梺鍝ュУ瀹€鎼佸箚瀹€鍕闁规儳褰夌花濠氭⒑闂堟盯鐛滅紒杈ㄦ礋楠炲﹪宕堕埞鎯т壕婵炲牆鐏濆▍姗€鏌涢敐蹇曞埌闁伙絿鍏橀獮鎺楀箣閺傝法澧梻浣告啞缁矂宕导瀛樷拻妞ゆ牗绋撶弧鈧梺姹囧灲濞佳勭閳哄懏鐓欐繛鑼额唺缁ㄧ晫鈧灚婢橀敃顏堝箠閻愬搫唯鐟滃繗銇愰悙顒傜瘈闁汇垽娼у瓭濠电偛鐪伴崐妤佺珶閺囥垹閿ゆ俊銈勮兌閸樼敻姊虹憴鍕靛晱闁哥姵鐗犻妴鍌涚附閸涘﹦鍘介梺瑙勫劤瀹曨剟宕濆⿰鍛<缂備焦岣垮ú瀛橆殽閻愬樊鍎旈柟顔界懇瀹曞綊顢曢姀锛勫将缂傚倸鍊搁崐椋庢媼閺屻儱纾婚柟鐐墯閻斿棝鏌ら幖浣规锭濠殿喖鐗撻弻锝夊箻瀹曞洨顔掗梺鍝勬湰閻╊垱淇婇悜鑺ユ櫜闁告侗鍙庨悗鍐测攽閻樻剚鍟忛柛鐘崇墱缁棃鎮介幖鐐╁亾閸愵喖唯闁冲搫鍊搁埀顒傚厴閺屸剝寰勭€n亞浠搁柣鐘叉川閸嬫稖鐏冮梺缁橈耿濞佳勭閿曗偓閻f繈鏁愰崨顔间淮闂佺硶鏂侀崑鎾愁渻閵堝棗绗傞柤鍐茬埣閸╁﹪寮撮姀锛勫弳闂佸搫娲﹂〃鍡椻枍閸℃瑧纾奸柛灞剧☉缁椻晜銇勯敃渚囨綈闁逛究鍔嶇换婵嬪磼閵堝洤鎮戦柣搴ゎ潐濞叉ḿ鏁幒妤€鐓濋幖娣妼缁犳稒銇勯弬鎸庢儓濞寸姵甯掗埞鎴︽偐閸偅姣勯梺绋款儐閻╊垵妫熼梺鍝勵槹閿涙洖煤椤忓懎浜滄俊鐐差儏鐎涒晛鈻撴ィ鍐┾拺閻熸瑥瀚崝璺衡攽椤斿搫鈧繂顕i幓鎺嗘斀閻庯綆鍋嗛崢閬嶆煟韫囨洖浠ч柛瀣崌閹啴骞嬮悙顏冪盎闂佸搫鍊圭€笛囁夐姀鈩冨弿濠电姴鎳忛鐘绘煙閻熸澘顏┑鈩冩倐婵$兘鏁傞幆褏绋堥梻鍌氬€烽懗鍫曞箠閹捐鍚归柡宥庡幖缁狀垶鏌ㄩ悤鍌涘 Amazon EC2闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劌銈搁弻鐔兼儌閸濄儳袦闂佸搫鐭夌紞渚€銆佸鈧幃娆撳箹椤撶噥妫ч梻鍌欑窔濞佳兾涘▎鎴炴殰闁圭儤顨愮紞鏍ㄧ節闂堟侗鍎愰柡鍛叀閺屾稑鈽夐崡鐐差潻濡炪們鍎查懝楣冨煘閹寸偛绠犻梺绋匡攻椤ㄥ棝骞堥妸鈺傚€婚柦妯侯槺閿涙盯姊虹紒妯哄闁稿簺鍊濆畷鎴犫偓锝庡枟閻撶喐淇婇婵嗗惞婵犫偓娴犲鐓冪憸婊堝礂濞戞碍顐芥慨姗嗗墻閸ゆ洟鏌熺紒銏犳灈妞ゎ偄鎳橀弻宥夊煛娴e憡娈查梺缁樼箖濞茬喎顫忕紒妯诲闁芥ê锛嶉幘缁樼叆婵﹩鍘规禍婊堟煥閺冨浂鍤欓柡瀣ㄥ€楃槐鎺撴綇閵婏富妫冮悗娈垮枟閹歌櫕鎱ㄩ埀顒勬煃闁款垰浜鹃梺褰掝棑缁垳鎹㈠☉娆愮秶闁告挆鍛呮艾鈹戦悙鍙夊珔缂傚秳鐒︽穱濠勨偓娑欋缚缁♀偓闂佹悶鍎崝搴ㄥ储闁秵鈷戦悷娆忓閸斻倖銇勯弴銊ュ箻缂侇喖顭烽幃娆撴倻濡厧骞嶆俊鐐€栧濠氬磻閹剧粯鍊块柟绋跨昂娴滄粓鏌ㄩ弴妤€浜剧紓鍌氱Т閿曨亜顕f繝姘亜缁炬媽椴搁弲顒€鈹戦瑙掕绂嶉鍕妞ゆ牗顕遍弮鍫熷亹闂傚牊绋愬▽顏嗏偓鍏夊亾闁挎繂鐗婄涵鑸典繆閸欏濮嶆鐐村浮楠炲﹤鐣烽崶褎鐏侀梺璇″枙閸楁娊宕规ィ鍐ㄧ闁告侗鍙庡Λ婊堟⒒閸屾瑧顦﹀鐟帮躬閹繝宕奸妷銉э紱闂佺硶鍓濋悷褎绋夊鍛傛棃鏁愰崨顓熸闂佺粯鎸婚悷鈺呭箖濡ゅ懏鍋ㄩ柣褑顕х紞濠傜暦濠婂牆纭€闁诲繗顕х紞濠囧箖閳╁啯鍎熼柕蹇婃櫆閿涘棝姊绘担鍛婃儓闁活剙銈稿畷浼村箛椤戣偐绱伴棅顐㈡处缁嬫垹绮堥崼銏″枑闊洦绋戝Ч鏌ユ煟濡偐甯涢柍閿嬪灦缁绘盯鎳犳0婵嗘濡ょ姷鍋為〃鍡涘Φ閸曨垰惟闁靛鍨甸崥顐︽⒑鐠団€虫珯缂佺粯绻堥妴渚€寮撮姀鈩冩珖闂侀€炲苯澧撮柟顔界懄缁绘繈宕堕妸褍甯惧┑鐘垫暩閸婎垶鍩€椤掑嫬纾婚柟鐐灱閺€鑺ャ亜閺傚灝鎮戦柛鐘成戦幈銊︾節閸涱噮浠╃紓浣介哺鐢帟鐏掗柣鐘叉搐瀵泛鈻撻锔解拻濞达絽鎲¢幉绋库攽椤旂偓鏆柟顔ㄥ洦鍋愮€瑰壊鍠栧▓銊︾節閻㈤潧校缁炬澘绉瑰鏌ュ箹娴e湱鍘藉┑鈽嗗灠閻忔繈鎯冮悜妯镐簻闁挎柨鎼慨鍌涙叏婵犲啯銇濇俊顐㈠暙闇夐柕濞垮劤缁夎櫣鈧娲樺ú鐔笺€佸璺虹劦妞ゆ巻鍋撻柣锝囧厴楠炲鏁冮埀顒傜不婵犳碍鍋i柛銉簻缁憋妇绱掗崡鐐靛煟婵﹥妞藉Λ鍐ㄢ槈鏉堫煈鈧棝姊婚崒姘仼閻庢凹鍓熼崺銏ゅ箻閺夋埈鍤ら柣搴㈢⊕鑿ら柟閿嬫そ濮婃椽宕ㄦ繝鍐ㄩ瀺閻熸粍婢橀崯顖滅矉瀹ュ應鏀介柛銉㈡櫇椤旀洟姊洪崨濠勬噧妞ぱ€鍋撻梺鍏兼緲濞硷繝寮诲☉銏犵厸闁稿本绮嶉崚娑樜旈悩闈涗沪閻㈩垱甯熼悘鍐╃箾鏉堝墽鍒伴柟纰卞亰閻涱噣宕奸妷锔规嫼闁荤姴娲╃亸娆戠不閹惰姤鐓曢悗锝庡墮閳诲牊銇勯姀鈥蹭孩妞わ箑缍婇弻娑㈠煘閹傚濠碉紕鍋戦崐鏍暜婵犲洦鍊块柨鏂垮⒔閻棝鎮楅敐搴℃灍闁绘挻鐟﹂妵鍕籍閳ь剟寮告繝姘殌闁秆勵殕閻撴稑霉閿濆毥褰掑汲閿濆洠鍋撶憴鍕閻㈩垱甯¢崺銉﹀緞婵犲孩鍍靛銈嗗坊閸嬫挾绱掗悩鍗炲祮婵﹦绮幏鍛驳鐎n亝顔勭紓鍌欒兌缁垳鏁垾宕囨殾闁硅揪闄勯崑鎰箾閼碱剛甯涢柡鍜佷邯閹嘲饪伴崘顔煎及濡ょ姷鍋涢悧鎾翠繆閹间礁鐓涘ù锝囧皑缁辨煡姊绘担铏瑰笡闁告梹娲熼、姘额敇閵忕姴鍋嶉梻鍌氱墛娓氭銆掓繝姘厪闁割偅绻冮ˉ鐐烘煟閹惧崬鍔﹂柡宀€鍠撻崰濠囧础閻愭澘鏋堥梻浣虹《閺備線宕戦幘鎰佹富闁靛牆妫楃粭鍌炴煠閸愭彃顣崇紒顔碱煼楠炴ḿ绱掑Ο鐓庡箺闂備焦瀵х换鍌毭洪妶澶婂偍閻庢稒锕╁▓浠嬫煟閹邦厽缍戞繛鎼枟椤ㄣ儵鎮欏顔煎壎閻庢鍣崳锝夊春閳ь剚銇勯幒鎴濐伒缂傚秵鐗滈埀顒€绠嶉崕閬嶅箠婢舵劕缁╅柤鎭掑劘娴滄粓鏌¢崘銊モ偓濠氬箺閸屾稓绠鹃柛顐ゅ枑閳锋劕菐閸パ嶈含妞ゃ垺娲熼弫鎰板幢韫囨柨顏哄┑鐘殿暯閳ь剙鍟跨痪褔鏌涢弮鈧悷鈺侇嚕椤愶箑绠荤紓浣股戝▍銏ゆ⒑鐠恒劌娅愰柟鍑ゆ嫹
        您的天气
          正在获取信息 ...
随笔 - 3461, 文章 - 0, 评论 - 739, 阅读 - 1200万
  管理

利用JavaScript破解验证码

Posted on   lzhdim  阅读(837)  评论(1编辑  收藏  举报

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

  现在,Megaupload站点提供的CAPTCHA在上述代码面前已经败下阵来,说实话,这里的验证码设计的不不太好。但更有趣的是:

  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%正确性(不知道如果在开始的时候不将字母转换成矩形,是不是可以提高评分的精度),但这已经相当好了,至少对于当前的用途来说是这样。而且所有的操作都是在基于标准的客户端技术实现的浏览器中完成的!

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

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2025年3月8日 星期六 【蛇】己卯月丙子日 乙巳年 二月初九 妇女节
您的IP:3.145.109.147,操作系统:未知操作系统,浏览器:未知浏览器
Copyright (C) 2000-2025 Lzhdim Software All Rights Reserved
点击右上角即可分享
微信分享提示