用vb.net写的验证码识别代码

本文介绍了一个简单的VB.NET验证码识别程序,包括图像预处理、特征提取和模式匹配等关键步骤。通过对验证码图像进行处理,该程序能够有效去除噪声并识别出数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        一个很简单用vb.net写的验证码识别代码,代码质量不是太高,而且去噪部分算法很不好,但识别现在网站上的图形验证码已经够用了。比起前段时间给一群 人渣做的自动投票系统中用的一个带有相当强大的图形处理类的ocr来识别和去噪相比就差太远了,放代码只是提醒下要注意登陆入口的管理和管理员的密码安全 性,只要我能有一定的几率正确识别图形验证码,就能通过向http包头中添加新的头信息,就能对管理员帐号进行暴力破解:

    Imports System   
    Imports System.Text   
    Imports System.Data   
    Imports System.Data.OleDb   
    Imports System.Drawing   
    Imports System.Drawing.Graphics   
      
    Public Class CrackImage   
      
    Private ConnStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=Learn.mdb"  
    Private resultNumber As String  
    Private rsultStudy As Boolean = False  
      
    '识别   
    Public Sub New(ByVal SrcImage As Bitmap)   
    GetImageNumber = GetIamgeResultNumber(GetNewIamge(SrcImage))   
    End Sub  
      
    '学习   
    Public Sub New(ByVal SrcImagePath As String, ByVal StudyNumber As String)   
    rsultStudy = StudyCode(SrcImagePath, StudyNumber)   
    End Sub  
      
      
    Public Property GetImageNumber() As String  
    Get  
    Return resultNumber   
    End Get  
    Set(ByVal Value As String)   
    resultNumber = Value   
    End Set  
    End Property  
      
      
    Public Property GetStudyImageResult() As Boolean  
    Get  
    Return rsultStudy   
    End Get  
    Set(ByVal Value As Boolean)   
    rsultStudy = Value   
    End Set  
    End Property  
      
    '处理新图片   
    Private Function GetNewIamge(ByVal srcBitBmpImage As Bitmap) As Bitmap   
    '建立临时表   
    Dim myDataTable As New DataTable   
    Dim myCol2 As New DataColumn   
    myCol2.DataType = System.Type.GetType("System.Int32")   
    myCol2.ColumnName = "RgbValue"  
    myDataTable.Columns.Add(myCol2)   
      
    Dim myCol3 As New DataColumn   
    myCol3.DataType = System.Type.GetType("System.Int32")   
    myCol3.ColumnName = "RgbCount"  
    myDataTable.Columns.Add(myCol3)   
      
    '载入图片   
    Dim img As Bitmap = srcBitBmpImage   
    Dim x, y As Integer  
      
    '去除杂点   
    '遍历所有点,存储每点的颜色代码,并对各种颜色进行统计 (这些代码可以不要,直接将图转化成黑白只剩下噪点和感染线条)   
    For x = 0 To img.Width - 1   
    For y = 0 To img.Height - 1   
    Dim Found As Boolean = False  
    If myDataTable.Rows.Count > 0 Then  
    For k As Integer = 0 To myDataTable.Rows.Count - 1   
    If myDataTable.Rows(k).Item("RgbValue") = img.GetPixel(x, y).ToArgb Then  
    myDataTable.Rows(k).Item("RgbCount") += 1   
    Found = True  
    Exit For  
    End If  
    Next  
    End If  
      
    If Found = False Then  
    Dim myRow As DataRow   
    myRow = myDataTable.NewRow()   
    myRow.Item("RgbValue") = img.GetPixel(x, y).ToArgb   
    myRow.Item("RgbCount") = 1   
    myDataTable.Rows.Add(myRow)   
    End If  
    Next  
    Next  
      
    '获取背景色码   
    '象素点出现最多的就视为背景色   
    Dim intMaxRgbValue As Integer = 0   
    If myDataTable.Rows.Count > 0 Then  
    myDataTable.DefaultView.Sort = "RgbCount DESC"  
    intMaxRgbValue = myDataTable.DefaultView.Item(0).Item("RgbValue")   
    End If  
      
    '勾画数字轮廓   
    For x = 0 To img.Width - 1   
    For y = 0 To img.Height - 1   
    Dim x1, y1 As Integer 'x1和y1记录的是相对当前象素的上一个象素的坐标   
    If x = 0 Then  
    x1 = x   
    Else  
    x1 = x - 1   
    End If  
      
    If y = 0 Then  
    y1 = y   
    Else  
    y1 = y - 1   
    End If  
      
    Dim x2, y2 As Integer 'x2和y2记录的是相对当前象素下一个象素的坐标   
    If x = img.Width - 1 Then  
    x2 = img.Width - 1   
    Else  
    x2 = x + 1   
    End If  
      
    If y = img.Height - 1 Then  
    y2 = img.Height - 1   
    Else  
    y2 = y + 1   
    End If  
      
    '都是普通的去噪手法,去噪成黑白色,这里是去噪成黑黄 色   
    If img.GetPixel(x2, y).ToArgb = intMaxRgbValue Or img.GetPixel(x1, y).ToArgb = intMaxRgbValue Then  
    img.SetPixel(x, y, Color.Black)   
    ElseIf img.GetPixel(x, y).ToArgb <> intMaxRgbValue Then  
    img.SetPixel(x, y, Color.Yellow)   
    Else  
    img.SetPixel(x, y, Color.Black)   
    End If  
    Next  
    Next  
      
    Return img   
    End Function  
      
    '获取处理后的数字   
    Private Function GetIamgeResultNumber(ByVal srcNewImg As Bitmap) As String  
    Dim RawData As New StringBuilder   
    '设置分割大小   
    Dim imgNewWidth As Integer = 16   
    Dim imgNewHeight As Integer = 13   
      
    Dim imgNew As New Bitmap(srcNewImg)   
    Dim x, y As Integer  
    Dim result As String = ""  
      
    Dim ImageSplitWidth As Integer = imgNew.Width - imgNewWidth   
      
    For m As Integer = 0 To ImageSplitWidth Step imgNewWidth   
    Dim Rc As New Rectangle(m, 0, imgNewWidth, imgNewHeight)   
    Dim B As Bitmap   
    B = imgNew.Clone(Rc, imgNew.PixelFormat)   
    '对比分割的颜色,黑色取1,其他取0,就此生成特征码   
    For x = 0 To imgNewWidth - 1   
    For y = 0 To imgNewHeight - 1   
    If B.GetPixel(x, y).ToArgb <> Color.Black.ToArgb Then  
    RawData.Append("1")   
    Else  
    RawData.Append("0")   
    End If  
    Next  
    Next  
      
    result += GetIamgeRawToNumber(RawData.ToString)   
    RawData.Replace("0", "").Replace("1", "")   
    Next  
      
    Return result   
    End Function  
      
    '学习新图片   
    Private Function StudyCode(ByVal srcImage As String, ByVal objNumber As String) As Boolean  
    If objNumber = "" Or objNumber.Length < 4 Then Exit Function  
    Dim RawData As New StringBuilder   
    Dim imgNewWidth As Integer = 16   
    Dim imgNewHeight As Integer = 13   
    Dim p As Integer = 0   
    Dim x, y As Integer  
      
    Dim srcBitbmp As New Bitmap(srcImage)   
    Dim imgNew As Bitmap = GetNewIamge(srcBitbmp)   
      
    '分割图片并保存学习代码   
    Dim ImageSplitWidth As Integer = imgNew.Width - imgNewWidth   
    For m As Integer = 0 To ImageSplitWidth Step imgNewWidth   
    Dim CurNumber As String  
    CurNumber = objNumber.Substring(p, 1)   
    If CurNumber <> "." Then  
    Dim Rc As New Rectangle(m, 0, imgNewWidth, imgNewHeight)   
    Dim B As Bitmap   
    B = imgNew.Clone(Rc, imgNew.PixelFormat)   
      
    For x = 0 To imgNewWidth - 1   
    For y = 0 To imgNewHeight - 1   
    If B.GetPixel(x, y).ToArgb <> Color.Black.ToArgb Then  
    RawData.Append("1")   
    Else  
    RawData.Append("0")   
    End If  
    Next  
    Next  
    SaveImageRaw(objNumber.Substring(p, 1), RawData.ToString)   
    RawData.Replace("0", "").Replace("1", "")   
    End If  
    p += 1   
    Next  
      
    Return True  
    End Function  
      
    '获取图片Raw数据   
    Private Function GetIamgeRawToNumber(ByVal strRaw As String) As String  
    Dim conn As New OleDbConnection(ConnStr)   
    Dim comm As New OleDbCommand   
    Dim reader As OleDbDataReader   
      
    Dim myDataTable As New DataTable   
    Dim myCol1 As New DataColumn   
    myCol1.DataType = System.Type.GetType("System.Int32")   
    myCol1.ColumnName = "MatchNumber"  
    myDataTable.Columns.Add(myCol1)   
      
    Dim myCol2 As New DataColumn   
    myCol2.DataType = System.Type.GetType("System.Int32")   
    myCol2.ColumnName = "MatchCount"  
    myDataTable.Columns.Add(myCol2)   
      
    comm.CommandText = "select LearnCharacter,Eigenvalue from tbLearn"  
    conn.Open()   
    comm.Connection = conn   
    reader = comm.ExecuteReader   
      
    If reader.HasRows Then  
    While reader.Read   
    Dim myRow As DataRow   
    myRow = myDataTable.NewRow()   
    myRow.Item("MatchNumber") = reader.Item(0)   
    myRow.Item("MatchCount") = CompareRaw(reader.Item(1), strRaw)   
    myDataTable.Rows.Add(myRow)   
    End While  
    End If  
    conn.Close()   
      
    Dim reuslt As String = ""  
    If myDataTable.Rows.Count > 0 Then  
    myDataTable.DefaultView.Sort = "MatchCount DESC"  
    reuslt = myDataTable.DefaultView.Item(0).Item("MatchNumber")   
    End If  
      
    Return reuslt   
      
    End Function  
      
    '比较图片Raw数据   
    Private Function CompareRaw(ByVal strDataBaseRaw As String, ByVal strObjRaw As String) As Integer  
    Dim intRawLen As Integer = strDataBaseRaw.Length   
    Dim MatchCount As Integer = 0   
    For i As Integer = 0 To intRawLen - 1   
    If strDataBaseRaw.Substring(i, 1) = strObjRaw.Substring(i, 1) Then  
    MatchCount += 1   
    End If  
    Next  
    Return MatchCount   
    End Function  
      
    '保存图片Raw数据   
    Private Sub SaveImageRaw(ByVal strNumber As String, ByVal strRaw As String)   
    Dim conn As New OleDbConnection(ConnStr)   
    Dim comm As New OleDbCommand   
    comm.CommandText = "insert into tbLearn(LearnCharacter,Eigenvalue) values ('" + strNumber + "','" + strRaw + "')"  
    conn.Open()   
    comm.Connection = conn   
    comm.ExecuteNonQuery()   
    conn.Close()   
    End Sub  
      
    End Class   




注意事项:调试模式请把DLL和辅助文件程序运行的目录下,其他文件也设置好相应路径,否则会调试出错。 DLL一共4主个命令,3个辅助命令,可以应对各种情况。 1.loadcode:载入验证码 2.Recognition:识别 3.outitem:取项目名称 4.Writepic:保存图片 5.Recognitiond:另外一种识别,和识别1的区别是不需要传递指针参数。 6.yLength:返回识别结果长度。 7.tebie: 特殊方式处理图片时使用。 [in]:传入参数 [out]:接收参数 以下DLL对于整数型不需要用的就传递 0 ,文本不需要用的就传递 空文本。 文件说明: ycode.dll主调用DLL,其他的为,辅助文件。 ----------------------------------------------------------------------------------- 一般调用顺序为 loadcode - Recognition - Writepic ----------------------------------------------------------------------------------- .DLL命令 loadcode, 整数型, "ycode.dll" 返回项目数 [in].参数 code, 整数型 1)验证码库字节集指针地址 [in].参数 Length, 整数型 2)指针长度 [in].参数 Address, 文本型 3)验证码库的路径 [in].参数 pass, 文本型 4)验证码库的密码 备注:1+2和3任意选一组就可以了. 4.输入相应的密码,没有密码就传递一个空文本就可以了. VB申明: Declare Function loadcode Lib "ycode.dll" Alias "loadcode" (ByVal code As Long, ByVal length As Long, ByVal address As String, ByVal pass As String) As Long 返回值 Long,返回项目个数。 ----------------------------------------------------------------------------------- .DLL命令 outitem, 文本型, "ycode.dll" 返回项目名称 [in].参数 no, 整数型 1) 项目序号 VB申明: Declare Function outitem Lib "ycode.dll" Alias "outitem" (ByVal no As Long) As String 返回值 String,返回指定项目序号的项目名字。 ----------------------------------------------------------------------------------- .DLL命令 Recognition, 整数型, "ycode.dll" 返回识别结果内存指针 [in].参数 ItemNo, 整数型 1)项目号 [in].参数 picin, 整数型 2)图片内存指针地址 [in].参数 Length, 整数型 3)指针长度 [in].参数 Address1, 文本型 4)验证码网络路径 [in].参数 Address2, 文本型 5)验证码本地路径 [out].参数 lppicout, 整数型, 传址, 6)返回:图片指针 [out].参数 lpLength, 整数型, 传址, 7)返回:指针长度 [out].参数 cLength, 整数型, 传址, 8)返回:字符长度 备注:1,将按相应的序号载入相应识别库并识别,如只有一个项目那就传1。 2+3或4或5任选一个。传递验证码图片数据或网络地址或本地图片路径,如果都不传递的话将按识别库中的默认数据获取VB申明: Declare Function Recognition Lib "ycode.dll" Alias "Recognition" (ByVal ItemNo As Long, ByVal picin As Long, ByVal Length As Long, ByVal Address1 As String, ByVal Address2 As String, lppicout As L
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值