易语言验证码识别技术带源码.txt

上传人:tbuqq 文档编号:4715964 上传时间:2019-11-30 格式:TXT 页数:9 大小:14.88KB
返回 下载 相关 举报
易语言验证码识别技术带源码.txt_第1页
第1页 / 共9页
亲,该文档总共9页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《易语言验证码识别技术带源码.txt》由会员分享,可在线阅读,更多相关《易语言验证码识别技术带源码.txt(9页珍藏版)》请在三一文库上搜索。

1、模拟精灵是首个公开最有效的验证码识别技术的软件, 使用模拟精灵制作了大量的免费、商用群发软件,对很多复杂BT的验证码都能成功的识别。 但是验证码仍然需要精湛的技术与足够的耐心。请牢记这一点。 验证码识别不适合浮躁的人去做。 验证码识别是一项特殊的技术,任何一个公开的验证码识别代码都会很快的失效。 因为代码的公开后相关网站都会很快的更改验证码。 所以下面我只会介绍其原理。 在这里讨论验证码识别技术纯粹基于技术研究目的。 公开此技术也是为了让更多的网站采取更有效的防范措施。 禁止任何人利用这里介绍的验证码识别技术滥发垃圾信息。 本文介绍的验证码识别适用于比较复杂的图片验证码,也是大多数网站采用的方

2、法。 有一些网站的验证码极简单,例如在网页中直接显示验证码字符而不是图片,或者图片的文件名直接就是验证码上的字符。 或者有其他规律可循,或者有其他明显的漏洞可以利用(例如通过改写访问验证码页面的源代码使验证码不刷新)。 这一类的验证码识别极其简单,只要熟练掌握web库、element库的函数即可,不需要使用下面介绍的方法。 一、下载验证码样本 打开c:test文件夹,选“查看缩略图”, 然后重复运行下面的LAScript脚本,每运行一次,就查看c:test下自动生成的图片,把图片上的字符改为文件名. 例如图片上面显示5,就把文件名改为5.jpg. 如果变化比较复杂的验证码,可以对每个字符多用几

3、个样本,第一个字符为验证码字符,第二个字符可以为任意字符。 例如:5a.jpg , 5b.jpg , 5c.jpg .等等。 样本多就会识别能力就越强。 img = image.new(); -下载图像,没有后缀名要显示指定*.bmp格式 img:getURL(“http:/www.*.com/test.asp“,“*.png“); assert(img:ok(),“下载验证码失败“); img:Crop(4 ,3 , 56 ,18 ) img:save(“c:testtest.jpg“) -保存到硬盘 -折分图片,指定一行四列 img2,img3,img4,img5 = img:split(

4、1,4); img2:save(“c:test0001.jpg“) img3:save(“c:test0002.jpg“) img4:save(“c:test0003.jpg“) img5:save(“c:test0004.jpg“) image.del(img); 如何确定图片后缀名 在整个验证码识别过程中,格式与后缀名一定不能搞错,否则就会失败。 通常:asp的验证码是bmp格式,php的验证码是png格式,其他验证码很多是jpg格式。 简单的,在验证码上右键点选“图片另存为”,就可以看到格式(不一定准确)。 另外,你可以用UltraEdit等以二进制方式打开看文件头部 首先下载: str

5、 = web.getURL(“http:/www.*.com/test.asp“) string.save( str,“c:test.bin“) 然后用UE打开test.bin看文件头部(第一行) jpg文件头部有 JFIF 字眼 png文件头部 有 PNG 字眼 gif文件头部有 GIF字眼 如果你搞不清楚,这时候就不要指定后缀名 img:getURL(“http:/vwww.*.com/test.asp“,“) 这样就可以下载了 二、生成验证码样本数据库 复制下面的代码并粘贴到fap程序的脚本区块内,然后点击“回放运行“,最后再点击“读取源代码“。 你就可以在ApeML源代码最后面的数据区

6、块中看到生成的验证码样本了。 将数据区块的内容复制需要使用验证码识别的fap模拟程序中覆盖数据区块即可。 local tkey =A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0; -在字典中添加所有数字键 for i =0,9,1 do tkey tostring(i) = 0; end; -如果一个字符有多个样本,例如 5A.jpg 5B.jpg 5C.jpg for k,v in pairs(tkey) do if(#k)=2)th

7、en -如果元素键名不是两位字符 tkeyk“A“ =0; tkeyk“B“ =0; tkeyk“C“ =0; tkeyk=nil;-删除单字符的键名 end; end; -k参数为键,v参数表示值 一个典型的tkeyle迭代器回调函数 loadtkey = function(k,v) local img = image.new(); img:load(“C:test“k“.jpg“); assert(img:ok(),“C:test“k“.jpg“n不是有效的图片“); img:bpp(1); img:bpp(24); -通过上面两句,轻松去掉验证码上的杂色杂点 img:Crop( 1 ,

8、0 , 9 , 10);-修剪单个字符 img:median(2);-中值滤波进一步去杂点 tkeyk= string.encode( img:getBytes(“*.jpg“) , “); -因为转换到字符串还是二进制,所以用base64进行编码 image.del(img); end; -遍历表tkey的所有元素,调用loadtkey加载图片文件 for k,v in pairs(tkey) do loadtkey(k,v); end; -把所有图片保存到数据岛, ape:saveTable(tkey,“验证码样本“) 三、验证码识别 将下面的代码添加到fap模拟程序最前面的init脚本区

9、块中即可 -从数据区块读取base64编码的图片数据 codekey = ape:loadTable(“验证码样本“); local timg = ; -这是一个图像数组,用来储存还原后的验证码样本的图片数据 -必须进行一个转换,因为codekey里面只是base64编码的普通字符串,而timg 将是真正的图片对象(二进制数据) -还原到图片对象 toImage = function(k,v) local img = image.new(); local str = string.decode( v ,“);-首先进行base64解码,将纯文本转换为二进制数据 img:setBytes( st

10、r ,“*.jpg“);-将二进制数据还原为图像 timgk = img; end; -载入验证码样本 tkey = ape:loadTable(“验证码样本“); for k,v in pairs(tkey) do -验证样本 toImage(k,v); -转换为图像 end; -转换图片验证码到字符串的函数 function ImgToString(img) function test(imgX) -test是一个被包含在函数中的内部函数 sleep(0); local limit = (60 * 20) + (60 * 20); -最小相似度 local关键字声明为局部变量 local

11、chr = “A“; -读取的字符 -testimg是一个被包含在函数中的内部函数,作为table.foreach的回调函数,k参数表示键,v参数表示值 testimg = function(k,v) -调用image.testXX()函数得出相似度,类似的函数还有image.testX() image.test() local n = imgX:testXX(timgk); if(nw or yh) then return; end; -点的颜色为白色时,返回,不处理。 if(tclxy=16777215) then return; end; -值为1,则计数加1,返回 if ( tchke

12、dxy) then return ; else table.insert(tab,x=x,y=y );-添加到连通线里 tchkedxy=true;-当值为0时,把值置为1。 seed(x+1,y-1,tab); seed(x,y-1,tab); seed(x-1,y-1,tab); seed(x-1,y,tab); seed(x+1,y,tab); seed(x-1,y+1,tab); seed(x,y+1,tab); return seed(x+1,y+1,tab); -这里可以用一个尾调用(参考教程中的函数部份),加快递归的速度。 end; end; - -遍历图像中的所有点 for i

13、=0,w,1 do for j=0,h,1 do -如果是黑色的点,而且没有被计过数,则调用seed函数。 if(tclij=0 and (not tchkedij) then local tab = seed(i,j,tab); table.insert(tlines,tab); -添加一条连通线 end; end; end; -现在tlines 里记录了的有的连通线,我们现在需要根据连通线的长度排序 sproc = function(l,l2) return table.maxn(l) table.maxn(l2);-长的连通线排到前面 end; table.sort(tlines,spr

14、oc) -把图像全部画成白色的点 for i=0,w,1 do for j=0,h,1 do img:setPos( i , j, 16777215); end; end; -然后把最长的一条连通线画上去 for i,point in ipairs(tlines1) do img:setPos( point.x, point.y , 0); end; -如果需要去掉周围的空白 if(crop)then local n = table.maxn(tlines1) -排序最长连通线中的所有坐标点 sproc = function(pt,pt2) return (pt.x pt2.x );-*左的排前面 end; table.sort(tlines1,sproc); local x,x2 = tlines11.x, tlines1n.x; -排序最长连通线中的所有坐标点 sproc = function(pt,pt2) return (pt.y pt2.y );-*上的排前面 end; table.sort(tlines1,sproc); local y,y2 = tlines11.y, tlines1n.y; img:Crop( x,y,x2+1,y2) end; end; J2Q9ES

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1