Windows核心新手上路2——掛鉤shadow SSDT
Windows核心新手上路2——掛鉤shadow SSDT
文章核心內容:安全軟體視窗保護、安全輸入、截圖保護的一些思路。掛鉤NtUserFindWindowEx、NtUserGetForegroundWindow、NtUserBuildHwndList、NtUserQueryWindow、NtUserWindowFromPoint、NtUserSetParent、NtUserPostMessage、NtUserMessageCall、NtUserSetWindowLong、NtUserShowWindow、NtUserDestroyWindow、NtUserCallHwndParamLock用於視窗保護,掛鉤了NtUserSendInput、NtUserGetAsyncKeyState、NtUserOpenDesktop、NtUserTranslateMessage用於安全輸入,掛鉤NtGdiBitBlt、NtGdiStretchBlt用於截圖保護。
a) Shadow SSDT簡介
Shadow SSDT,亦可稱SSSDT,英文全名Shadow System Services Descriptor Table,中文直譯“陰影系統服務描述表”。Shadow SSDT管的是圖形、使用者相關的函式(gdi32.dll、user32.dll)。
SSDT SHANDOW的結構跟SSDT的結構類似(見Windows核心新手上路1——掛鉤SSDT)。
shadow SSDT的Win32子系統的核心實現是WIN32K.SYS,屬於GUI執行緒,要切換到GUI執行緒,沒有匯出表,在windbg中可以用db KeServiceDescriptorTableShadow
檢視地址,但是程式設計中只能通過SSDT的到處來搜尋定位。
掛鉤shadow SSDT的方法類似於掛鉤SSDT,有一點不同的是,在掛鉤前,必須將程式上下文切換到CSRSS程式。
shadow SSDT中函式列表的地址 名稱是 W32pServiceTable 它是一個未匯出的變數 可以通過 db win32k!W32pServiceTable 來檢視
1.1 視窗保護
惡意程式通過獲取安全軟體的視窗控制程式碼,然後通過關閉、隱藏、禁用等手段破壞其正常工作,需要掛鉤這些函式來防止惡意程式的破壞。R3和R0函式對應關係如表1所示。
表1 R3-R0函式對於關係
R3 |
R0 |
作用 |
FindWindow |
NtUserFindWindowEx |
查詢視窗獲取控制程式碼 |
GetForegroundWindow |
NtUserGetForegroundWindow |
得到當前頂層視窗 |
EnumWindows |
NtUserBuildHwndList |
列舉所有頂層視窗 |
GetWindowThreadProcessId |
NtUserQueryWindow |
獲取控制程式碼對應的程式PID |
WindowFromPoint |
NtUserWindowFromPoint |
獲取所在位置的視窗控制程式碼 |
SetParent |
NtUserSetParent |
改變某個子視窗的父窗 |
PostMessage |
NtUserPostMessage |
傳送訊息 |
SendMessage |
NtUserMessageCall |
傳送訊息 |
SetWindowLong |
NtUserSetWindowLong |
改變視窗屬性 |
ShowWindow |
NtUserShowWindow |
改變視窗顯示狀態 |
DestroyWindow |
NtUserDestroyWindow |
銷燬視窗 |
EnableWindow |
NtUserCallHwndParamLock |
禁用、啟用視窗 |
1.2 安全輸入
掛鉤NtUserSendInput、NtUserGetAsyncKeyState、NtUserOpenDesktop、NtUserTranslateMessage分別用於防止模擬按鍵、獲取鍵盤按鍵狀態、開啟安全桌面、將虛假按鍵還原成真實的按鍵。
a) NtUserSendInput
惡意程式可以通過呼叫SendInput來模擬按鍵干擾正常輸入,可以掛鉤NtUserSendInput防止惡意操作。當使用者正在輸入密碼等隱私資訊的時候,禁止其他程式呼叫SendInput模擬鍵盤和滑鼠操作。
b) NtUserGetAsyncKeyState
惡意程式可能不停的呼叫NtUserGetAsyncKeyState來獲取鍵盤的按鍵狀態從而記錄鍵盤的輸入資訊,可以掛鉤NtUserGetAsyncKeyState用來禁止此類鍵盤記錄行為。當使用者正在輸入密碼等隱私資訊的時候,禁止其他程式呼叫NtUserGetAsyncKeyState,但是不會阻止當前受保護的程式呼叫(否則會影響正常的密碼輸入行為)。
c) NtUserOpenDesktop
在Windows作業系統中,訊息鉤子(通過SetWindowsHookEx設定)只會當前的桌面上的視窗有效,所以,可以建立一個安全桌面,用於執行需要嚴密保護的程式,這樣,非本桌面上執行的程式無法通過訊息鉤子的方式來獲取需要保護程式視窗的資訊,達到了保護目標程式視窗的目的(360保險箱和金山密保都有一個叫安全桌面的功能,正是這樣實現的)。
首先呼叫真實的NtUserOpenDesktop函式,然後獲取返回控制程式碼的桌面名字,如果此桌面名字跟建立的安全桌面名字一樣,則關閉此桌面控制程式碼,並返回一個NULL值,否則返回真實的控制程式碼。達到保護安全桌面的目的,真正做到安全桌面不可滲透。
d) NtUserTranslateMessage
在輸入密碼的時候,使用者程式一般呼叫TranslateMessage將訊息轉化為具體的按鍵資訊,利用此特點,可以構建一個DirectInput安全輸入通道,即儘可能少的通過Windows系統的鍵盤按鍵傳輸通道(此通道是極度危險的,惡意程式可以在任意位置新增HOOK截獲按鍵資訊)。
對NtUserTranslateMessage的掛鉤用於修正虛擬鍵盤輸入的虛擬按鍵,首先需要判斷是否正在輸入密碼,虛擬鍵盤是否正在執行,是否需要修正按鍵,這三個引數都是執行於R3的控制程式傳遞進來給R0驅動的。然後判斷訊息是否是鍵盤按鍵的訊息,如果是,則進一步判斷此訊息是否對應虛假按鍵,如果是,則修正為真實的按鍵。虛假的按鍵和真實的按鍵也是R3傳遞給R0驅動的。整個輸入通道完全自己構建,不通過Windows系統提供的任何通道,所有的型別的HOOK都無法在此期間截獲虛擬鍵盤輸入的密碼(很多安全軟體提供的虛擬鍵盤的思路大致如此吧,沒有去仔細調研)。
1.3 截圖保護
很多截圖類的鍵盤記錄程式。當使用者在虛擬鍵盤上按下一個鍵時,惡意程式就截一次螢幕,這樣可以清楚地看到使用者輸入的密碼資訊。掛鉤兩個函式NtGdiBitBlt、NtGdiStretchBlt可以用於防截圖。
卡巴斯基反病毒軟體率先推出截圖保護,即當虛擬鍵盤執行的時候,阻止程式進行截圖操作,在一定程度上可以阻止此類鍵盤記錄工具的工作。但是卡巴斯基有一個很大的缺陷,它只能阻止全屏的截圖,不能阻止部分螢幕的截圖。
PS:上面都是一些思路,沒有涉及程式碼,還需要一步步去實踐驗證。
相關文章
- Windows核心新手上路1——掛鉤SSDTWindows
- Windows核心新手上路3——掛鉤KeUserModeCallBackWindows
- Windows核心驅動學習(六)程式碼注入與核心掛鉤Windows
- ROS新手上路-3ROS
- Linux新手渣渣上路史Linux
- 專案管理新手上路(轉)專案管理
- 懵懂新手上路經驗總結
- 「新手上路」Go 微博授權登入Go
- 新手上路之如何選擇Java版本Java
- 軟體專案經理新手上路2 – 力量從哪裡來?薦
- 新手上路:Oracle基礎工具簡介(轉)Oracle
- 阿里雲ECS雲伺服器新手上路阿里伺服器
- 往linux核心掛鉤子–什麼應該什麼不應該Linux
- Windows訊息鉤取Windows
- WINDOWS鍵盤事件的掛鉤監控原理及其應用技術Windows事件
- “龍井”開箱評測 |Alibaba Dragonwell 新手上路指南Go
- 簡易撲克牌遊戲JAVA原始碼_新手上路遊戲Java原始碼
- WINDOWS鉤子函式(轉)Windows函式
- 新手上路:三分鐘搭建 golang 開發環境Golang開發環境
- 安卓外掛化框架Shadow原理分析安卓框架
- 用 Thunk 實現 COM 的掛鉤
- 7- Windows訊息鉤取Windows
- 外掛移植後,鉤子不起作用。
- 「Window平臺」異常掛鉤大法(1)
- 系統呼叫篇——SSDT
- SSDT結構簡記
- SSDT表概念詳解
- 破解sonique的外掛Dee2的核心dee2.dll
- Pycharm常用的小技巧彙總,Python新手上路必備,快上車!PyCharmPython
- Windows核心Windows
- Windows訊息鉤取(簡單DLL注入)Windows
- Sublime Text 3 新手上路:必要的安裝、設定與基本使用教學
- [MetalKit]32-Shadows-in-Metal-part-2陰影2
- 與遊戲頻繁掛鉤的SCP是什麼?遊戲
- Windows NT 核心Windows
- Windows Terminal 新手入門Windows
- 有關windows鉤子使用的兩篇文章Windows
- Node.js新手上路——動手擼一個靜態資源伺服器Node.js伺服器