·天新网首页·加入收藏·设为首页
首页|笔记本|手机|数码相机|摄像机|MP3/MP4|主板|内存|显示器|办公|打印机|下载|开发|汽车|学院|业界
硬件|台式机|数码|数字家庭|投影仪|GPS/CPU|显卡|硬盘|服务器|网络|一体机|驱动|源码|游戏|考试|报价
您现在的位置:天新网 > 软件开发 > 开发文摘 > .Net文摘
开发手记(四)——运用VB实战破解ACCESS密码
http://dev.21tx.com 2005年08月04日 Blog mi6236

    AccessExcel都是Office套件产品,但他们的加密方式完全不同。EXCEL利用的是DES加密技术,而ACCESS只是简单运用异或运算修改头文件中的若干位来达到加密的目的。

     异或运算特性:一数经两次异或可以回到原值,特性举例:(A)XOR(B)=(C)同时(C)XOR(B)=(A),同理可以推出(C)XOR(A)=(B)。A代表ACCESS头文件中的若干位,B代表用户密码,C为经过加密的头文件的若干位的值。我们可以用ultraedit或VC以二进制方式打开原始ACCESS,记录下相关头文件的值,再打开加密后的ACCESS记录下相关头文件的值,两者再异或结果就是ACCESS的密码了。明白了原理后破解ACCESS的密码就很容易了。ACCESS在不同的版本中它的加密位也是不同的:ACCESS97的最大密码长度为13位,加密位是从头文件的67位开始至79位结束,未加密的这13位十六进制值为"86,FB,EC,37,5D,44,9C,FA,C6,5E,28,E6,13"ACCESS2000的最大密码长度为20位,加密位也是从头文件的67位开始至106位结束,未加密的这40位十六进制值为20 6D EC 37 FB D2 9C FA 60 C8 28 E6 B5 20 8A 60 F2 02 7B 36 53 E4 DF B1 D1 62 13 43 69 39 B1 33 92 F7 79 5B 34 23 7C 2A ”,ACCESS2000采用的是40位中的低字节,如前两位二进制值为‘20 7D’,那么它的加密位为‘20’位。

  解密最直接的方法是用原始头文件的相关位覆盖加密文件的相关位;也可以得用国外有名的免费软件ACCKEY,它只有361KB;但我们更愿意自己编写一个破解程序达到目的,这样更有成就感。

‘*****ShowPassWord.VBp----破解ACCESS密码*****

************(c)mi6236,2005,vb6.0  win2k*************

Option Explicit

Private Sub ShowPassWord_Click()

    Dim password As String

    Dim temp As Byte

    Dim source97(12) As Byte

    Dim source2000(39) As Byte

    Dim i As Integer

    '**********************************************************

    '将未加密ACCSEE97中的67-79位的值并赋给数组source97()

    '**********************************************************

    source97(0) = &H86

    source97(1) = &HFB

    source97(2) = &HEC

    source97(3) = &H37

    source97(4) = &H5D

    source97(5) = &H44

    source97(6) = &H9C

    source97(7) = &HFA

    source97(8) = &HC6

    source97(9) = &H5E

    source97(10) = &H28

    source97(11) = &HE6

    source97(12) = &H13

    '**********************************************************

    '将未加密ACCSEE2000中的67-106位的值并赋给数组source2000()

    '**********************************************************

    source2000(0) = &H20

    source2000(1) = &H6D

    source2000(2) = &HEC

    source2000(3) = &H37

    source2000(4) = &HFB

    source2000(5) = &HD2

    source2000(6) = &H9C

    source2000(7) = &HFA

    source2000(8) = &H60

    source2000(9) = &HC8

    source2000(10) = &H28

    source2000(11) = &HE6

    source2000(12) = &HB5

    source2000(13) = &H20

    source2000(14) = &H8A

    source2000(15) = &H60

    source2000(16) = &HF2

    source2000(17) = &H2

    source2000(18) = &H7B

    source2000(19) = &H36

    source2000(20) = &H53

    source2000(21) = &HE4

    source2000(22) = &HDF

    source2000(23) = &HB1

    source2000(24) = &HD1

    source2000(25) = &H62

    source2000(26) = &H13

    source2000(27) = &H43

    source2000(28) = &H69

    source2000(29) = &H39

    source2000(30) = &HB1

    source2000(31) = &H33

    source2000(32) = &H92

    source2000(33) = &HF7

    source2000(34) = &H79

    source2000(35) = &H5B

    source2000(36) = &H34

    source2000(37) = &H23

    source2000(38) = &H7C

    source2000(39) = &H2A

    '读取命令对话框中所选的文件

    CommonDialog1.ShowOpen

    CommonDialog1.DialogTitle = "打开ACCESS数据库文件"

    If (CommonDialog1.FileName = "" Or Mid(CommonDialog1.FileName, Len(CommonDialog1.FileName) - 2, 3) <> "mdb") Then

       i = MsgBox("您未选择文件或选择的文件不是ACCESS数据库文件", vbOKOnly + vbCritical, "注意")

       Exit Sub

    End If

    Open CommonDialog1.FileName For Binary As #1

    Get #1, 21, temp

    If temp = &H0 Then‘判断ACCESS数据库的版本号

        For i = 0 To 12

            Get #1, 67 + i, temp '逐次读取头文件中67-79位放入temp中,并与source97中各元素异或返回密码

            If temp = source97(i) Then Exit For '加密位读取完毕

            password = password & Chr((temp Xor source97(i)))

        Next

        Close #1

        If Len(password) = 0 Then

            Text1.Text = "该数据库没有加密!"

        Else

            Text1.Text = "该数据库的密码为:" + password

        End If

    Else

        If temp = &H1 Then

            For i = 0 To 39 Step 2

            Get #1, 67 + i, temp '逐次读取头文件中67-79位放入temp中,并与source2000中各元素异或返回密码

            If temp = source2000(i) Then Exit For '加密位读取完毕

            password = password & Chr((temp Xor source2000(i)))

            Next

            Close #1

            If Len(password) = 0 Then

                Text1.Text = "该数据库没有加密!"

            Else

                Text1.Text = "该数据库的密码为:" + password

            End If

        End If

    End If

End Sub

是不是ACCESS真的这么脆弱呢,其实你完全可以在数据库头文件的其他固定位与已存储的固定数据位上做文章,如何做这个丰富的想象空间就留给朋友们了!

上一篇: C# FAQ for C++ programmers
下一篇: 常用CSS2基本定义例子

Google
 
热点文章
关于我们 | 联系我们 | 广告服务 | 工作机会 | 版权声明 | 欢迎投稿 | 网站地图
Copyright © 2000-2008 , www.21tx.com , All Rights Reserved .
晨新科技 版权所有 Created by TXSite.net