模拟精灵是首个公开最有效的验证码识别技术的软件,
使用模拟精灵制作了大量的免费、商用发软件,对很多复杂BT的验证码都能成功的识别。
但是验证码仍然需要精湛的技术与足够的耐心。请牢记这一点。
验证码识别不适合浮躁的人去做。
验证码识别是一项特殊的技术,任何一个公开的验证码识别代码都会很快的失效。
因为代码的公开后相关网站都会很快的更改验证码。
所以下面我只会介绍其原理。
在这里讨论验证码识别技术纯粹基于技术研究目的。
公开此技术也是为了让更多的网站采取更有效的防范措施。
禁止任何人利用这里介绍的验证码识别技术滥发垃圾信息。
本文介绍的验证码识别适用于比较复杂的图片验证码,也是大多数网站采用的方法。
有一些网站的验证码极简单,例如在网页中直接显示验证码字符而不是图片,或者图片的文
件名直接就是验证码上的字符。
或者有其他规律可循,或者有其他明显的漏洞可以利用(例如通过改写访问验证码页面的源代
码使验证码不刷新)。
这一类的验证码识别极其简单,只要熟练掌握web库、element库的函数即可,不需要使用
下面介绍的方法。
一、下载验证码样本
打开c:\test文件夹,选“查看缩略图”,
然后重复运行下面的LAScript脚本,每运行一次,就查看c:\test下自动生成的图片,把图片
上的字符改为文件名.
例如图片上面显示5,就把文件名改为5.jpg.
如果变化比较复杂的验证码,可以对每个字符多用几个样本,第一个字符为验证码字符,第
二个字符可以为任意字符。
例如:5a.jpg , 5b.jpg , 5c.jpg ...........等等。 
样本多就会识别能力就越强。
img = w();
--下载图像,没有后缀名要显示指定*.bmp格式
img:getURL("www.***/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 源代码
通常:asp的验证码是bmp格式,php的验证码是png格式,其他验证码很多是jpg格式。
简单的,在验证码上右键点选“图片另存为”,就可以看到格式(不一定准确)。
另外,你可以用UltraEdit等以二进制方式打开看文件头部
首先下载:
str = URL("www.***/test.asp")
string.save( str,"c:\\test.bin")
然后用UE打开test.bin看文件头部(第一行)
jpg文件头部有 JFIF 字眼
png文件头部 有 PNG 字眼
gif文件头部有 GIF字眼
如果你搞不清楚,这时候就不要指定后缀名
img:getURL("vwww.***/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 = w();
   
    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]= de( 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脚本区块中即可
--从数据区块读取base64编码的图片数据
codekey = ape:loadTable("验证码样本");
local timg = {}; --这是一个图像数组,用来储存还原后的验证码样本的图片数据
--必须进行一个转换,因为codekey里面只是base64编码的普通字符串,而timg 将是真正
的图片对象(二进制数据)
 
--还原到图片对象
toImage = function(k,v)
    local img = w();
    local str = string.decode( v ,"");--首先进行base64解码,将纯文本转换为二进制
数据
    img:setBytes( str ,"*.jpg");--将二进制数据还原为图像
    timg[k] = 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 chr = "A"; --读取的字符
   
   
        --testimg是一个被包含在函数中的内部函数,作为table.foreach的回调函数,k
参数表示键,v参数表示值
        testimg = function(k,v)
            --调用stXX()函数得出相似度,类似的函数还有stX()
st() 
            local n = imgX:testXX(timg[k]); 
            if(n<limit)then --比较最小相似度
                  limit = n;
                  chr = k.."";
            end;        end;
   
        --遍历timg表,并调用testimg函数
        for k,v in pairs(timg) do 
          testimg(k,v); 
        end;
        return string.left(chr,1); --返回读取到的字符串首字符(如果每个字符有多个
样本)
    end;
   
   
    --修剪图片   
    image.Crop(img, 4 ,3 , 56 ,18 )
    img:bpp(1);
    img:bpp(24);
    --上面的过程必须与下载样本时的代码完全一致。
   
    --使用split函数分割图片
    local img2,img3,img4,img5 = img:split(1,4);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。