破译动网验证码的简单方法 http://blog.csdn.net/wwqna/archive/2004/11/13/A1.aspx
2005-02-27 20:47
686 查看
转载至 http://blog.csdn.net/wwqna/archive/2004/11/13/A1.aspx
Option Explicit
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal y As Long) As Long
Private Const CF_BITMAP = 2
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Dim phobit(0 To 9, 0 To 9) As Integer '标识位图的像素
Private Sub cmdGetChar_Click()
Dim X As Long
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim mintCurPos As Integer
With Picture2
For k = 0 To 3 '表示有四个字符,
For i = 0 To 9
mintCurPos = InStr(txtPhoBit.Text, "数字" & i & ":") + 4 '数字字符的当前位置
For j = 0 To 9
X = GetPixel(.hdc, k * 10, j) '获得它的像素值
If (X = 15658734 And Mid(txtPhoBit.Text, mintCurPos + j, 1) = "0") _
Or (X <> 15658734 And Mid(txtPhoBit.Text, mintCurPos + j, 1) = "1") Then '判断像素是否相同。
Else '不同则跳出
Exit For
End If
Next j
If j = 10 Then '在此就可以判断当前字符为 i
txtPhoChar.Text = txtPhoChar.Text & i
Exit For
End If
Next i
Next k
End With
End Sub
Private Sub Form_Load()
txtPhoBit.Text = "数字0:0111111110数字1:0100000001数字2:0100000011数字3:0100000010数字4:0000011000数字5:1111100010数字6:0011111110数字7:1100000000数字8:0111011110数字9:0111100000"
If Not URLDownloadToFile(0, "http://bbs.china95.net/DV_getcode.asp", App.Path & "/pho.bmp", 0, 0) Then
Picture2.Picture = LoadPicture(App.Path & "/pho.bmp")
Else
MsgBox "保存图片出错!"
End If
End Sub
我分析了一下你的那张图片,发现在空的地方全是RGB(238,238,238)也就是15658734.
并且它的数字排列的非常的工整,也就是说在任何时候出现的相同数字它的像素图都是一样的。并且每数字都占十个像素。到这里的时假我打算比对每它们所有的相素的,也就是每一个数字要比对10*10次。我总觉得这样浪费时间,后来我也发现只要比对每个数字的第一列字即可得到你想要的数字。
所以开始就将10个数字保存在txtphobit中了,如果像素值为15658734,那么就它的字符设为"0",不等于15658734就设为"1"
这个方法只针对这个图片有效(准确率100%),像chinaren那样,就没有用。
Option Explicit
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal y As Long) As Long
Private Const CF_BITMAP = 2
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Dim phobit(0 To 9, 0 To 9) As Integer '标识位图的像素
Private Sub cmdGetChar_Click()
Dim X As Long
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim mintCurPos As Integer
With Picture2
For k = 0 To 3 '表示有四个字符,
For i = 0 To 9
mintCurPos = InStr(txtPhoBit.Text, "数字" & i & ":") + 4 '数字字符的当前位置
For j = 0 To 9
X = GetPixel(.hdc, k * 10, j) '获得它的像素值
If (X = 15658734 And Mid(txtPhoBit.Text, mintCurPos + j, 1) = "0") _
Or (X <> 15658734 And Mid(txtPhoBit.Text, mintCurPos + j, 1) = "1") Then '判断像素是否相同。
Else '不同则跳出
Exit For
End If
Next j
If j = 10 Then '在此就可以判断当前字符为 i
txtPhoChar.Text = txtPhoChar.Text & i
Exit For
End If
Next i
Next k
End With
End Sub
Private Sub Form_Load()
txtPhoBit.Text = "数字0:0111111110数字1:0100000001数字2:0100000011数字3:0100000010数字4:0000011000数字5:1111100010数字6:0011111110数字7:1100000000数字8:0111011110数字9:0111100000"
If Not URLDownloadToFile(0, "http://bbs.china95.net/DV_getcode.asp", App.Path & "/pho.bmp", 0, 0) Then
Picture2.Picture = LoadPicture(App.Path & "/pho.bmp")
Else
MsgBox "保存图片出错!"
End If
End Sub
我分析了一下你的那张图片,发现在空的地方全是RGB(238,238,238)也就是15658734.
并且它的数字排列的非常的工整,也就是说在任何时候出现的相同数字它的像素图都是一样的。并且每数字都占十个像素。到这里的时假我打算比对每它们所有的相素的,也就是每一个数字要比对10*10次。我总觉得这样浪费时间,后来我也发现只要比对每个数字的第一列字即可得到你想要的数字。
所以开始就将10个数字保存在txtphobit中了,如果像素值为15658734,那么就它的字符设为"0",不等于15658734就设为"1"
这个方法只针对这个图片有效(准确率100%),像chinaren那样,就没有用。
相关文章推荐
- CString 的方法(from:http://blog.csdn.net/lijuwen/archive/2006/03/13/623186.aspx)
- AO中的对高亮显示的局部刷新及对局部刷新方法的总结 转 http://blog.csdn.net/suinon/archive/2008/06/20/2569072.aspx
- Sql Server 生成连续日期的方法总结 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/GRANDTREE/archive/2009/06/16/4273129.aspx
- Spring中单例bean访问非单例bean的第一种方式:方法注入(转http://blog.csdn.net/ayueiloveyou/archive/2008/08/03/2760473.aspx)
- 简单驱动开发配置(转自http://blog.csdn.net/yinxu/archive/2007/11/12/1880561.aspx)经典
- 用开源组件jcaptcha做jsp彩色验证码 ( 转http://blog.csdn.net/alexjjf/archive/2006/10/31/1359333.aspx)
- asp.net中验证码的实现 (转自http://blog.csdn.net/zhoufoxcn/archive/2007/07/19/1698615.aspx)
- C#向Excel报表中插入图片的2种方法 http://blog.csdn.net/net_lover/archive/2007/07/23/1702797.aspx
- 数据挖掘和知识发现的技术、方法及应用 --------http://blog.csdn.net/gongfs/archive/2006/03/17/627244.aspx
- [转]水晶报表列太多导致设计界面容纳不下的解决方法 [http://blog.csdn.net/lupenda/archive/2005/08/12/452878.aspx]
- http://blog.csdn.net/ramacess/archive/2009/11/15/4812012.aspx
- http://blog.csdn.net/arielxp/archive/2004/06/27/27929.aspx
- stL http://blog.csdn.net/solotony/archive/2004/09/27/118163.aspx
- struts2 标签 s (转http://blog.csdn.net/yanyuening/archive/2009/06/06/4246995.aspx)
- 关于UML的个人见解--转自http://blog.csdn.net/ccat/archive/2010/06/13/5668593.aspx
- 程序只启动一个实例的几种方法(转自http://blog.csdn.net/starlee)
- 新版公农历转换类(C#) 转自http://blog.csdn.net/BlueDog/archive/2006/12/13/1440594.aspx
- MSN Messenger 不能登录的一般解决方案 http://blog.csdn.net/iyu/archive/2005/12/29/564964.aspx
- WPF体验 http://blog.csdn.net/niwalker/archive/2005/12/10/548434.aspx
- 成功的背后!(给所有IT人)(转载来自http://blog.csdn.net/ysuncn/archive/2007/10/07/1814127.aspx)