http://article.pchome.net/content-390771.html&cid=1113975513&ei=v9SBRtm-FY6WrgOJhJnBBw
安全知識:殺毒軟體引擎技術之窺探
CNET中國·PChome.net 類型:轉載 作者: 責編:楊劍鋒 時間:2007-06-27
一. 群雄逐鹿的殺毒軟體市場
學校機房新購入了一批電腦,負責安裝應用程式的李老師在殺毒軟體的選擇上犯了難,由於機房環境的複雜,如果不安裝殺毒軟體,勢必會因為使用者帶來運行的媒體介質感染了病毒而造成系統癱瘓或交叉感染,無論出現哪種情況都會影響上課進度和效率;但是,如果安裝的殺毒軟體功能不夠強大,無法及時更新資料,一樣不能防止病毒造成破壞。李老師考慮再三,還是決定來到電腦市場購買正版殺毒軟體,但是面對市場上眾多品牌的殺毒軟體,他又犯了難:瑞星、金山、江民、Norton、趨勢、熊貓、卡巴斯基、McAfee……每一款殺毒產品都具備它自己的優缺點和特色,我該選擇哪一種呢?
二. 從病毒原理說開去
病毒的定義和行為特徵
在這個年代裡,電腦病毒(Computer Virus)已經是家喻戶曉的名詞了,而其在業界裡也早已有了定義:電腦病毒是指編制或者在電腦程式中插入的破壞電腦功能或者毀壞資料影響電腦使用,並能夠自我複製的一組電腦指令或者程式碼,它可以是一個程式,一段執行代碼,像生物病毒一樣有獨特的複製能力,可以很快蔓延。他們能把自身附著在各種類型的檔上,隨檔的傳播而蔓延。現在隨著電腦網路的發展,病毒和網路技術結合,蔓延的速度更加迅速。電腦病毒具有可執行性、寄生性、傳染性、破壞性、欺騙性、隱蔽性、潛伏性、衍生性。
以上便是早期就已經定義好的電腦病毒概念,而如今可稱為病毒的,還有各種不會感染檔的特洛伊木馬程式(後門)等(Trojan、BackDoor),大部分特洛伊木馬除了不具備對文件的傳染性以外,其他特徵均與病毒符合,而且一部分檔型特洛伊木馬還可感染檔。此外,還有一種通過系統漏洞進行傳播的惡意程式或“蠕蟲”(Worm),利用系統自帶的指令碼語言功能實現破壞效果的巨集病毒和惡意腳本(Macro Virus、Evil Script),因此,文中將把木馬後門、蠕蟲、巨集病毒和傳統檔型病毒等統稱為“病毒”。
自我複製
病毒的基本動作是複製自身,檔型病毒會把自身插入正常程式檔內部以便程式每次執行時連病毒代碼也一併執行,惡意程式或木馬後門會將自身複製到系統目錄,然後通過多種途徑令系統在啟動時執行病毒體檔,但是無論是哪種病毒的複製行為,其最終目的都只有一個:潛伏到使用者電腦內,伺機執行各種危害操作。
病毒在執行複製行為時必須隱蔽,否則它會輕易被稍有經驗的用戶發現,因此不同的病毒都會採取各種手段來實現其隱蔽目的,但是無論它們的表現形式如何,最終都可歸納為兩種形式:寄生和欺騙。
寄生
這是檔型病毒的傳播方式,檔型病毒的成品一般沒有自己的獨立程式體,它們通過受感染的可執行檔進行傳播。當使用者執行一個感染了檔型病毒的程式時,由於原程式的執行入口已經被破壞,因此病毒代碼會首先得到執行,將自身載入記憶體中,成為一個“駐留程序”(TSR),根據病毒作者的破壞性差異,病毒可能僅僅停留在記憶體空間裡等待使用者執行程式時進行感染操作,也可能會主動出擊,搜索使用者電腦上符合感染條件的可執行檔進行感染。
較普通的檔型病毒會將自身代碼放置到受感染檔的頭部或尾部,而後修改檔頭部的執行入口指向自身代碼起始段,以達到自身先於受感染程式執行的目的,當病毒在入記憶體後,才會去調用受感染檔的真正執行入口,讓受感染檔能夠運行,這樣用戶才不會起疑心。在早期的感染模式裡,檔型病毒通常會主動搜索感染可執行檔,甚至因為感染失敗而導致檔損壞的事情也常有發生,而自從微軟在Windows 2000開始引入“系統檔校驗”技術後,主動搜索可執行檔進行感染的病毒寄生技術便因為導致系統不斷出現“系統檔遭遇替換”的警告而逐漸退出舞臺,繼而換成守株待兔類型的等待程式執行後進行感染的被動寄生方式。較新的檔型病毒還會採取不感染系統檔的政策,讓用戶無論如何都難以發現檔被感染的痕跡。
但是直接把自身簡單的插入檔首尾的寄生方式會導致檔體積和修改日期的變化,因此高級的病毒會自動根據目的檔案內部的“無用”空間分配情況來將自身代碼分段插入檔體內,並修改檔日期為原始日期,如此一來便加大了檢測和查殺的難度。這一技術得以實現的原因是PE規範的特點:PE檔的每個節之間留有按簇大小對齊後的空洞,病毒體如果足夠小則可以將自身分成幾份並分別插入到每個節最後的空隙中,這樣就不必額外增加一個節,因而檔大小保持不變,能做到這種形式的病毒體積必須十分小巧,否則它會把檔破壞掉的。當檔被執行時,病毒通過初始化代碼的複雜計算將自身全部代碼恢復連貫載入記憶體,繼續完成下一次感染過程。
欺騙
並非所有病毒(注意此文的“病毒”所指範圍)都是檔型的,例如特洛伊木馬、蠕蟲和惡意程式等,那麼它們如何將自身隱蔽呢?這就要用到欺騙了。所謂欺騙,就是利用各種手段將自身執行檔植入系統,而不被使用者輕易察覺,即使被發現,也難以判斷真偽或者無法徹底刪除,從最初的簡單設置檔案屬性為隱藏,到現在的偽裝系統核心檔、DLL形式,甚至驅動程式類型的隱藏,病毒技術的不斷發展使得手工查殺增加了難度。
破壞
一個程式是否具備破壞性是衡量它是否屬於病毒的一個重要標準,病毒的破壞是多種多樣的,其實在它們進行寄生或欺騙操作時就已經對被感染的檔、以及受害電腦的環境完整性形成一定的破壞了,由於病毒需要駐留記憶體進行感染操作,直接導致的影響就是磁片讀寫增加,電腦回應遲鈍,更有甚者為了取得最高的回應速度,而修改系統正常的優先順序設置讓自己達到最高等級,從而導致系統效率嚴重下降。然而這還不是真正可怕的,當病毒發作時,可能會破壞你的檔檔案,或者敞開電腦大門讓入侵者隨意進出,甚至通過特殊的軟體讀寫達到破壞電腦硬體的目的。
三. 剖析殺毒軟體的心臟——引擎技術
病毒和反病毒產品是天生的冤家,由於病毒永無休止的存在,反病毒產品這片領域自然也會出現眾多廠商來分割的局面,因此也就銜生出了多種殺毒引擎技術。
殺毒引擎是決定一款殺毒軟體技術是否成熟可靠的關鍵,什麼是殺毒引擎呢?簡言之,它就是一套判斷特定程式列為是否為病毒程式或可疑程式的技術機制,引擎不僅需要具備判斷病毒的能力,還必須擁有足夠的病毒清理技術和環境恢復技術,如果一款殺毒產品能查出病毒但是卻無法清除、或者無法將被病毒破壞的系統環境成功恢復,那它也只能是雞肋。為了達到查殺病毒的目的,殺毒引擎自身要實施的行為就要比病毒還病毒。
例如,為了及時獲得環境變動的監控資料,一些殺毒引擎採用DLL的鉤子技術將自身注入系統進程中,這一行為和DLL木馬無異;而為了成功攔截查殺驅動級別木馬Rootkit,殺毒引擎更需要將自身的一部分作為驅動形式運行,以便進入系統內核領域……說到這裡,一些電腦配置較低的使用者應該能明白,為什麼自己安裝殺毒軟體後電腦速度明顯變慢了,這多半是因為殺毒軟體的“檔監控”等功能導致的,因為這一功能的實現原理就如檔型病毒的寄生過程一樣,只不過檔型病毒是守候在記憶體中伺機感染每一個打開的檔,而“檔監控”功能是時刻駐守在記憶體裡檢查每一個打開的檔是否存在病毒,兩者導致的後果都是程式載入記憶體的時間增加,在低配置的電腦表現得比較明顯罷了。
由於以上提到的原因,殺毒軟體是會不可避免的對使用者電腦運行速度造成一定影響的,但是為了安全,大部分用戶只能犧牲一點工作效率來換取安全了,那麼,殺毒引擎的具體實現過程又是如何呢?且讓我們來對其窺探一番。
1.守住每一個關卡——程式列為捕獲
每個程式運行時都需要進行各種交互動作,如收發網路資料、回應某個觸發事件、檔讀寫操作等,這些交互都被稱為“行為”(Action),這個週期過程是可以被跟蹤記錄的,這就是殺毒引擎必須干涉的第一步,當殺毒軟體的環境監視模組啟動後,它會嵌入系統的操作介面,使得任何非核心程式和除了殺毒軟體自身程式的運作過程都要被它即時監視,這一技術通常通過鉤子技術和驅動層掛載實現,每個殺毒軟體廠商都預先定義了一套病毒行為判斷規範,即在一個給定的範圍和置信度下,判斷相關操作是否為合法。例如一個代碼執行後被發現試圖將自己寫入使用者請求執行的程式檔體內、或進行特定的複製動作和添加註冊表操作,則可將其懷疑為病毒,移交給查毒過程的第二步進一步判斷處理。
為了實現行為捕獲操作,殺毒軟體引擎必須將自身模組嵌入系統底層,在這個實現方法上,各大廠商都有自己的一套方案,一般廠商普遍採用的是中介軟體技術,即通過Hook掛鉤方式實現對每個進程的訪問,這種方案通過在系統底層與應用程式之間嵌入一個全域鉤子DLL模組達到目的,從嚴格上來說,它的相對安全和穩定性較低,但是在原始程式碼不開放的作業系統層面上,這是最簡單的方法。
一部分廠商因為與作業系統廠商存在合作關係,因而獲得了較其他廠商殺毒產品要高的作業系統特權,所以他們採用的方案是基於系統最底層的系統核心驅動,這種實現方式是最安全的,或者說最高級的實現方式,至今只有Norton獲得了這個特權。隨著病毒技術逐漸滲透到Rootkit層次,過去的Hook技術逐漸有點力不從心,於是殺毒廠商開始轉入驅動方案,當然,由於沒有作業系統廠商的授權,他們並無法實現最底層的核心驅動解決方案,於是殺毒廠商編寫了一個稱為“軟體驅動”的中介軟體,用於在系統中產生一個虛擬硬體。
眾所周知,在作業系統中,只有驅動模組能通過一個“硬體抽象層(HAL)”的通訊介面而到達系統底層,如今流行的Rootkit木馬也是採用驅動形式進入系統核心的,因此殺毒廠商使用“軟體驅動”來實現底層監視的方案是要比一般的Hook技術效果顯著的,但是這也不可避免會出現一些問題,如果這個“軟體驅動”存在缺陷或者被某些程式異常終止(例如出現未預料的錯誤),在系統底層無任何保護措施的環境下,最直接的一個後果就是系統藍屏崩潰,造成可能的損失。
引用(小知識:系統的幾個“層”)
作業系統作為一個複雜的運作體系,其內部是必須實現一定的功能模組來進行分工合作的,這些功能模組像金字塔一樣層層堆積,形成了系統的幾個“層”,分別是系統核心層、硬體抽象層、使用者層。
系統核心層(Kernel Layer)位於整個作業系統的最底層,負責系統的基本運作,在這一層裡的所有行為都由系統內置的指令來實現,所有外界因素都不會對這一處的行為造成影響。能直接進入這個層交互的程式不多,除了作業系統自身,協力廠商廠商若要能在此層直接工作,必須和系統廠商建立合作關係,使用系統廠商提供的介面函數才能進入。目前能在這個層面直接工作的殺毒軟體只有賽門鐵克的Norton AntiVirus。
硬體抽象層(Hardware Abstraction Layer)是美國微軟公司為了便於作業系統在不同硬體結構上進行移植而提出的將系統底層與硬體相關的部分獨立運作的思想,HAL為系統實現了“硬體無關性”,即在不同的硬體平臺上,硬體與作業系統的交互也不會有所差異。
這樣一來,硬體廠商開發驅動的難度便能大大降低,HAL將硬體的介面細節隱藏起來,並為作業系統提供一個標準硬體交互介面,目前所有的硬體驅動都工作在這個層面上,當外界硬體存在指令請求時,驅動程式回應請求並將指令通過HAL轉換為系統核心層能理解的指令交給內核執行,如果未找到相應的驅動程式類型,則將其視為“預設硬體”(Default Hardware)處理,什麼叫“預設硬體”呢?最簡單的例子就是進入安全模式,這時候大部分驅動程式不會被載入,此時的系統便是工作於“預設硬體”上。大部分使用“軟體驅動”解決方案的殺毒軟體就是在HAL層上虛擬了一個硬體來達到與核心層交互的效果,如McAfee、卡巴斯基等,瑞星2006也是通過這個方案實現了內核交互。
用戶層(User Layer)就是平時我們直接看到的部分,例如桌面,大部分殺毒軟體也是在這一層運行的,主要用於使用者介面交互和將指令傳遞到殺毒引擎。一般運行於Ring3的程式列為也產生於此,一個應用程式產生的指令要求首先被傳遞到HAL層,HAL層將其解釋處理為核心層可以識別的指令串,然後提交給核心層最後進入cpu的指令處理迴圈,CPU處理完畢後將結果反向送回到使用者層上的應用程式,最終得到運算結果。
2.檢測的核心——基於引擎機制的規則判斷
這一步環節可以稱之為病毒判斷的核心階段,一個好的殺毒引擎能在這個階段識別出相當規模的病毒,其原理是在引擎中內置一部分病毒的特徵代碼,稱為“基於特徵碼的靜態掃描技術”,即殺毒引擎直接在檔中查找自身攜帶的特徵代碼,力求儘量在這一步發現病毒。早期的電腦使用者應該記得,當初的殺毒產品並沒有非常大的病毒碼資料庫,甚至KV300+的所謂病毒碼資料庫還是ASCII格式的,並由用戶自己手工加入,僅僅作為一種簡單的擴充手段來運作而已,這是因為KV300+的主程序內就已經包含了當時各種流行病毒的特徵碼。
但是如今由於網路普及和電腦技術發展,病毒攻勢鋪天蓋地而來,如果單純靠殺毒引擎自身攜帶病毒碼代碼,將會造成主程序體積過於龐大而無法高效率運行,且升級麻煩等難點,因而殺毒引擎不得不將病毒碼庫從自身脫離開來,形成獨立的病毒資料庫結構來與自身保持聯繫,這就是“基於特徵碼的靜態掃描技術”的擴展產物:病毒碼代碼資料庫。
3.在翰林辭典中穿梭——引擎與病毒碼庫的交互
由於上述原因,如今的殺毒軟體已經不得不採用外部資料庫連接的方法來達到識別病毒的效果,病毒碼代碼資料庫中以特定格式儲存了各種病毒的行為標識和靜態代碼,在工作時,殺毒引擎需要將捕獲到的程式列為轉換為它自身可以識別的行為標識和靜態代碼,然後進入病毒碼代碼資料庫中查詢並期待其返回查詢結果,因此這個步驟是整個殺毒過程中最慢的,但是不可否認,當前的殺毒軟體對大量病毒的識別都是在這個階段完成的。
因此一個足夠龐大的病毒庫往往能夠彌補殺毒引擎的不足之處,但是當今病毒越發複雜和繁多,如此長期以往,病毒碼庫將會有一天過於臃腫而導致不良後果,要解決這個問題,只能在核心技術上儘量實現將病毒檢測工作在第二步完成,只可惜在當前我們仍然沒有能夠實現這個想法的殺毒引擎技術,因此如今的殺毒軟體或多或少都依賴著一個幾十MB的病毒碼庫來維持工作,殺毒廠商在殺毒引擎核心未進行關鍵修改時發佈的病毒更新其實也就是為了往這個特徵資料庫中添加最新發現的病毒資料,以達到查殺新病毒的作用。
4.月光寶盒——病毒查殺和系統環境恢復
當殺毒引擎檢測到病毒時,需要分為兩種情況對待,首先是尚未來得及進行感染或破壞行為的病毒,在這種情況下殺毒引擎只需要簡單刪除檔就可以了,但是日常操作中用戶面臨最多的還是已經被病毒實施感染破壞行為後的系統環境,在這種情況下,殺毒引擎必須在使用適當的方式查殺病毒後,根據病毒碼庫中記錄的病毒行為來智慧判斷當前系統環境遭受破壞的情況並進行恢復,例如對於受病毒感染的檔,殺毒引擎必須根據一定的演算法在檔體內找出病毒代碼寄生的部分並給予清除,這個過程必須非常謹慎,否則直接的後果就是導致原文件被破壞,這樣的殺毒就毫無意義了。
以上說的是殺毒引擎完整工作過程的原理,那麼,它所採取的技術有哪些呢?目前,主流的技術有兩種:虛擬機器技術、即時監控技術。除此之外,還有兩種最新的技術仍在試驗階段,分別是智慧碼標識技術和行為攔截技術。
一提起虛擬機器,部分讀者可能就會聯想到VMWare去了,然而這裡提到的虛擬機器並非如此。在反病毒界裡,虛擬機器也被稱為通用解密器,已經成為反病毒軟體中最重要的部分之一。殺毒引擎的虛擬機器技術並非是為病毒提供一套電腦模擬系統,讓其在內部折騰直到暴露出病毒行為特徵,在這裡的虛擬機器是指殺毒引擎類比出一個模擬CPU,這個“CPU”具備和真正CPU等同的指令分析功能,殺毒引擎將待檢測的程式碼讀入“CPU”中逐條指令迴圈執行,直到出現特定情況才結束工作,在這個過程中探知程式是否具備病毒行為特徵或者暴露出病毒碼碼。
但是即使再強悍的變形病毒也不可避免在運行時出現一段相對固定的機器碼,否則它自身也無法正常運行完成變形過程,而由於這段機器碼只有在運行時才能被捕獲到,因此工程師開發了“虛擬機器技術”誘使病毒在殺毒引擎產生的“CPU”裡盡情運行,而後根據其固定機器碼匹配病毒碼資料庫中的靜態特徵來判斷這個程式是否病毒。雖然這個技術可能會導致誤報,但是仍不能否認其是一種有效的方法。
即時監控技術,說白了其實就是一個檔監視器,它會在檔打開、關閉、修改等操作時將其攔截並送入查毒模組進行分析,而在如今的作業系統中要實現對所有檔操作的攔截並非易事,這需要涉及系統核心,因此,這裡所採取的方案原型,就是“軟體驅動”。通過驅動進入核心,便能獲知每個檔的操作情況並做出反應了。
這項技術的難度在於驅動代碼的編寫,由於內核沒有異常處理過程,在這裡執行的代碼稍有一點錯漏都能直接導致系統崩潰,且驅動與用戶層的即時交互也需要一套複雜的實現方案,因此只有一定實力的廠家才實現這項技術,且實現了這項技術的廠家大部分都會連同虛擬機器技術、靜態特徵碼掃描技術一起結合起來,最終形成自己的產品。
四. 結語
許多使用者都在挑選殺毒軟體時犯難,實際上,如果拋開許多表面上的東西,殺毒軟體的引擎實現技術也就那麼幾個,關鍵在於殺毒廠商的研發能力和實際工作效率,也不能只憑殺毒軟體在對付某種病毒的差別上就斷定它們之間的地位差異。符合自己使用的,就是最好的。