信息来源:邪恶八进制信息安全团队(
www.eviloctal.com)
文章作者:icexiaoye
题目忽悠了点,其实,是这么回事情,老婆申请了校内网(xiaonei.com),然后看看自己,觉得人气不够高,想到刷人气,然后把,一个人分析了半天,得出了,要刷人气,只要自己多看看别人的页面,那么,你就会出现在别人页面里“最近谁看过XX的页面”,然后别人肯定会回过来看你的页面,于是就为自己增加了一点人气。
于是乎,我家可爱的团子,操起delphi开始写程序,前面代码部分倒不难,实现个登录页面,自动浏览页面就OK了,然后发现个问题,就是访问100个页面后,会跳出来要求输入验证码,这下团子傻眼了,来问我,我本着偷懒的精神,在网上找了下,发现关于验证码部分的代码真的很少,而且比较不通用,要么太复杂,对于校内这样简单的验证码,完全是因为太过于复杂二无法读出简单的东东
罗嗦了一大堆,开始吧
验证码地址
http://xiaonei.com/RandImageServ ... p;rnd=1191388205304
大家刷新下可以看到不同的验证码
很明显滴说,验证码还是相对比较简单的,没什么倾斜角,没什么噪点,清清楚楚的白字黑底
随便下载几个验证码,在本地用画图板打开
看到我圈出来的数字米,5是纵坐标,3是横坐标
OK,我们用PS打开看看,顺便做几条辅助线更清楚鸟
看到米
(记得放大1600%后再看哈)
我们要读取验证码,采用的原理是选择几个特殊定位点,才确定那个字符是数字几
(- -!总觉得网上用的什么二制化后然后用字典太麻烦了,还要考虑容错)
解释下哈我
我们把第一位是0-9的验证码放一竖排,然后拉条辅助线,很明显
在纵坐标5这一列上, 0-9所有的白色点位置是不同,通过找出不同点,很容易就确定出验证码了
说了半天,还是看代码吧
其实很简单的
复制内容到剪贴板
代码:
procedure TForm1.Button1Click(Sender: TObject);
var
c:TGIFImage;
a:tbitmap ;
b1,b2,b3,b4,b5,b6,b7,b8,b9:tcolor;
mstrm : TMemoryStream;
i,z:integer;
y:array [1..4] of string;
yz:string;
begin
mstrm := TMemoryStream.Create();
c:= TGIFImage.Create ;
a := TBitmap.Create ;
IdHttp1.Get(imgurl, mstrm);
mstrm.Position := 0;
c.LoadFromStream(mstrm);
image1.Picture.Assign(c);
a.Assign(c);
for i:=1 to 4 do
begin
z:=8*i-3 ;
b1:=a.Canvas.Pixels[z,3];
b2:=a.Canvas.Pixels[z,4];
b3:=a.Canvas.Pixels[z,5];
b4:=a.Canvas.Pixels[z,6];
b5:=a.Canvas.Pixels[z,7];
b6:=a.Canvas.Pixels[z,8];
b7:=a.Canvas.Pixels[z,9];
b8:=a.Canvas.Pixels[z,10];
b9:=a.Canvas.Pixels[z,11];
if (colorToString(b1)='clBlack') and (colorToString(b3)='clBlack') and (colorToString(b7)='clBlack') then
y[i]:='1' ;
if (colorToString(b1)='clWhite') and (colorToString(b8)='clWhite') then
y[i]:='2' ;
if (colorToString(b5)='clWhite') and (colorToString(b7)='clBlack') then
y[i]:='4' ;
if (colorToString(b1)='clWhite') and (colorToString(b2)='clWhite') then
y[i]:='5' ;
if (colorToString(b1)='clWhite') and (colorToString(b5)='clBlack') and (colorToString(b9)='clBlack') then
y[i]:='7';
if (colorToString(b2)='clWhite') and (colorToString(b4)='clBlack') then
y[i]:='8' ;
if (colorToString(b4)='clWhite') and (colorToString(b5)='clBlack') and (colorToString(b2)='clBlack') then
y[i]:='9' ;
if (colorToString(b7)='clWhite') and (colorToString(b8)='clBlack') and (colorToString(a.Canvas.Pixels[z+1,7])='clBlack') then
y[i]:='0' ;
if (colorToString(b7)='clWhite') and (colorToString(b8)='clBlack') and (colorToString(a.Canvas.Pixels[z+1,7])='clWhite') then
y[i]:='6';
if (colorToString(b1)='clWhite') and (colorToString(b2)='clBlack') and (colorToString(b9)='clBlack') and (colorToString(a.Canvas.Pixels[z,12])='clWhite') then
y[i]:='3';
end;
yz:=y[1]+y[2]+y[3]+y[4];
showmessage(yz);
Freeandnil(a);
FreeAndNil(c);
end;越来越发现自己的语言表达能力不行了
至于那些点是怎么确定的,自己拿纸笔,把白色是第几格子,黑色是那些格子一个个列下,然后找出差额就好了
- -!
变量只所以定义的这么乱
纯粹是团子说这样打起来方便点的,大家凑活着看吧
至于说我根本没谈验证码识别
其实,我只是觉得没什么通用的办法,也不太会讲一大堆理论,所以正好自己刚写个,就拿出来说说
欢迎大家拍砖吧