易语言验证码识别源码

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

模拟精灵是首个公开最有效的验证码识别技术的软件,

使用模拟精灵制作了大量的免费、商用群发软件,对很多复杂BT的验证码都能成功的识别。但是验证码仍然需要精湛的技术与足够的耐心。请牢记这一点。

验证码识别不适合浮躁的人去做。

验证码识别是一项特殊的技术,任何一个公开的验证码识别代码都会很快的失效。

因为代码的公开后相关网站都会很快的更改验证码。

所以下面我只会介绍其原理。

在这里讨论验证码识别技术纯粹基于技术研究目的。

公开此技术也是为了让更多的网站采取更有效的防范措施。

禁止任何人利用这里介绍的验证码识别技术滥发垃圾信息。

本文介绍的验证码识别适用于比较复杂的图片验证码,也是大多数网站采用的方法。

有一些网站的验证码极简单,例如在网页中直接显示验证码字符而不是图片,或者图片的文件名直接就是验证码上的字符。

或者有其他规律可循,或者有其他明显的漏洞可以利用(例如通过改写访问验证码页面的源代码使验证码不刷新)。

这一类的验证码识别极其简单,只要熟练掌握web库、element库的函数即可,不需要使用下面介绍的方法。

一、下载验证码样本

打开c:\test文件夹,选“查看缩略图”,

然后重复运行下面的LAScript脚本,每运行一次,就查看c:\test下自动生成的图片,把图片上的字符改为文件名.

例如图片上面显示5,就把文件名改为5.jpg.

如果变化比较复杂的验证码,可以对每个字符多用几个样本,第一个字符为验证码字符,第二个字符可以为任意字符。

例如: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:\\test\\test.jpg") --保存到硬盘

--折分图片,指定一行四列

img2,img3,img4,img5 = img:split(1,4);

img2:save("c:\\test\\0001.jpg")

img3:save("c:\\test\\0002.jpg")

img4:save("c:\\test\\0003.jpg")

img5:save("c:\\test\\0004.jpg")

image.del(img);

如何确定图片后缀名

在整个验证码识别过程中,格式与后缀名一定不能搞错,否则就会失败。

通常:asp的验证码是bmp格式,php的验证码是png格式,其他验证码很多是jpg格式。简单的,在验证码上右键点选“图片另存为”,就可以看到格式(不一定准确)。

另外,你可以用UltraEdit等以二进制方式打开看文件头部

首先下载:

str = 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源代码最后面的「数据区块」中看到生成的验证码样本了。

将「数据区块」的内容复制需要使用验证码识别的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)then --如果元素键名不是两位字符

tkey[k.."A" ]=0;

tkey[k.."B" ]=0;

tkey[k.."C" ]=0;

tkey[k]=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 , 0 , 9 , 10);--修剪单个字符

img:median(2);--中值滤波进一步去杂点

tkey[k]= 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脚本区块中即可

相关文档
最新文档