Access 2000 (Jet 4.0) 資料庫密碼保護極其脆弱,一小段 VB6 程式碼即可破解。本文深度剖析破解原理 (利用資料庫建立日期作為加密金鑰),提供兩大防範策略:隱藏真實建立日期 與 啟用用戶級安全機制,並附完整 VB6 實作代碼。
&H43 (67 位元組) 起始處,每字元佔 2 位元組 (Unicode)。&H43 起始的 20 組雙位元組 (對應最長 20 字元密碼) 作為「明文基準」。密碼明文 = 參考檔資料 XOR 目標檔資料使用 Win32 API (CreateFile、SetFileTime、SystemTimeToFileTime、LocalFileTimeToFileTime) 將檔案的建立時間修改為普通日期 (如 2001/03/13 12:00:26)。
VB6 實作核心代碼片段:
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _
ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function SetFileTime Lib "kernel32" _
(ByVal hFile As Long, lpCreationTime As FILETIME, ByVal lpLastAccessTime As Long, ByVal lpLastWriteTime As Long) As Long
Private Declare Function SystemTimeToFileTime Lib "kernel32" _
(lpSystemTime As SYSTEMTIME, lpFileTime As FILETIME) As Long
Private Declare Function LocalFileTimeToFileTime Lib "kernel32" _
(lpLocalFileTime As FILETIME, lpFileTime As FILETIME) As Long
' 設定目標檔案建立時間為 2001/03/13 12:00:26
Dim sysTime As SYSTEMTIME, fileTime As FILETIME, localTime As FILETIME, hFile As Long
sysTime.wYear = 2001: sysTime.wMonth = 3: sysTime.wDay = 13
sysTime.wHour = 12: sysTime.wMinute = 0: sysTime.wSecond = 26
sysTime.wMilliseconds = 0
Call SystemTimeToFileTime(sysTime, localTime)
Call LocalFileTimeToFileTime(localTime, fileTime)
hFile = CreateFile("目標.mdb", GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
Call SetFileTime(hFile, fileTime, 0, 0)
Call CloseHandle(hFile)
效果: 破解者需嘗試大量日期組合 (若相差百年需數萬次嘗試),大幅增加破解成本。但屬「治標」,需配合策略二。
.mdw),定義使用者/群組,指派物件權限 (讀取、寫入、設計、管理)。代價: 單用戶使用較繁瑣 (需登入)、開發/部署複雜度提高。但在有安全風險環境下必要。
道高一尺,魔高一丈。**沒有絕對安全,只有持續提高攻擊成本**。結合架構改良 (用戶級安全)、混淆手段 (隱藏日期)、升級平台 (ACCDB)、應用層加密、備份策略,才能讓 Access 資料庫在惡意環境中生存。