Windows核心新手上路2——掛鉤shadow SSDT

whatday發表於2013-07-20

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:上面都是一些思路,沒有涉及程式碼,還需要一步步去實踐驗證。

相關文章