windows系統屏蔽熱鍵(進程注入 窗口子類化)

目錄

1.XP中Ctrl+alt+delete

2.Win7屏蔽Ctrl+alt+delete組合鍵

3.附錄一


系統屏蔽相關熱鍵主要是屏蔽相關係統快捷鍵功能,例如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_TOPMOSTWS_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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章