简单实现了下SSDT SHADOW HOOK
介紹:
?? ? ? ?SSDT SHADOW HOOK可用于安全軟件窗口保護、安全輸入、截屏保護等。例如:掛鉤NtUserFindWindowEx、NtUserGetForegroundWindow、NtUserBuildHwndList、NtUserQueryWindow、NtUserWindowFromPoint、NtUserSetParent、NtUserPostMessage、NtUserMessageCall、NtUserSetWindowLong、NtUserShowWindow、NtUserDestroyWindow、NtUserCallHwndParamLock用于窗口保護,掛鉤了NtUserSendInput、NtUserGetAsyncKeyState、NtUserOpenDesktop、NtUserTranslateMessage用于安全輸入,掛鉤NtGdiBitBlt、NtGdiStretchBlt用于截屏保護。
?
??窗口保護
惡意程序通過獲取安全軟件的窗口句柄,然后通過關(guān)閉、隱藏、禁用等手段破壞其正常工作,需要掛鉤這些函數(shù)來防止惡意程序的破壞。R3和R0函數(shù)對應(yīng)關(guān)系如表1所示。
表1?????????R3-R0函數(shù)對于關(guān)系
| R3 | R0 | 作用 |
| FindWindow | NtUserFindWindowEx | 查找窗口獲取句柄 |
| GetForegroundWindow | NtUserGetForegroundWindow | 得到當前頂層窗口 |
| EnumWindows | NtUserBuildHwndList | 枚舉所有頂層窗口 |
| GetWindowThreadProcessId | NtUserQueryWindow | 獲取句柄對應(yīng)的進程PID |
| WindowFromPoint | NtUserWindowFromPoint | 獲取所在位置的窗口句柄 |
| SetParent | NtUserSetParent | 改變某個子窗口的父窗 |
| PostMessage | NtUserPostMessage | 發(fā)送消息 |
| SendMessage | NtUserMessageCall | 發(fā)送消息 |
| SetWindowLong | NtUserSetWindowLong | 改變窗口屬性 |
| ShowWindow | NtUserShowWindow | 改變窗口顯示狀態(tài) |
| DestroyWindow | NtUserDestroyWindow | 銷毀窗口 |
| EnableWindow | NtUserCallHwndParamLock | 禁用、啟用窗口 |
?
??安全輸入
掛鉤NtUserSendInput、NtUserGetAsyncKeyState、NtUserOpenDesktop、NtUserTranslateMessage分別用于防止模擬按鍵、獲取鍵盤按鍵狀態(tài)、打開安全桌面、將虛假按鍵還原成真實的按鍵。
?
a)??????NtUserSendInput
惡意程序可以通過調(diào)用SendInput來模擬按鍵干擾正常輸入,可以掛鉤NtUserSendInput防止惡意操作。當用戶正在輸入密碼等隱私信息的時候,禁止其他程序調(diào)用SendInput模擬鍵盤和鼠標操作。
b)??????NtUserGetAsyncKeyState
惡意程序可能不停的調(diào)用NtUserGetAsyncKeyState來獲取鍵盤的按鍵狀態(tài)從而記錄鍵盤的輸入信息,可以掛鉤NtUserGetAsyncKeyState用來禁止此類鍵盤記錄行為。當用戶正在輸入密碼等隱私信息的時候,禁止其他程序調(diào)用NtUserGetAsyncKeyState,但是不會阻止當前受保護的進程調(diào)用(否則會影響正常的密碼輸入行為)。
c)??????NtUserOpenDesktop
在Windows操作系統(tǒng)中,消息鉤子(通過SetWindowsHookEx設(shè)置)只會當前的桌面上的窗口有效,所以,可以建立一個安全桌面,用于運行需要嚴密保護的進程,這樣,非本桌面上運行的程序無法通過消息鉤子的方式來獲取需要保護進程窗口的信息,達到了保護目標進程窗口的目的(360保險箱和金山密保都有一個叫安全桌面的功能,正是這樣實現(xiàn)的)。
首先調(diào)用真實的NtUserOpenDesktop函數(shù),然后獲取返回句柄的桌面名字,如果此桌面名字跟創(chuàng)建的安全桌面名字一樣,則關(guān)閉此桌面句柄,并返回一個NULL值,否則返回真實的句柄。達到保護安全桌面的目的,真正做到安全桌面不可滲透。
d)??????NtUserTranslateMessage
在輸入密碼的時候,用戶程序一般調(diào)用TranslateMessage將消息轉(zhuǎn)化為具體的按鍵信息,利用此特點,可以構(gòu)建一個DirectInput安全輸入通道,即盡可能少的通過Windows系統(tǒng)的鍵盤按鍵傳輸通道(此通道是極度危險的,惡意程序可以在任意位置添加HOOK截獲按鍵信息)。
對NtUserTranslateMessage的掛鉤用于修正虛擬鍵盤輸入的虛擬按鍵,首先需要判斷是否正在輸入密碼,虛擬鍵盤是否正在運行,是否需要修正按鍵,這三個參數(shù)都是運行于R3的控制程序傳遞進來給R0驅(qū)動的。然后判斷消息是否是鍵盤按鍵的消息,如果是,則進一步判斷此消息是否對應(yīng)虛假按鍵,如果是,則修正為真實的按鍵。虛假的按鍵和真實的按鍵也是R3傳遞給R0驅(qū)動的。整個輸入通道完全自己構(gòu)建,不通過Windows系統(tǒng)提供的任何通道,所有的類型的HOOK都無法在此期間截獲虛擬鍵盤輸入的密碼(很多安全軟件提供的虛擬鍵盤的思路大致如此吧,沒有去仔細調(diào)研)。
???截屏保護
很多截屏類的鍵盤記錄程序。當用戶在虛擬鍵盤上按下一個鍵時,惡意程序就截一次屏幕,這樣可以清楚地看到用戶輸入的密碼信息。掛鉤兩個函數(shù)NtGdiBitBlt、NtGdiStretchBlt可以用于防截屏。
卡巴斯基反病毒軟件率先推出截屏保護,即當虛擬鍵盤運行的時候,阻止程序進行截屏操作,在一定程度上可以阻止此類鍵盤記錄工具的工作。但是卡巴斯基有一個很大的缺陷,它只能阻止全屏的截圖,不能阻止部分屏幕的截圖。
簡單實現(xiàn):
首先定位到SSDT SHADOW的地址
使用的硬編碼,根據(jù)相同版本下與SSDT地址存在的偏移獲取的SSDT SHADOW的地址
windbg下
kd> ?KeServiceDescriptorTable-KeServiceDescriptorTableShadow
Evaluate expression: 64 = 00000040
我只裝了XP的虛擬機
[cpp]?view plaincopy
方法其實好多,參考http://bbs.pediy.com/showthread.php?t=56955
然后就是HOOK了
[cpp]?view plaincopy
總結(jié)
以上是生活随笔為你收集整理的简单实现了下SSDT SHADOW HOOK的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【老生谈算法】matlab实现图像放大算
- 下一篇: p2p与反p2p的博弈,一劳永逸真的不容