目錄
系統屏蔽相關熱鍵主要是屏蔽相關係統快捷鍵功能,例如Alt+F4、Win+Tab、CTRL+ALT+ESC等,通過全局鍵盤鉤子可以屏蔽大 部分系統快捷鍵,但是有一種快捷鍵與其他的快捷鍵響應方式不同,其不是在應用程序層次響應,在操作系統啓動時,系統就將該熱鍵註冊爲安全序列,應用程序級別是無法獲得該組合鍵的消息的,經過一週的調研,發現在windows系統系列中,XP和win7及以上系統對於該組合快捷鍵的處理方式不同,目前可以實現在xp系統中的Ctrl+alt+delete快捷鍵功能的屏蔽,而win7系統只能通過其他方式實現“曲線屏蔽”。
1.XP中Ctrl+alt+delete
WInlogon進程是用戶登陸程序,管理用戶登錄和退出。在XP中,Winlogon初始化的時候,CTRL+ALT+DEL 快捷鍵註冊爲操作系統系統的Secure Attention Sequence(SAS)熱鍵,並且在WinSta0 Windows 系統中創建三個桌面。 SAS熱鍵的註冊使得Winlogon成爲第一個處理CTRL+ALT+DEL的進程,所以保證了沒有其他應用程序能夠處理這個熱鍵。
當用戶按下Ctrl-Alt-Delete組合鍵時,Winlogon桌面上的SAS窗口收到它註冊的系統熱鍵消息(WM_HOTKEY) ,此時窗口調用Graphical Identification and Authentication(GINA)動態連接庫中的相關函數,因此網上存在許多重寫GINA.Dll實現屏蔽ctrl+alt+delete功能的方法,此處採用的截獲WM_HOTKEY的方式實現屏蔽XP系統中Ctrl+Alt+delete快捷鍵功能。其基本屏蔽流程如下:
- 查找winlogon進程
1)首先需要獲得調試權限主要通過winAPI接口 AdjustTokenPrivileges來提升權限,已獲得打開進程的權限。
2)通過進程名稱獲得對應的進程id。
通過CreateToolhelp32Snapshot獲得第一個進程句柄,而後通過Process32Next函數循環獲得所有進程句柄,再循環過程中獲取進程句柄的名稱與查找的進程名稱比較,如果相同則返回進程id,否則繼續循環。
- 獲得函數地址和dll路徑
1)獲得loadLibrary函數位置
因爲操作系統在每個進程中都會講Kernel32.dll映射到同一位置,因此獲得獲得該句柄下的loadlibrary函數位置就是winlogon進程中的函數位置。
LPTHREAD_START_ROUTINE lpfnThreadRun = (LPTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(("Kernel32")), "LoadLibraryW");
2)在winlogon進程中分配內存,並將dll路徑寫入。
int nSize = (m_sDllPath.length() + 1) * sizeof(TCHAR);
lpszRemoRam = (LPTSTR)VirtualAllocEx(hRemoProcess, NULL, nSize, MEM_COMMIT, PAGE_READWRITE);
// 此時對於目標進程應具有PROCESS_VM_OPERATION和PROCESS_VM_WRITE
bRet = WriteProcessMemory(hRemoProcess, lpszRemoRam, (LPCVOID)m_sDllPath.c_str(), nSize, NULL);
- 在進程中注入dll
在winlogon進程中創建新線程,並載入我們提前寫好的動態鏈接庫。
// 創建遠程線程,利用LoadLibrary加載DLL
// CreateRemoteThread的第四個參數要求一個定義自LPTHREAD_START_ROUTINE的函數
// 這個函數會在遠程線程啓動地址空間時調用
hRemoThread = CreateRemoteThread(hRemoProcess, NULL, 0, lpfnThreadRun, lpszRemoRam, 0, NULL)
CreateRomoteThread除了第一個參數與CreateThread不同外,其餘參數完全相同,其中第一個參數爲進程句柄,用於標識所建線程屬於哪個進程,其餘參數在使用過程中一定要注意因爲不是在本進程中創建線程,因此需要獲得函數、字符創在指定進程中的地址,才能遠程注入線程成功。
- 獲得SAS window窗口
在winlogon桌面中枚舉所有窗口,並根據窗口名稱獲得名稱爲“SAS Window”的窗口句柄。
- 窗口子類化
窗口子類化是指通過設置子類屬性用以替換原有的屬性和方法,主要通過以下函數實現:
LONG WINAPI SetWindowLongW( __in HWND hWnd, __in int nIndex, __in LONG dwNewLong);
說明:
1)Hwnd說明所要子類化的窗口句柄。
2)nIndex是進行子類化的屬性,不同的值對應着不同的屬性,如下圖所示
3)dwNewLong標識着對應的新屬性值,當nIndex爲GWL_EXSTYLE時,其值可以爲WS_EX_TOPMOST、WS_EX_TOOLWINDOW等。
4)返回值爲原有的屬性值。
因爲此處用於替換窗口的消息處理機制,因此nINdex = GWL_WNDPROC.此時dwNewLong對應着是消息回調函數,其定義如下:
- 截獲熱鍵消息
通過熱鍵消息,獲取當前按下的熱鍵是否爲ctrl+alt+delete,如果是則屏蔽該消息,如果不是則調用原有的熱鍵處理機制,lOldproc(在設置時記錄下返回值),最終實現了ctrl+alt+delete快捷鍵的屏蔽。
2.Win7屏蔽Ctrl+alt+delete組合鍵
在 Windows 7 中使用全新的 Credential Provider API 來取代原本的 GINA 機制(參見附錄1)進行用戶登錄管理,在winlogon進程中根本就沒有“SAS window”窗口,因此通過6.1節的方式屏蔽式不可行的,通過網上調查及測試,發現目前可以參考的只有兩種,一種是掛起winlogon.exe進程,另一種是通過關閉ctrl+alt+delete的相關屬性,來曲線完成屏蔽調查資源管理器功能,第一種方法已經在上一篇彙報中進行了描述,這裏不再贅述。簡單描述一下通過設置用戶屬性來屏蔽的功能。
打開組策略設置界面,如下圖所示:
將刪除更改密碼、鎖定計算機等任務全部啓動,此時按下Ctrl+alt+delete組合鍵進入鎖屏界面,如下圖所示:
此時無法通過鎖屏桌面調用任務管理器,進入系統後,右鍵任務欄發現任務管理器菜單項處於灰色不可用狀態,
該策略對應註冊表中如下位置
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableTaskMgr"=dword:00000001(禁止用戶運行任務管理器)"DisableLockWorkstation"=dword:00000001(禁止用戶鎖定計算機)
"DisableChangePassword"=dword:00000001(禁止用戶改變密碼)
即通過修改註冊表的值既可以實現上述的屏蔽過程,此種方法ctrl+alt+delete依然能夠響應,但是無法通過鎖屏桌面進入任務管理器。
3.附錄一
在 Windows XP 和 Windows Server 2003 下是使用 Microsoft Graphical Identification and Authentication (GINA, msgina.dll) 來做為使用者登入,而 GINA 是透過串接的方式來串接每一種身份驗證機制,例如自訂 GINA 將指紋辨識串接到原本的 Windows XP 使用者帳號密碼驗證之後,這會þ帶來一個大問題,那就是當 GINA 串列前面的驗證程式更新後,有可能會þ造成 GINA 串列斷掉,讓後面的驗證程式失效,例如做完 Windows Update 更新了預設的使用者帳號密碼驗證模組,結果造成使用者先前另外安裝的指紋辨識程式無法在登入時r使用。
在 Windows 7 中使用全新的 Credential Provider API 來取代原本的 GINA 機制,Windows 7 中可以同時r掛載多個 Credential Provider,這樣的概念有點像使用 ODBC 存取不同類型的資料庫一樣,這些 Credential Provider 之間是以併聯的方式組成,因此彼此之間並不會þ有任何干擾。
新的機制會þ造成原本的驗證應用程式失敗,例如:
- 生物測定設備,例如指紋辨識
- 自訂 VPN 解決方案
- 智慧卡讀卡機
解決方式: 升級你的應用程式,以便支援新的 Winlogon 架構,除此之外,Windows 7 已經內建智慧卡驗證了,所以就不需要另外安裝智慧卡驗證程式。
說明:附錄摘自:windows開發人員中心
網址:https://msdn.microsoft.com/zh-tw/windows/gg537074.aspx