【RF】验证码的分析与识别[1]
93°2009/02/11软件综合 IP:广东
本人在科创发表的最后一系列文章

自从网络被应用,验证码也应运而生。验证码一般是由字母+数字+随机干扰组成的一幅图片。
人们在WEB或其他地方执行一些如注册、发表文章等操作时,往往要输入验证码,这是为了防止恶意行为。

本文章仅探讨验证码的识别作学习用途

前景与背景的分离方法

58_1_1264512711.png

这是一幅验证码,我们可以观察到,背景十分杂乱,而且有干扰线。
这是为了防止程序去识别它,但是 “凭着RF工作室的智慧” 可以说是轻而易举的

我们还可以观察到,背景与前景的颜色深度不一样——对,这就是关键。
这也就是说,背景的RGB值加起来肯定比前景的要小,这就好办了,我们先创建一个函数

Public Function ColorRGB(ByVal Color As Long) As Long
If Color = -1 Then ColorRGB = 999: Exit Function
Const ByN As Integer = 256
Const ByN2 As Long = 65536
Dim A(2) As Byte
A(0) = (Color Mod ByN)
A(1) = ((Color Mod ByN2) \ ByN)
A(2) = (Color \ ByN2)

ColorRGB = (Color Mod ByN) + ((Color Mod ByN2) \ ByN) + (Color \ ByN2)
End Function

好,我们看到,输入的是VB的颜色值,输出则是该颜色值RGB的总和。

然后我们可以调用这个函数

XXXXXXXXXXXs
XXXXXXXXXXXs
Dim l As Long
For i = 1 To 140 * 15 Step 15
    For j = 1 To 50 * 15 Step 15
    If ColorRGB(Picture1.Point(i, j)) < 560 Then
        l = l + 15
        XXXXXXXXXXXet (i, Picture2.Height - l)
        XXXXXXXXXXXet (i, j)
    End If
    Next
    l = 0
Next

我们看到,这个过程中有两个for循环,不断扫描图片,如果RGB值的总和小于560(180x3)就判断为前景。

这样,前景就被完美地分离出来了。

58_1_1139671021.png

前景与背景分离到此结束

干扰线的去除

但是,问题又来了。我们看到验证码中有随机的线段,这回严重影响验证码的识别工作
我们当然有办法应对。

注意观察两幅图片(线段的局部放大)

58_1_1302318119.png    58_1_1019096673.png

看到了吗?这是单像素的,我们也可以简单地解决掉。

我们再创建一个函数

Public Function ClearLine(ByVal iX As Long, ByVal iY As Long, picInput As PictureBox) As Boolean

Const W_VALUE As Long = 16777215

Dim tmp1, tmp2, tmp3, tmp4 As Long
Dim tmp As Long

If picInput.Point(iX, iY) = W_VALUE Then
    ClearLine = False
    Exit Function
End If

tmp1 = picInput.Point(iX + 15, iY)
tmp2 = picInput.Point(iX - 15, iY)
tmp3 = picInput.Point(iX, iY + 15)
tmp4 = picInput.Point(iX, iY - 15)

If tmp1 = W_VALUE Then tmp = tmp + 1
If tmp2 = W_VALUE Then tmp = tmp + 1
If tmp3 = W_VALUE Then tmp = tmp + 1
If tmp4 = W_VALUE Then tmp = tmp + 1

If tmp > 2 Then
    ClearLine = True
End If

If tmp3 = W_VALUE And tmp4 = W_VALUE Then
    ClearLine = True
End If

End Function

这段代码的作用是,扫描一个像素的上下左右,如果有3个点是白色的,就判断为线段的一部分。

然后我们调用它

Dim i, j As Long

For i = 1 To 140 * 15 Step 15
    For j = 1 To 50 * 15 Step 15

    If ClearLine(i, j, Picture3) Then
        XXXXXXXXXXXet (i, j), 16777215
    End If
    
    Next
Next


如图
58_1_1190603827.png

这样,干扰线也被完美地去除了。

未完待续
+1000  科创币    delete    2009/02/11
+1000  科创币    彼岸江山    2009/02/11 很好,谢老
+1000  科创币    chiataimakro    2009/02/11
+1000  科创币    虎哥    2009/02/11 思路不错。
来自:计算机科学 / 软件综合
35
 
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
y2k
16年1个月前 IP:未同步
74406
頂,,.期待您破解一些極為NB極為XE的验证码 0076.jpg    0079.jpg    0081.jpg    0083.jpg    0089.jpg    0090.jpg
引用
评论(1)
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
16年1个月前 IP:未同步
74579
有没有搞错,这是我发过的最正经的帖子啊
+1
科创币
彼岸江山
2009-02-12
ding
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
fw。
16年1个月前 IP:未同步
74594
顶 [s:251]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
y2k
16年1个月前 IP:未同步
74597
引用第2楼93°于2009-02-12 18:56发表的  :
有没有搞错,这是我发过的最正经的帖子啊


93效應:
[glow=255,red,1]無論帖子內容是啥.都會給水掉....[/glow]
[s:94]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
AnthraX
16年1个月前 IP:未同步
74609
思路不错……但是对于扭曲重合的字符就没办法了……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
16年1个月前 IP:未同步
74628
楼上正确

正在转向delphi中。客户要求

58_3212_1114129532.png
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
AnthraX
16年1个月前 IP:未同步
74633
应该转向C++……虽然我对编程一知半解吧,但是高手们都说c++很nb……

楼主应该继续解释一下是如何识别出斜着的字符的
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
16年1个月前 IP:未同步
74639
参见旋转卡壳算法,迟一些我再介绍。

delphi的兼容性无敌啊。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
AnthraX
16年1个月前 IP:未同步
74642
引用第8楼93°于2009-02-12 22:26发表的  :
参见旋转卡壳算法,迟一些我再介绍。

delphi的兼容性无敌啊。。


没看出来该算法和矫正斜的文字有什么关联……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
16年1个月前 IP:未同步
74799
表示支持……93继续……对代码的解释写的详细一点,对一些数学不好的同学有理解帮助
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
fw。
16年0个月前 IP:未同步
74991
93°来把剩下的发完
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
16年0个月前 IP:未同步
74992
唉唉 。。都没啥人看
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
greatallah
16年0个月前 IP:未同步
75089
矛与盾的故事之现实生活版...
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey
16年0个月前 IP:未同步
75243
最nb最xe的当然是微软的验证码了,是一段语音!

93为什么说这是他在科创发表的最后一系列文章?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
16年0个月前 IP:未同步
75553
引用第14楼warmonkey于09-02-14 19:49发表的  :
最nb最xe的当然是微软的验证码了,是一段语音!

93为什么说这是他在科创发表的最后一系列文章?

他只是这样说,没说是真的
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
wbliu316
15年11个月前 IP:未同步
88152
小弟的编程能力比较弱,能告诉我这是用什么编写的吗?编译器和语言。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
15年11个月前 IP:未同步
88242
有的验证码很BT,用的是GIF的或者是Flash的,会动……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
15年11个月前 IP:未同步
88244
回16楼:看到……As Long就该知道这是Visual Basic啦。
估计用Visual XXXXXXXXXt  05或08写的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年11个月前 IP:未同步
88250
LS错误
在.NET里是没有point函数的,.NET里的point是一个类型,不会连这都不知道吧
.NET里用getpixel()
而delphi里用pixels[];
C/CPP我更偏向于直接读取BMP文件,因为BMP的结构直接就是RGB

PS 这个项目400块钱到手
+80
科创币
delete
2009-04-05
干什么
-80
科创币
chiataimakro
2009-04-05
个人所得税
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
15年11个月前 IP:未同步
88256
大家看到了吧。祖国的未来赚到了400块大洋。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年11个月前 IP:未同步
88259
日飞破chia,pia!,您又不是ZF收个毛税啊……那天中午M记还是我用着400块请您吃的呢
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
15年11个月前 IP:未同步
88261
要知道你开发出的东西有巨大危害……
都出现Dim……
AS……了,还不是VB?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
15年11个月前 IP:未同步
88263
400,不错。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年11个月前 IP:未同步
88264
我啥时候说过不是VB,VB跟XXXXXT不是一种东西
VB的代码不能直接放到XXXXXT上运行
XXXXXT完全面向对象,所以不能像VB那样随便写
我用的是VB98开发的

PS:收钱的时候给的是delphi写的DLL
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
15年11个月前 IP:未同步
88266
真会吃,400一顿M记?
吃了多少啊?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年11个月前 IP:未同步
88268
我啥时候说过那400块钱全部用来吃MCD了?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年11个月前 IP:未同步
88269
引用第22楼phpskycn于2009-04-05 12:05发表的  :
要知道你开发出的东西有巨大危害……
都出现Dim……
AS……了,还不是VB?

是的,用小括号代替大括号的编译器危害更大
引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
15年11个月前 IP:未同步
88273
这个东西危害可以用巨大来形容,但对Discuz的新验证码已经起不了作用了,不信您试试?
了解了BOT是怎么对付验证码了,下次学好PHP的GD,争取写个验证码能赚400。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年11个月前 IP:未同步
88279
看来您连图形的基本算法都不懂吧
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
15年11个月前 IP:未同步
88284
的确,每次看到这个我都认没用又不会考,就忽略了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
15年11个月前 IP:未同步
88289
引用第30楼phpskycn于09-04-05 12:20发表的  :
的确,每次看到这个我都认没用又不会考,就忽略了。

这跟我们的物理老师讲课一个味儿
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
15年11个月前 IP:未同步
88290
引用第21楼93°于09-04-05 12:04发表的  :
日飞破chia,pia!,您又不是ZF收个毛税啊……那天中午M记还是我用着400块请您吃的呢

stop talking
start doing

both joking...
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年11个月前 IP:未同步
88293
引用第30楼phpskycn于2009-04-05 12:20发表的  :
的确,每次看到这个我都认没用又不会考,就忽略了。

为什么而学习?这是算法问题,经典算法存在就有它的价值
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
15年11个月前 IP:未同步
88322
没错。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh
15年11个月前 IP:未同步
90235
~~~  能识别~~~~中文不~~~~~ 呵呵



  比如 QQ网站上的


作这个  验证码 识别的  按见精灵 也有很多的脚本可以 学习一下  呵呵  


另  WEB  QQ开通了

XXXXXXXXXXXXXXXX/webqq/
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
93°
学者 笔友
文章
651
回复
6032
学术分
30
2007/04/10注册,7年0个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}