簡介
幾年前我在CodeGuru 上下載了一個叫 Eureka的程式,如果你忘記了密碼,你可以用程式把密碼“取”回來。它不是密碼破解程式,相反,它利用了一個Windows的安全性漏洞來拷貝另外一個運行中的程式的密碼。我對這個程式高度興趣,決定寫一個自己的版本。後來,Windows 2000 發布,我失望地發現,微軟修補了那個漏洞,這樣一來那個程式在Windows 2000上也就不靈了。經過一番嘗試,我終於找到一個方法拷貝任何在32-位Windows 系統上運行程式的密碼。
本文例子程式:
使用方法:
PasswordSpy程式的使用非常簡單。你只要運行包含忘記了密碼的程式,再運行PasswordSpy。然後將放大鏡拖動到密碼輸入欄位上,PasswordSpy則會將密碼顯示出來。PasswordSpy程式並沒有惡意,開發它的目的只是想把密碼找回來,該程式在Win95/98 /ME and WinNT/2K/XP/Windows 2003 上測試通過。
功能說明:
除了PasswordSpy本身的用途之外,它還示範了一些有用和有趣的代碼:
單一實例應用——如果使用者啟動了PasswordSpy的第二個執行個體,系統會找到第一個執行個體,並在所有視窗的最最上層顯示出PasswordSpy介面;
Always on top——總是在最頂層,只用一行代碼就可以在你的程式中啟動和禁用這個功能;
進程間通訊——PasswordSpy 使用幾種形式的IPC,包括WM_COPYDATA訊息以及記憶體對應檔;
設定視窗鉤子——為了在Windows 2000/Windows XP中吸取密碼,你得使用在遠程進程中置入一個鉤子。
代碼實現細節:
到目前為止,PasswordSpy 程式最有趣的部分其實是使用 SetWindowsHookEx API.函數設定Windows 鉤子。利用該函數你可以將鉤子安裝到作業系統中或者某個特定的進程中。鉤子的種類有很多種,每種鉤子作用也不盡相同,用來監視特定的一組事件。當某一類事件發生時,鉤子代碼被調用。PasswordSpy使用WH_GETMESSAGE鉤子,它監視對GetMessage 和PeekMessage 的調用。關於鉤子更詳細的資訊請參考MSDN庫的SetWindowsHookEx。
我在網上、書本以及MSDN上找到幾個有關鉤子的例子,每個都至少有一個Bug。本文我用自己的方案解決了這些問題。使用Windows鉤子最難的部分是妥善儲存鉤子控制代碼。設定鉤子之前,你需要做兩件事情: