1、第10章 安 全 处理加了密码的MDB数据库文件 当 MDB 文件加了密码,直接由 Access 打印MDB文件时,会出现密码对话框,询问密码。但是若要由 VB或BA程序中打印,必須更改B和VBA序中打开MDB文件的指令,否则会出现错误信息!以下针对各种情况,分別加以说明: 1、 使用 DAO 命令打开MDB文件: OpenDatabase 若要由程序中打开,命令如下: Set DB = OpenDatabase(DatabaseName, False, False, ";Pwd=密码") 实例: Dim db As Database Set
2、 db = OpenDatabase("C:\db1.mdb", False, False, ";Pwd=1") 若要使用 Data 控件,设定方法如下: 1、设定 DatabaseName 属性 (MDB文件名称 / 含路径) 2、设定 Connect 属性,將预设的字串 "Access" 改成 ";Pwd=密码" (不含双引号) 3、设定 RecordSource 属性 2、使用 ADO 命令打开MDB文件: 在使用 ADODC 或 DataEnvironment 设定好之后,直接利用属性窗口修改 ConnectionString 属性(附属于 AD
3、ODC) 或 ConnectionSource 属性(附属于 DataEnvironment 的 Connection 控件),修改的方法是在属性之后增加以下参数: ;Jet OLEDB:Database Password=密码 除了 ADODC 及 DataEnvironment 之外, 直接使用 ADO 控件來打开含有密码的 mdb MDB文件,设定参数的方法也是相同的。 3、压缩加了密码的MDB文件:CompactDatabase DBEngine.CompactDataBase "原MDB文件", "新MDB文件", , , ";pwd=密码" 实例
4、例如: DBEngine.CompactDatabase "C:\Db1.mdb", "C:\Db2.mdb", , , ";pwd=1" 4、复加了密码的MDB文件: RepairDatabase 不必理会MDB文件设定的密码! DBEngine.RepairDataBase "MDB文件" 实例例如: DBEngine.RepairDataBase "C:\Db1.mdb" 以下给出一个函数可以使用DAO打开带密码保护的MDB数据库文件: Public Function OpenPasswordProtectedDatabase(
5、DBPath As String, _ Password As String) As Object On Error Resume Next Dim db As DAO.Database Set db = DAO.OpenDatabase(DBPath, False, False, _ ";pwd=" & Password) If Err.Number = 0 Then Set OpenPasswordProtectedDatabase = db Else
6、 Set OpenPasswordProtectedDatabase = Nothing End If End Function 其中参数DBPath为数据库文件的有效路径名称;参数Password为密码。 该函数需要引用DAO数据库才有效。 如何调出工作组对话框 调出“用户与组帐号”对话框:DoCmd.DoMenuItem acFORMBar, 6, 5, 2, acMenuVer70 调出“用户与组权限”对话框:DoCmd.DoMenuItem acFORMBar, 6, 5, 1, acMenuVer70 以上语句在office2000里测
7、试通过 试用版限制时间与日期的方法 可用注册表简单地保存已用的天数或次数 ' 次数限制(如30次): Private Sub Form_Load() Dim a As Long Dim b As Long b = GetSetting("MyApp", "set", "times", 51345) a = b Xor 51345 If a < 30 Then MsgBox "现在剩下:" & 30 - a & "试用次数,好好珍惜!" a = a + 1 b = b Xor 51345 SaveSetting "MyApp
8、", "set", "times", b Else MsgBox "试用次数已满,请联系gfuuyygy!" End If End Sub '时间限制的(如10天) Private Sub Form_Load() Dim a As Long a = GetSetting("MyApp", "set", "day", 0) If a = 10 Then MsgBox "试用期已过,请联系gfuuyygy!" Else MsgBox "现在剩下:" & 10 - a & "试用天数,好好珍惜!" if day(now
9、)-a>0 then a = RemainDay + 1 SaveSetting "MyApp", "set", "times", a End if End if End Sub 在 Windows 注册表中 或 (Macintosh中)应用程序初始化文件中的信息保存或建立应用程序项目。 语法 SaveSetting appname, section, key, setting SaveSetting 语句的语法具有下列命名参数: appname 必要。字符串表达式,包含应用程序或工程的名称,对这些应用程序或工程使用设置 在Macintosh
10、中,这是System文件夹中Preferences文件夹中初始化文件的文件名。 section 必要。字符串表达式,包含区域名称,在该区域保存注册表项设置。 key 必要。字符串表达式,包含将要保存的注册表项设置的名称。 setting 必要。表达式,包含 key 的设置值。 说明 如果无论如何也不能保存注册表项设置,则将导致错误发生。 示例 首先使用 SaveSetting 语句来建立Windows注册区(或 16位 Windows 平台的.ini档)里 appname 应用程序的项目,然后使用 GetSetting 函数来得到其中一项设置并显示出来。
11、因为有传入参数 default,GetSetting 函数一定会有返回值。请注意,section 名称不能用 GetSetting 函数取得。最后,使用 DeleteSetting 语句将该应用程序项删除。 ' 用来保存 GetSetting 函数所返回之二维数组数据的变量。 Dim MySettings As Variant ' 在注册区中添加项目。 SaveSetting "MyApp","Startup", "Top", 75 SaveSetting "MyApp","Startup", "Left", 50 Debug.Print GetSetting(appn
12、ame := "MyApp", section := "Startup", key := "Left", default := "25") DeleteSetting "MyApp", "Startup" 显示信息文件中的用户身份 =CurrentUser() 如何不通过设置工程密码锁定VBA代码? 1、打开二进制编辑软件,我用的是UltraEdit 2、在二进制编辑软件里打开你要加密的mdb文件 3、按CTRL+F调出查找对话框 4、在查找对话框里输入要查找的字符串:ID="{ 5、在"查找ASCII"前打勾,然后按“查找下一个” 6、找到后更改ID=
13、"{后的一个字符为其它字符,并记住该字符在改之前的值(因为解锁的时候要改回来。 7、保存更 现在打开你的mdb文件并查看VBA代码 Open "D:\VB6_T ' 打开被密码保护的数据库 Open "D:\VB6_Test\MDB_Password\Pass_Protected_DB.mdb" For Binary As #2 Seek # Seek #2, Offset Get #1, , bEmpty ' 其中每位密码占两个字节 Get #2, , bPass ' 一个汉字也仅是一位密码,占两个字节 If (bEmpty(1) Xor bPa Password
14、 = Password + Chr(bEmpty(1) Xor bPass(1)) ' 将密码解密 End If Next Close 1, 2 MsgBox "Password:" + Password ' 显示密码 End Sub 下图显示了 Access 20 一、深入分析 上述程序成功的关键是使用 数据库(Pass_Protected_DB 码。 下图是在 Windows资源管理器 应注意的是:上面的“创建日期”只是操作系统级的,也就是 Win 的长短,每个文件在目录里占用至少32个字节,包括:文件名、属性 间和访问时间等)。 Ac
15、cess 2000 在数据库中也记录了该数据库的“创建日期”。加密数据库 日期”。该日期只有在数据库被成功打开后才能看到。但在一般情况 建日期”是完全一样的,因此这为破译者提供了方便。 上述程序中还有一点需要说明:为简明 效。若要解密汉字密码,须对双字节均做处理。 二、防范措 1、隐藏“创建日期” 从上面的分析可以看出,既然“创建日期”是破译的关键,那么我们 来。 第一步,创建数据库时,使用一个“不可思议的、别人 改为2026年05月15日,创建数据库后再将系统日期改回 期”。 第二步,修改操作系统级的“创建日期”。上述第一步完成后 5月15日,必
16、须加以修改,以达到隐 二完成。 ' 程序二(VB6):修改文件在操作系统级的“ Private Ty dwLowDateTime As Long dwHighDateTime As Long End Type Private Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer
17、 wMilliseconds As Integer End Type Private Const GENERIC_WRITE Private Const O Private Const FILE_SHARE_READ = &H1 Private Sub Command1_Click() Dim Year As Integer, Month As Integer, Day As Integer Dim Hour As Integer, Minute As Integer, Second As Integer Dim TimeStamp As Variant, Y
18、ear = 2001: Month = 3: Day = 13 ' 准备设定的“创建日期” Hour = 12: Minute = 0: Second = 26 TimeStamp = DateSerial(Year, Month, Day) + TimeSerial(Hour, Minute, Filename = X = ModifyFileStamp(Filename, TimeStamp) End Sub Function ModifyFileStamp(Filename As String, TimeStamp As Variant) As Integer
19、Dim X As Long, Handle As Long, Sy Dim File_Time As FILETIME, Local_Time As FILETIME System_Time.wYear = Year( System_Time.wDay = Day(TimeStamp) System_ime.wDayOfWeek = Weekday(TimeStamp) - 1 System_Time.wHour = Hour(TimeStamp): System_Time.wSecond = Second(TimeStamp) System_Time.wMilliseconds
20、 0 X = SystemTimeToFileTime(System_Time, Local_Time) X = LocalFileTimeToFileTime(Local_Time, File_Time) ' 转换成可用的类型 Handle = CreateFile(Filename, GENERIC_WRITE, FILE_SHARE_READ Or _ FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) ' 打开文件 X = SetFileTimeWrite(Handle, File_Time, ByVal 0&, ByVal
21、 0&) ' 设置日期 CloseHandle Handle ' 关闭文件 End Function 图三显示的是数据库的真实“创建日期”以及经程序二伪装的操作系统级的“假象”日期。 可以看出,隐藏 方法与下述的“方法二”相结合,才能达 2、使用用户级安全机制 通过设置不同的用户帐号和组帐号对数据库中的各种 设置各种帐号及相应权限的简单方法是使用“设置安全机制 三、结论 所谓“道高一尺魔高一丈”,因为这世上并没有绝对的安全。上述方法一的目的是 以接受的程 ss 2000数据库的密码忘了 在Access 2000 数据库中, 介绍一种密码破解方法。 用磁
22、盘编辑工具打开Access 2000 所建的数据库,在库文 为:29 77 EC 37 F2 C8 9C 的密码,只要将00000042 处开始的40个字节还原成原始数据就行了。要做到这一点,你可用磁盘编辑工具或将以下所附的程序稍加修改,把以上所列40个数据填到00000042开始处。 但是,有没有办法既能破解密码又能保持原密码呢?有。要做到这一点,必须搞清楚Access 2000库的加密原理。事实上,Access 2000库的加密原理很简单。当你设置了密码后,Access 2000 就将你的密码(请注意你所输入的密码是ASCII字符)的ASCII码与以上的40个字节数据进行异或操作,
23、因此,从库文件的地址00000042开始的40个字节就变成了密钥了。例如,如果你设置的密码为12345678901234567890(注意:最多只能设20个ASCII字符),经过异或操作后,则从00000042处开始的40个字节的数据就变成了 18 77 DE 37 C1 C8 A8 FA 5C D2 1E E6 8B 3A B2 60 C2 18 4B 36 6B FE ED B1 EB 78 27 43 55 23 87 33 AC ED 41 5B 04 39 4C 2A 。大家都知道,一个数据经过一次异或操作后,再一次经过同样的异或操作就可还原了。因此,对已经设置了密码的Access
24、2000库,只要将40个密钥数据与原始的40个数据进行一次异或操作就可得到密码了。 顺便提一下,由于ACCESS 2000对每个密码字符采用双字节表示,故40个字节原始数据可依次分为20组,每组代表一个密码字符,进行异或操作的是每组的第一个字节,第二个字节不变 在前端设系统时间与局域网中后端系统时间相同 shell ("net time \\服务器名 /set /yes"),vbHide 链接密码保护的数据库 作者: 朱亦文 function lj() dim catdb as adox.catalog dim tbllink as adox.table set catdb = new
25、adox.catalog catdb.activeconnection = currentproject.connection set tbllink = new adox.table ' 建立一个新的表对象 with tbllink .name = "订单" ' set .parentcatalog = catdb .properties("jet oledb:create link") = true .properties("jet oledb:link datasource") = _ "c:\program files\zhanyexing\123.mdb" .prop
26、erties("jet oledb:link provider string") = _ "ms access;pwd=123;" ' 提供者及密码 .properties("jet oledb:remote table name") = "订单" ' 原数据库中的表 end with catdb.tables.app set tbllink = nothing end function 注:在vba编辑器中引用"microsoft ado ext. 2.5 for ddl and security"以及 rosoft activex data objects 2.1/2.5/2.6/
27、2.7 library" 动手做一个专用解密器 密器也很费时,如果你对 要了解Access数据库的加密方法。A 67至79位为一固定 ,FA,C6,5 ,5E,28 s数据库的解密 tion属性设为“取得 mand1_Click Dim pa te Dim sour = &H86 s &H37 source 4 = &H5D so H9C sour 5E sou H13 Comm ame = ″″ Then Exit Sub Open Comm r Binary As #1 emp = source i The hr temp
28、Xor word = 0 t = ″该数据库的密码为: 后台数据库的方法 地球人都知道,MDB文件很 我用过不少Access密码破解器,大多数 一定有人会说,既然人家能写出破解英文密码的软件,一定也可以写出破解中文密码 MDB的头16个字 动一个或多个字节,Acce 打开文件时, 另一种做法是打开 '使后台可以正常访问 Function OpenHt(HTmdbPath As String) Dim fh As Integer fh = FreeFile Open HTmdbPath For Binary Access Write As #fh
29、 Put fh, 2, &H1 Close #fh End Function '使后台无法正常访问 Function CloseHt(HTmdbPath As String) Dim fh As Integer fh = FreeFile Open HTmdbPa Put fh, 2, &H0 Close #fh End Fu '下面的都是跟后台建立物理连接的函数(必须放在模块 Public HTcn As Connection Public HTrs As New ADODB.Recordset Public HTsql As Str
30、ing '建立物理连接 Function OpenStandHT() Set HTcn = CurrentProject.Connection '表1要改成相应的表名 HTsql = "select * from 表1" HTrs.Open HTsql, HTcn, 3, 3, 1 End Function '关闭物理连接 Fun HT Set End Func Yhcwgl注 Private Sub Form_Open(Cancel As Integer) Dim a As Long Dim b As Long
31、b = GetSetting("MyApp", "set", a = b Xor 51345 If a < 50 Then MsgBox "感谢使用《银 "提示:在注册前,您还有" & 50 - a & "次可以使用!" & vbCrLf & _ " 请您尽快注册! " & vbCrLf & _ " "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ " 欢迎您访问立文工作室" & vbCr "
32、 " & vbCrLf & _ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" & vbCrLf & _ " 联系人:于立文" & vbCrLf & _ " 电话: 13945431870" & vbCrLf & _ " gfuuyygy@ gfuuyygy@" & vbCrLf & _ " " & vbCrLf &
33、 "~~~~~~~~~~~~~~~ a = a + 1 b = a Xor 51 SaveSetting "MyApp", "set", "times", b Else MsgBox "您的试用期已过,请您注册!" & vbCrLf & _ " "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" & vbCrLf & _ " 欢迎您访问立文工作室 " " & vbCrLf & _ "~~~
34、~~~~~~~~~~~~ " 联系人:于立文" & vbCrLf & _ " 电话:13945431870" " gf " " & vbCrLf & _ "~~~~~~~~~~~~~~~~~~~~~~~~ DoCmd.Quit End If End Sub 口令 1、动态口令。即每次登陆的口令是不同的。能够防止他人偷 口令,能防止暴力破解工具的破解。 2、可自定义 3、可自定义每组口令的出错次数。 4、在“口
35、令维护”窗口内三分钟不操作,将提示 5、通过一定的加密手段来保护数 动态口令的使用原理: 每次登陆时,系统会提示一个时间,您根据 动态口令的规则设置: 1、本程序以“@”的符号代表系统提示的时间。 登陆时假定系统以09:03:05时间来提示: 设定的规则 @ 90305 可不参与运 @+1 90306 @&"p" 903 l
36、eft(@,1 2、反正能用“表达式”表达出来 3、在“口令维护”窗体的每一记录就是一个登陆口令的规则,而录入几条记录就有几组口令,和普通入数据是一样的。 现提供 登陆 1、打开“主菜单”窗口前检验是否已登陆,是,则进入“主菜单”界面。否,则进入“登陆”窗体。 2、进入“登陆 验程序。 3、“登陆口令”检验程序,口令 窗口”,否,则打开“主菜单”界面。 4、在口令维护窗口上若连续3分钟无操作 操作,则退出系统。 5、退出“口令维护”窗口时,检验是否设置 “口令维护”界面进行口令的设置。 其他: 1、其实这些功能编 这种的检验,技术也无法提高。
37、2、由于这是本人一时兴起刚刚编制的, 。烦死了。因此也没怎么测试,不敢保证程序没有什么 3、登陆的使用人是结合 登陆效果。 4、本人仅想演绎一下登陆的功 以指定工作组文件启动MDB文件 , 下几种: 1。用快捷方式,在其中加上启动参数指定工作组文件; 2。用ACCESS内置工作组管理员 3。也可以直 4。用VB之类的东东做个外壳启动带参数 第一种方式用户在使用中容易造成丢失。 第二第三种其实是一样的,但设 敝人推荐用 其实 Set fs = Application.FileSearch ''查找文件 With fs .LookIn =
38、 "C:\Program Files\Microso .SearchSubFolders = True .FileName = "msacc If .Execute() > 0 T p = .FoundFiles(1) ''ACCESS主程序完整路径 Shell p & " " & CurrentPro Else MsgBox "C:\Progr End If End With docmd.qu 将外壳做成MDE交付用户便万事大吉啦。 带参数启动程序语句可更改为以下 Shell SysCmd(ac
39、SysCmdAccessDir) rrentProject.Path 注意,如果要将密码和用户 BA中修改安全机制的登录密码 ----------大頭 Private Sub On Error GoT Dim myuser Dim A As Variant Dim B As Variant Dim Glbuser As String Glbuser = CurrentUser A = Me![CO B = If IsNull(A) MsgBox "未取得帳號, GoTo Exit_OkButton
40、 End If Len(A) MsgBox "通行密碼不得 GoTo Exit_OkButton_Click End If Set MyWorkspace = DBEngine.Wor DBEngine.Works MsgBox "通行密碼已變更為" & A, 64, DoCmd.Close Exit_OkButton_Click Exit S Err MsgBox "原有通行密碼不正確,請重新輸 Resume End Sub 和取消shift键的方法(建立、运行模块)1 Sub SetBy
41、passProperty() Const DB_Boolean As Long = 1 ChangeProperty "AllowBypassKey", DB_Boolean, F End Sub Function ChangeProperty(strProp Dim dbs As Object, prp As Variant Const conProp Set dbs = CurrentDb On Error GoTo Change_Err dbs.Properties(strPropName) = varPropValue ChangePropert C
42、hange_Bye: Exit Function Change_Err: If Err = conPropNotFoundE Set prp = dbs.CreateProperty(st varPropType, varPropValue) dbs.Properties.Append prp Resume Next Else ' Unknown err ChangeProperty = False Resume Change_Bye End If End Function 取消屏蔽shift键的方 做一個表 cproperty "Allo
43、wByPassk 再自定義一段SUB如下: Sub cproperty(pName, pType, On Error G Set prp = Curre CurrentD Me![核取0] = pValue Exit Sub ki: Me![核取0] = CurrentDb.P End Sub 確定按鈕的On click事件寫上: CurrentDb.Properties("AllowByPasskey") = Me![核取0] MsgBox "更改完成,必 那麼您要啟動或屏蔽 和取消shift键 Function SetBypassPro C
44、onst DB_Boolean As Long = ChangeProperty "AllowBypassKey", DB_Boolean, False End Function Function Se Const DB_Boolean As Long = 1 ChangeProperty "AllowBypassKey", DB_Boolean, True End Function Function ChangeProperty(strPropName As String, varPropType As Variant, varPropV Dim dbs
45、 As Object, prp As Variant Const conPropNotFoundError = 3270 Set dbs = CurrentDb On Error GoTo Change_Err dbs.Properties(strPropName) = varPropValue ChangeProperty = True Change_Bye: Ex Change_Err: If Err = conPropNotFoundError Then ' Property not found. Set prp = dbs.C
46、reateProperty(strPropName, _ varPropType, varPropValue) dbs.Properties.Append prp Resume Next ' Unknown error. ChangeProperty = False Resume Change_Bye End If End Function 屏蔽: SetBypassPropertyFalse MsgBox "禁用shift设置成功,在下次启动应用程序时生效 取消: S
47、etBypassPropertyTrue MsgBox "启用shift设置成功,在下次启动应用程序时生效。请重新启动程序。", , "设置成功 access的用户密码、数据库密码同时生效的情况下,如何用ADO访问? 试一下下面这个连接串 数据库:C:\db1.mdb 数据库密码:pass 用户: Admin 用户密码: winstar 用户组文件: system.mdw //system.mdw这个文件要放在与 //如果没有这个文件就不行。 设 提供者页:选JET4.0 O LEDB 引擎 边线页:输入数据库路径与名称C:\db1.mdb,用户Admin
48、用 全部页:1、Jet OLEDB:Database Pas 2、Jet OLEDB:System database 输入用户组文件: s //下面是我从ADOConnection1中COPY出 Provider=Microsoft.Jet.OLEDB.4.0;P e Deny None;Extended Properti "";Jet OLEDB:Database Password=pass t OLEDB:Global Partial Bulk Ops=2;Jet OL ssword="";Jet OLEDB:Create System Database=Fals
49、e;Jet OLEDB:Encryp t Copy Locale on Compact=False;Jet e 是现成的工具破解 system.mdw是用户组数据库,里面有所 这个文件是要与.mdb数据库一起发布的。鼠标点过后,0秒 我用的是BCB6+SP2 , MDAC2. 出现:“多步 OLE操作失败,请检查每个OLE状态值,没有工作被完成。” 请用Access打开你的数据库, Provider=Microso are Deny None;Ex \system.mdw;Jet OLEDB: Jet sactions=1;Jet OLEDB:New ncrypt Database=False;Jet lica Repair=False;Jet 我用的是Access2000+Win XP Professinal+B 首先用超级用户在ACCESS里创 户密码改为Us 将C:\program files\microsoft office\office下的system.mdw拷贝到MDB所在的目录。 BCB6中用ADO Connection连接MDB,构造上述连接串,可以连接成功。 通过编程设置数据库密码 按以下语法使用关键字 ALTER DATABASE,您可以编程设置、修改或删除数据库密码。 ALTER






