【RF】验证码的分析与识别[1]
93° 2009-2-11Windows
本人在科创发表的最后一系列文章

自从网络被应用,验证码也应运而生。验证码一般是由字母+数字+随机干扰组成的一幅图片。
人们在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的总和。

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

Picture2.Cls
Picture3.Cls
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
        Picture2.PSet (i, Picture2.Height - l)
        Picture3.PSet (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
        Picture3.PSet (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    思路不错。
来自 Windows
 
1
2009-2-11 21:47:29
1楼
頂,,.期待您破解一些極為NB極為XE的验证码
0076.jpg
  
0079.jpg
  
0081.jpg
  
0083.jpg
  
0089.jpg
  
0090.jpg
评论(1)折叠评论
加载评论中,请稍候...
折叠评论
2009-02-12 18:56:50
93°(作者)
2楼
有没有搞错,这是我发过的最正经的帖子啊
+1  科创币    彼岸江山   2009-02-12    ding
折叠评论
加载评论中,请稍候...
折叠评论
3楼
顶 [s:251]
折叠评论
加载评论中,请稍候...
折叠评论
4楼
引用第2楼93°于2009-02-12 18:56发表的  :
有没有搞错,这是我发过的最正经的帖子啊


93效應:
[glow=255,red,1]無論帖子內容是啥.都會給水掉....[/glow]
[s:94]
折叠评论
加载评论中,请稍候...
折叠评论
5楼
思路不错……但是对于扭曲重合的字符就没办法了……
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
6楼
楼上正确

正在转向delphi中。客户要求

58_3212_1114129532.png
折叠评论
加载评论中,请稍候...
折叠评论
7楼
应该转向C++……虽然我对编程一知半解吧,但是高手们都说c++很nb……

楼主应该继续解释一下是如何识别出斜着的字符的
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
8楼
参见旋转卡壳算法,迟一些我再介绍。

delphi的兼容性无敌啊。。
折叠评论
加载评论中,请稍候...
折叠评论
9楼
引用第8楼93°于2009-02-12 22:26发表的  :
参见旋转卡壳算法,迟一些我再介绍。

delphi的兼容性无敌啊。。


没看出来该算法和矫正斜的文字有什么关联……
折叠评论
加载评论中,请稍候...
折叠评论
2009-02-13 19:03:13
10楼
表示支持……93继续……对代码的解释写的详细一点,对一些数学不好的同学有理解帮助
折叠评论
加载评论中,请稍候...
折叠评论
2009-02-14 09:01:15
11楼
93°来把剩下的发完
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
12楼
唉唉 。。都没啥人看
折叠评论
加载评论中,请稍候...
折叠评论
13楼
矛与盾的故事之现实生活版...
折叠评论
加载评论中,请稍候...
折叠评论
14楼
最nb最xe的当然是微软的验证码了,是一段语音!

93为什么说这是他在科创发表的最后一系列文章?
折叠评论
加载评论中,请稍候...
折叠评论
2009-02-15 14:03:21
15楼
引用第14楼warmonkey于09-02-14 19:49发表的  :
最nb最xe的当然是微软的验证码了,是一段语音!

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

他只是这样说,没说是真的
折叠评论
加载评论中,请稍候...
折叠评论
2009-04-04 23:51:17
2009-4-4 23:51:17
16楼
小弟的编程能力比较弱,能告诉我这是用什么编写的吗?编译器和语言。
折叠评论
加载评论中,请稍候...
折叠评论
2009-04-05 11:46:59
17楼
有的验证码很BT,用的是GIF的或者是Flash的,会动……
折叠评论
加载评论中,请稍候...
折叠评论
18楼
回16楼:看到……As Long就该知道这是Visual Basic啦。
估计用Visual studio.net  05或08写的。
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
19楼
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    个人所得税
折叠评论
加载评论中,请稍候...
折叠评论
20楼
大家看到了吧。祖国的未来赚到了400块大洋。
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
21楼
日飞破chia,pia!,您又不是ZF收个毛税啊……那天中午M记还是我用着400块请您吃的呢
折叠评论
加载评论中,请稍候...
折叠评论
22楼
要知道你开发出的东西有巨大危害……
都出现Dim……
AS……了,还不是VB?
折叠评论
加载评论中,请稍候...
折叠评论
23楼
400,不错。
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
24楼
我啥时候说过不是VB,VB跟VB.NET不是一种东西
VB的代码不能直接放到VB.NET上运行
VB.NET完全面向对象,所以不能像VB那样随便写
我用的是VB98开发的

PS:收钱的时候给的是delphi写的DLL
折叠评论
加载评论中,请稍候...
折叠评论
25楼
真会吃,400一顿M记?
吃了多少啊?
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
26楼
我啥时候说过那400块钱全部用来吃MCD了?
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
27楼
引用第22楼phpskycn于2009-04-05 12:05发表的  :
要知道你开发出的东西有巨大危害……
都出现Dim……
AS……了,还不是VB?

是的,用小括号代替大括号的编译器危害更大
折叠评论
1
加载评论中,请稍候...
折叠评论
28楼
这个东西危害可以用巨大来形容,但对Discuz的新验证码已经起不了作用了,不信您试试?
了解了BOT是怎么对付验证码了,下次学好PHP的GD,争取写个验证码能赚400。
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
29楼
看来您连图形的基本算法都不懂吧
折叠评论
加载评论中,请稍候...
折叠评论
30楼
的确,每次看到这个我都认没用又不会考,就忽略了。
折叠评论
加载评论中,请稍候...
折叠评论
31楼
引用第30楼phpskycn于09-04-05 12:20发表的  :
的确,每次看到这个我都认没用又不会考,就忽略了。

这跟我们的物理老师讲课一个味儿
折叠评论
加载评论中,请稍候...
折叠评论
32楼
引用第21楼93°于09-04-05 12:04发表的  :
日飞破chia,pia!,您又不是ZF收个毛税啊……那天中午M记还是我用着400块请您吃的呢

stop talking
start doing

both joking...
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
33楼
引用第30楼phpskycn于2009-04-05 12:20发表的  :
的确,每次看到这个我都认没用又不会考,就忽略了。

为什么而学习?这是算法问题,经典算法存在就有它的价值
折叠评论
加载评论中,请稍候...
折叠评论
34楼
没错。
折叠评论
加载评论中,请稍候...
折叠评论
2009-04-10 23:45:40
2009-4-10 23:45:40
35楼
~~~  能识别~~~~中文不~~~~~ 呵呵



  比如 QQ网站上的


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


另  WEB  QQ开通了

http://im.qq.com/webqq/
折叠评论
加载评论中,请稍候...
折叠评论

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

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
ID:{{user.uid}}
{{user.username}}
{{user.info.certsName}}
{{user.description}}
{{format("YYYY/MM/DD", user.toc)}}注册,{{fromNow(user.tlv)}}活动
{{submitted?"":"投诉"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png