眾所周知,Windows 9x 系列僅屬桌面級作業系統,其穩定性與保密性長期備受詬病。本文將透過深入剖析 Windows 98 螢幕保護程式(以下簡稱螢保)密碼的加密演算法,揭示其安全機制的脆弱性,並示範如何編寫程式提取明文密碼,以供技術研究與防禦參考。
Windows 98 的螢保密碼明文長度上限為 128 個字元,字元集包含英文字母、數字及可見標點符號(即可列印 ASCII 字元)。加密後的密文長度為明文的兩倍,以二進位值形式儲存在登錄機碼 HKEY_CURRENT_USER\Control Panel\Desktop 下的 ScreenSave_Data 值中。
00h 作為結束標記。假設密碼為 visual basic,轉大寫後為 VISUAL BASIC。對應 ASCII 碼與固定密鑰異或後,得到十六進位字串 1EA72548262581593BDF0EBB。將此字串每字元再轉為 ASCII 碼(如 1→31h, E→45h...),最終寫入登錄的二進位資料為:
31,45,41,37,32,35,34,38,32,36,32,35,38,31,35,39,33,42,44,46,30,45,42,42,00
由於演算法已知且密鑰固定,我們可透過「選擇明文攻擊」輕鬆還原完整 128 Bytes 密鑰:
實測獲得的 128 Bytes 密鑰(十六進位)如下:
48 EE 76 1D 67 69 A1 1B 7A 8C 47 F8 54 95 97 5F
78 D9 DA 6C 59 D7 6B 35 C5 77 85 18 2A 0E 52 FF
00 E3 1B 71 8D 34 63 EB 91 C3 24 0F B7 C2 F8 E3
B6 54 4C 35 54 E7 C9 49 28 A3 85 11 0B 2C 68 FB
EE 7D F6 6C E3 9C 2D E4 72 C3 BB 85 1A 12 3C 32
E3 6B 4F 4D F4 A9 24 C8 FA 78 AD 23 A1 E4 6D 9A
04 CE 2B C5 B6 C5 EF 93 5C A8 85 2B 41 37 72 FA
57 45 41 A1 20 4F 80 B3 D5 23 02 64 3F 6C F1 0F
掌握演算法與密鑰後,即可使用 Visual Basic 6.0 編寫解密工具。核心邏輯為:讀取登錄 ScreenSave_Data、還原十六進位字串、與密鑰異或、轉換為可見字元。受篇幅限制,完整程式碼略過,關鍵在於正確處理登錄二進位資料讀取與字元編碼轉換。
許多 VB 教學書籍著重於螢保的啟動參數、鍵鼠事件攔截、AlwaysOnTop 實現等,鮮少涉及密碼驗證。實際上,只需在滑鼠/鍵盤回應事件中加入密碼確認邏輯即可。相關登錄參數包括:
ScreenSaveTimeOut:等待時間(秒)ScreenSaveActive:啟用旗標(1=啟用,0=停用)ScreenSaveUsePassword:密碼保護旗標(1=啟用,0=停用)開發自製螢保時,可依據 ScreenSaveUsePassword 決定是否啟用密碼驗證。
切勿重複使用重要密碼! 若以銀行提款密碼作為螢保密碼,攻擊者極易竊取。本文旨在揭示 Windows 98 螢保加密的脆弱性,提醒使用者提升安全意識,並為開發者提供防禦參考。現代作業系統(Windows 2000/XP 及更新版本)已大幅強化此機制,不再適用本文攻擊手法。