vb.net读写T5557卡,将T5557卡模拟成HID、ID门禁卡源码

        T5557卡是多功能非接触式射频芯片卡,属于125KHz的低频卡,在国内有广大的应用市场,如很多酒店的门禁卡都是使用T5557卡。该芯片共有330bit(比特)的EPROM(分布为10个区块, 每个区块33bit)。0页的块0是被保留用于设置T5557操作模式的参数配置块。第0页第7块可以作用户数据块使用,也可以作为保护全部数据的密码(假如在配置块中启用密码功能的话),防止非法改写数据。 第1页的1、2块保存了出厂商信息及唯一出厂ID,只能读取不可更改。T5567、T5577是T5557的升级版。

        通过修改T5557卡的参数配置块,可以将t5557卡模拟成ID卡、HID卡。

本示例使用的发卡器:T5557 T5567 T5577低频RFID读写器 EM4100 HID卡复制器 酒店门卡-淘宝网 (taobao.com) 

 一、读、写卡函数声明

    Declare Function idr_beep Lib "OUR_IDR.dll" (ByVal xms As Integer) As Byte
    Declare Function pcdgetdevicenumber Lib "OUR_IDR.dll" (ByRef devicenumber As Byte) As Byte
    Declare Function idr_read Lib "OUR_IDR.dll" (ByRef serial As Byte) As Byte
    Declare Function hid_read Lib "OUR_IDR.dll" (ByRef serial As Byte) As Byte
    Declare Function t5557_init Lib "OUR_IDR.dll" (ByVal ctrlword As Byte, ByRef seria As Byte, ByRef key As Byte, ByRef configdata As Byte, ByRef newkey As Byte) As Byte
    Declare Function t5557_read Lib "OUR_IDR.dll" (ByVal ctrlword As Byte, ByRef seria As Byte, ByRef key As Byte, ByRef blockflag As Byte, ByRef readdata As Byte) As Byte
    Declare Function t5557_write Lib "OUR_IDR.dll" (ByVal ctrlword As Byte, ByRef seria As Byte, ByRef key As Byte, ByRef blockflag As Byte, ByRef writedata As Byte) As Byte
    Declare Function t5557_changekey Lib "OUR_IDR.dll" (ByVal ctrlword As Byte, ByRef seria As Byte, ByRef oldkey As Byte, ByRef newkey As Byte) As Byte
    Declare Function t5557_to4100 Lib "OUR_IDR.dll" (ByVal ctrlword As Byte, ByRef seria As Byte, ByRef oldkey As Byte, ByRef newkey As Byte, ByRef myuidbuf As Byte) As Byte
    Declare Function t5557_tohid Lib "OUR_IDR.dll" (ByVal ctrlword As Byte, ByRef seria As Byte, ByRef oldkey As Byte, ByRef newkey As Byte, ByRef myuidbuf As Byte) As Byte

    Public myCheckBox As New ArrayList
    Public myTextBox As New ArrayList

    Dim NEEDSERIAL As Byte = 1   '需要只对指定系列号的卡操作
    Dim NEEDKEY As Byte = 2      '需要用密码认证
    Dim LOCKBIT As Byte = 4      '锁定配置块或数据块,仅对   t5557_init,t5557_write ,t5557_changekey函数有效
    Dim KEYENABLE As Byte = 8    '启用本卡的密码功能
    Dim RESETCARD As Byte = 16   '操作成功后重启卡片

二、轻松读取T5557卡块数据

 Private Sub button1_Click(sender As Object, e As EventArgs) Handles button1.Click
        Dim status As Byte              '存放返回值
        Dim myctrlword As Byte = 0      '控制字
        Dim oldpicckey(3) As Byte       '密码
        Dim mypiccserial(5) As Byte     '卡序列号
        Dim mypiccdata(49) As Byte      '读卡数据缓冲:卡无线转输分频比、卡内容长度(字节数),及最多返回12个块的数据
        Dim mypiccblockflag(1) As Byte  '指定读哪一块
        Dim j As Integer
        Dim i As Integer
        Dim PasswStr As String = textBox14.Text.Trim()
        Dim seriaStr As String = textBox15.Text.Trim()

        If checkBox1.Checked Then  '本次操作需要密码验证            
            myctrlword = myctrlword + NEEDKEY
            Try
                oldpicckey(0) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16))
                oldpicckey(1) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16))
                oldpicckey(2) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16))
                oldpicckey(3) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16))
            Catch
                MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox14.Select()
                Return
            End Try
        End If

        If (checkBox2.Checked) Then  '仅操作指定卡号的卡
            Try
                myctrlword = myctrlword + NEEDSERIAL
                mypiccserial(0) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(0, 2), 16))
                mypiccserial(1) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(2, 2), 16))
                mypiccserial(2) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(4, 2), 16))
                mypiccserial(3) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(6, 2), 16))
                mypiccserial(4) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(8, 2), 16))
                mypiccserial(5) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(10, 2), 16))
            Catch
                MessageBox.Show("卡号输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox15.Select()
                Return
            End Try
        End If

        j = 0
        mypiccblockflag(0) = 0
        For i = 0 To 7
            If (myCheckBox(i).Checked) Then
                mypiccblockflag(0) = mypiccblockflag(0) + Math.Pow(2, i)
                j = j + 1
            End If
        Next

        mypiccblockflag(1) = 0
        For i = 0 To 3
            If (myCheckBox(8 + i).Checked) Then
                mypiccblockflag(1) = mypiccblockflag(1) + Math.Pow(2, i + 1)
                j = j + 1
            End If
        Next

        status = t5557_read(myctrlword, mypiccserial(0), oldpicckey(0), mypiccblockflag(0), mypiccdata(0))
        If (status = 0) Then
            Dim blockdata As String = ""
            For i = 0 To mypiccdata(1) - 1
                blockdata = blockdata + mypiccdata(2 + i).ToString("X2")
            Next

            j = 0
            For i = 0 To 11
                If (myCheckBox(i).Checked) Then
                    myTextBox(i).Text = blockdata.Substring(j, 8)
                    j = j + 8
                End If
            Next

            seriaStr = ""
            For i = 0 To 5
                seriaStr = seriaStr + mypiccserial(i).ToString("X2")
            Next

            idr_beep(30)
            MessageBox.Show("读卡成功,卡无线转输分频比:" + mypiccdata(0).ToString("D") + ",卡号:" + seriaStr, "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Else
            MessageErrInf(status)
        End If

    End Sub

 三、轻松写T5557卡

 Private Sub button3_Click(sender As Object, e As EventArgs) Handles button3.Click
        Dim status As Byte              '存放返回值
        Dim myctrlword As Byte = 0      '控制字
        Dim oldpicckey(3) As Byte       '密码
        Dim mypiccserial(5) As Byte     '卡序列号
        Dim mypiccdata(49) As Byte      '写卡数据缓冲
        Dim mypiccblockflag(1) As Byte  '指定读哪一块
        Dim j As Integer
        Dim i As Integer
        Dim PasswStr As String = textBox14.Text.Trim()
        Dim seriaStr As String = textBox15.Text.Trim()

        Dim chtxt As Integer = chedkdata()
        If chtxt <> 100 Then
            MessageBox.Show("写卡数据输入错误,请重新输入!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            myTextBox(chtxt).Select()
            Return
        End If

        If checkBox1.Checked Then  '本次操作需要密码验证            
            myctrlword = myctrlword + NEEDKEY
            Try
                oldpicckey(0) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16))
                oldpicckey(1) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16))
                oldpicckey(2) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16))
                oldpicckey(3) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16))
            Catch
                MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox14.Select()
                Return
            End Try
        End If

        If (checkBox2.Checked) Then  '仅操作指定卡号的卡
            Try
                myctrlword = myctrlword + NEEDSERIAL
                mypiccserial(0) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(0, 2), 16))
                mypiccserial(1) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(2, 2), 16))
                mypiccserial(2) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(4, 2), 16))
                mypiccserial(3) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(6, 2), 16))
                mypiccserial(4) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(8, 2), 16))
                mypiccserial(5) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(10, 2), 16))
            Catch
                MessageBox.Show("卡号输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox15.Select()
                Return
            End Try
        End If

        j = 0
        mypiccblockflag(0) = 0
        For i = 0 To 7
            If (myCheckBox(i).Checked) Then
                mypiccblockflag(0) = mypiccblockflag(0) + Math.Pow(2, i)
                j = j + 1
            End If
        Next

        mypiccblockflag(1) = 0
        For i = 0 To 3
            If (myCheckBox(8 + i).Checked) Then
                mypiccblockflag(1) = mypiccblockflag(1) + Math.Pow(2, i + 1)
                j = j + 1
            End If
        Next

        Dim WriteStr As String = ""
        For i = 0 To 11
            If (myCheckBox(i).Checked) Then
                WriteStr = WriteStr + myTextBox(i).Text
            End If
        Next

        For i = 0 To (WriteStr.Length / 2) - 1
            mypiccdata(i) = Convert.ToByte(Convert.ToInt32(WriteStr.Substring(i * 2, 2), 16))
        Next

        status = t5557_write(myctrlword, mypiccserial(0), oldpicckey(0), mypiccblockflag(0), mypiccdata(0))
        If (status = 0) Then
            seriaStr = ""
            For i = 0 To 5                
                seriaStr = seriaStr + mypiccserial(i).ToString("X2")
            Next

            idr_beep(30)
            MessageBox.Show("卡号:" + seriaStr + "写卡成功!", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information)

        Else
            MessageErrInf(status)
        End If

    End Sub

 四、将T5557卡配置成HID、ID卡

Private Sub button8_Click(sender As Object, e As EventArgs) Handles button8.Click
        Dim status As Byte              '存放返回值
        Dim myctrlword As Byte = 0      '控制字
        Dim oldpicckey(3) As Byte       '旧密码
        Dim newpicckey(3) As Byte       '新密码
        Dim mypiccserial(5) As Byte     '卡序列号
        Dim PasswStr As String = textBox14.Text.Trim()        
        Dim seriaStr As String = textBox15.Text.Trim()
        Dim newpassw As String = textBox20.Text.Trim()
        Dim newuidstr As String = textBox17.Text.Trim()

        If checkBox1.Checked Then      '本次操作需要密码验证            
            myctrlword = myctrlword + NEEDKEY
            Try
                oldpicckey(0) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16))
                oldpicckey(1) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16))
                oldpicckey(2) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16))
                oldpicckey(3) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16))
            Catch
                MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox14.Select()
                Return
            End Try
        End If

        If (checkBox2.Checked) Then  '仅操作指定卡号的卡
            Try
                myctrlword = myctrlword + NEEDSERIAL
                mypiccserial(0) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(0, 2), 16))
                mypiccserial(1) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(2, 2), 16))
                mypiccserial(2) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(4, 2), 16))
                mypiccserial(3) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(6, 2), 16))
                mypiccserial(4) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(8, 2), 16))
                mypiccserial(5) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(10, 2), 16))
            Catch
                MessageBox.Show("卡号输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox15.Select()
                Return
            End Try
        End If

        If (checkBox11.Checked) Then  '修改卡片密码
            Try
                myctrlword = myctrlword + KEYENABLE
                newpicckey(0) = Convert.ToByte(Convert.ToInt32(newpassw.Substring(0, 2), 16))
                newpicckey(1) = Convert.ToByte(Convert.ToInt32(newpassw.Substring(2, 2), 16))
                newpicckey(2) = Convert.ToByte(Convert.ToInt32(newpassw.Substring(4, 2), 16))
                newpicckey(3) = Convert.ToByte(Convert.ToInt32(newpassw.Substring(6, 2), 16))
            Catch
                MessageBox.Show("新密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox20.Select()
                Return
            End Try
        End If

        myctrlword = myctrlword + RESETCARD   '操作后重启卡片,否则在制卡后,需要拿开卡片重放才能成功读ID卡

        If (radioButton3.Checked) Then
            Dim myuid(4) As Byte         '写入的新EM4100卡号
            Try
                myuid(0) = Convert.ToByte(Convert.ToInt32(textBox16.Text.Substring(0, 2), 16))
            Catch                
                MessageBox.Show("产家标识输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox16.Select()
                Return
            End Try

            Try
                myuid(1) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(0, 2), 16))
                myuid(2) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(2, 2), 16))
                myuid(3) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(4, 2), 16))
                myuid(4) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(6, 2), 16))
            Catch
                MessageBox.Show("新卡号输入错误,请输入8位16进制数的卡号!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox17.Select()
                Return
            End Try

            status = t5557_to4100(myctrlword, mypiccserial(0), oldpicckey(0), newpicckey(0), myuid(0))
            If (status = 0) Then
                idr_beep(50)
                MessageBox.Show("卡号:" + System.Convert.ToString(myuid(1) * 256 * 256 * 256 + myuid(2) * 256 * 256 + myuid(3) * 256 + myuid(4)) + " 写卡成功变成ID卡!不能再用t5557的指令读写此卡,可重新设置配置块恢复t5557卡功能。", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Else
                MessageErrInf(status)
            End If
        Else
            Dim myuid(6) As Byte         '写入的新HID卡号
            Try
                myuid(0) = Convert.ToByte(Convert.ToInt32(textBox16.Text.Substring(0, 2), 16))
            Catch                
                MessageBox.Show("HID卡号位数错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox16.Select()
                Return
            End Try

            Try
                myuid(1) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(0, 2), 16))
                myuid(2) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(2, 2), 16))
                myuid(3) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(4, 2), 16))
                myuid(4) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(6, 2), 16))
                myuid(5) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(8, 2), 16))
                myuid(6) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(10, 2), 16))
            Catch
                MessageBox.Show("新卡号输入错误,请输入12位16进制数的卡号!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox17.Select()
                Return
            End Try

            status = t5557_tohid(myctrlword, mypiccserial(0), oldpicckey(0), newpicckey(0), myuid(0))
            If (status = 0) Then
                idr_beep(50)
                MessageBox.Show("卡号:" + System.Convert.ToString(myuid(3) * 256 * 256 * 256 + myuid(4) * 256 * 256 + myuid(5) * 256 + myuid(6)) + " 写卡成功变成HID卡!不能再用t5557的指令读写此卡,可重新设置配置块恢复t5557卡功能。", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Else
                MessageErrInf(status)
            End If
        End If
    End Sub

 五、初始化T5557卡

Private Sub button9_Click(sender As Object, e As EventArgs) Handles button9.Click
        Dim status As Byte      '存放返回值
        Dim oldpicckey(3) As Byte   '旧密码
        Dim newpicckey(3) As Byte   '启用的新密码
        Dim mypiccserial(5) As Byte   '卡序列号
        Dim mypiccdata(3) As Byte   '配置值
        Dim PasswStr As String = textBox14.Text.Trim()
        Dim NewPass As String = textBox21.Text.Trim()
        Dim ConfStr As String = textBox18.Text.Trim()

        Dim myctrlword As Byte = 0  '控制字

        If (checkBox1.Checked) Then  '本次操作需要密码验证
            myctrlword = myctrlword + NEEDKEY
            Try
                oldpicckey(0) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16))
                oldpicckey(1) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16))
                oldpicckey(2) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16))
                oldpicckey(3) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16))
            Catch
                MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox14.Select()
                Return
            End Try
        End If

        If (checkBox13.Checked) Then  '卡片启用新密码
            myctrlword = myctrlword + KEYENABLE
            Try
                newpicckey(0) = Convert.ToByte(Convert.ToInt32(NewPass.Substring(0, 2), 16))
                newpicckey(1) = Convert.ToByte(Convert.ToInt32(NewPass.Substring(2, 2), 16))
                newpicckey(2) = Convert.ToByte(Convert.ToInt32(NewPass.Substring(4, 2), 16))
                newpicckey(3) = Convert.ToByte(Convert.ToInt32(NewPass.Substring(6, 2), 16))                
            Catch

                MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                textBox21.Select()
                Return
            End Try
        End If

        Try
            mypiccdata(0) = Convert.ToByte(Convert.ToInt32(ConfStr.Substring(0, 2), 16))
            mypiccdata(1) = Convert.ToByte(Convert.ToInt32(ConfStr.Substring(2, 2), 16))
            mypiccdata(2) = Convert.ToByte(Convert.ToInt32(ConfStr.Substring(4, 2), 16))
            mypiccdata(3) = Convert.ToByte(Convert.ToInt32(ConfStr.Substring(6, 2), 16))
        Catch
            MessageBox.Show("配置值输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            textBox18.Select()
            Return
        End Try

        status = t5557_init(myctrlword, mypiccserial(0), oldpicckey(0), mypiccdata(0), newpicckey(0))
        If (status = 0) Then
            Dim seriaStr As String = ""
            For i = 0 To 5
                seriaStr = seriaStr + mypiccserial(i).ToString("X2")
            Next

            idr_beep(30)
            MessageBox.Show("卡号:" + seriaStr + "配置成功!", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information)            
        Else
            MessageErrInf(status)
        End If
    End Sub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vx_13822155058

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值