早期的驅動木馬雖然采取了驅動形態達到隱藏自己避免查殺的目的,但是在安全模式里它仍然被發現了。因為Windows的“安全模式”不僅僅限于加載用戶界面和啟動項這些區別,它還包括各種驅動的“安全模式”,在安全模式里,為了確保Windows不會由于某個驅動文件的缺陷而崩潰--畢竟一部分人被迫進入安全模式就是因為遇到了某些設備驅動不兼容或存在問題而導致系統不能正常運行,大部分被標記為“不必要”的驅動在“硬件抽象層(HAL)”的干涉下,是不會被加載的,甚至顯卡驅動也不能例外
。所以此時Windows是相對安全的基于“默認硬件”運行的界面簡陋的系統。操作系統廠商此舉其實很好理解,想象一下如果你因為安裝了某個設備的驅動程序而導致系統藍屏,然后你來到安全模式里想要修復它,卻不幸的發現安全模式也出現了藍屏--因為這個驅動被系統加載了,如果這樣,安全模式還有什么意義。于是,在這樣的設計思想下,早期的驅動木馬到了安全模式,還是很好清理的,因為那個時候,大部分開發者還處于開發Rootkit的試探階段,誰也不敢貿然繞過這種安全體系。
硬件抽象層(Hardware Abstraction Layer,HAL)是微軟公司為了便于操作系統在不同硬件結構上進行移植而提出的將系統底層與硬件相關的部分獨立運作的思想,HAL為系統實現了“硬件無關性”,即在不同的硬件平臺上,硬件與操作系統的交互也不會有所差異,這樣一來,硬件廠商開發驅動的難度便能大大降低,HAL將硬件的接口細節隱藏起來,并為操作系統提供一個標準硬件交互接口,目前所有的硬件驅動都工作在這個層面上,當外界硬件存在指令請求時,驅動程序響應請求并將指令通過HAL轉換為系統核心層能理解的指令交給內核執行,如果未找到相應的驅動程序類型,則將其視為“默認硬件”(Default Hardware)處理,什么叫“默認硬件”呢?最簡單的例子就是進入安全模式,這時候大部分驅動程序不會被加載,此時的系統便是工作于“默認硬件”上。
然而在經歷了一段時間的試煉以后,開發者的技術熟練了,膽子也大了,他們開始修改驅動模塊的運行級別--系統的“默認硬件”是根據驅動模塊加載入口聲明的啟動優先級判斷的,對于絕對安全的驅動程序,它的優先級被提高了,于是系統無論在什么模式下都會加載它,例如鍵盤驅動、鼠標驅動、各種基礎的系統設備驅動等,如果某個驅動文件的優先級被人為提高,系統就會將其視為必備驅動加載,而這個優先級的提高方法非常簡單,只需要改動注冊表的驅動模塊分支里的一個數據而已。至此,即使在加載模塊最少的“基于命令提示符的安全模式”下,這樣驅動木馬就可以不受阻礙的橫行霸道了,即使是專業的計算機用戶查殺也很困難了,更別說那么“菜鳥”們了。
大部分驅動木馬的驅動模塊并不是用來實現入侵行為或者進行瀏覽器劫持的,而是為真正負責這部分操作的位于用戶層的可執行程序本體提供保護功能,因此驅動木馬的大部分工作就是攔截相關的系統API調用工作,使得用戶無法直接查找到真正的文件本體,或者對它們屢殺不禁,甚至連相關的注冊表項目都無法刪除,這就是因為它們直接從驅動層攔截了實現這些功能的API。
雖然驅動木馬使用的種種手段使得自己可以保全于普通的系統安全檢測工具下,但是在基于驅動層的安全檢測工具出現后,這個一方獨霸的局面被打破了,通過使用國產的幾個優秀工具如IceSword和安全巡警專業版(AST Pro),普通用戶也能具備發現驅動木馬的能力。
那么,如何判斷系統是否中了木馬,以及是中了驅動木馬呢?首先用戶要具備基礎的系統啟動項知識,雖然啟動項里的東西會隨著用戶安裝的一些軟件而增加,但是實際上系統可以只存在最少的兩個甚至一個啟動項:用于同步的mobsync、輸入法指示器internat(Windows 2000)或高級文字服務ctfmon(Windows XP),默認情況下Windows XP還會出現一些MG或IME開頭的啟動項,這些都是無關緊要的。
也許您會問,如果我一直沒有養成記錄系統啟動項的習慣,也沒有過檢測木馬的經驗,我該如何去判斷一個啟動項是否木馬呢?這個問題很難用固定的思維回答,但是用戶可以采取一個笨而實用的方法來測試,雖然它很煩瑣,但是卻比較直觀。
首先運行“系統配置實用工具”msconfig.exe,在它的“啟動”選項卡里面把所有啟動項取消,然后重啟計算機,你會發現系統任務欄右邊的托盤區少了許多東西,這時候,再次運行msconfig,邊把當前的啟動項名稱記錄在筆記上并勾上第一個啟動項,然后確定重啟,通過觀察系統啟動后托盤區里是否多出了圖標就可以判斷出這個啟動項的大概作用了,如果托盤區出現了圖標或者直接就出現了一些窗口界面如QQ的登錄對話框,就可以確認這是個正常的啟動項,在筆記上對應的啟動項名稱前打勾。然后再次運行msconfig,取消第一個啟動項的勾,勾上第二個啟動項,再次重啟,直到所有啟動項都分別獨立開啟了一次為止,最后看看你記錄下來的筆記里有多少個項目是打了勾的,而剩下那些未被勾選的項目,有80%的幾率就是一般的木馬。
這個方法最保險,也最煩瑣,所以用戶需要記住一條規律,如今有許多木馬的文件名和啟動項名稱都是很混亂或者很“系統”的,如看到“48ED0A5E”、“svchost”、“svohost”、“services”、“ssdt”、“ssodl”這樣的啟動項,那就不必懷疑了,它絕對是木馬。
用戶的疑問又來了,這方法的結尾說,這只是測試“一般的木馬”而已,那我該如何判斷系統是否感染了“驅動木馬”呢?其實,如果用戶的機器已經感染了驅動木馬,那么在剛才的測試里它就已經暴露了,細心的用戶應該不難發現,他們的機器里有一個甚至多個啟動項,即使剛才在msconfig里已經取消,重啟后卻發現它仍然是選中的狀態,如果用戶是使用具備實時刷新功能的第三方工具管理啟動項,甚至會發現自己剛取消了這個啟動項就馬上被自動恢復了,而這些始終不肯放棄自啟動權利的項目,就是我們要找的驅動木馬的用戶層本體--不要高興,它并不是驅動木馬的真正危害部分,這個只是驅動木馬千方百計要保護的對象而已。這個方法正是利用驅動木馬的保護特性,讓它自我暴露。
結束語:以上從木馬的隱藏技術一直到驅動木馬的識別,進行了詳盡的敘述,而光發現和識別驅動木馬是不夠了,如何絞殺這些討厭的家伙呢,請大家關注我們后續的文章!