前言
在本系列的導論中,我曾經在“病毒清除方法”中簡單講解過特征碼清除這種方式。而我也在對于實際病毒的專殺工具編寫中,使用過CRC32算法來對目标程式進行指紋比對,進而進行病毒判定。一般來說,類似于MD5以及CRC32這樣的算法,在病毒大規模爆發時是可以提高清除效率的,但是傳統的更為常用的方法是采用以靜态分析檔案的結構為主并結合動态分析的方法,通過反彙編來尋找病毒的内容代碼段、入口點代碼段等等資訊。盡管病毒特征碼的定義非常簡單,但是特征碼的具體提取方法,卻鮮有資料可供參考。那麼我在這裡就簡單讨論一下關于病毒特征碼的知識。
特征碼選取的基本要求
說到特征碼,也許我們接觸最多的是在使用查殼工具PEiD時,對目标程式進行判定時所采用的特征比對代碼。PEiD的特征碼儲存在程式目錄的userdb.txt中,舉個例子來說,我們拿之前研究過的cf.exe“敲竹杠”病毒樣本來看。首先将病毒樣本拖入PEiD:

圖1
可見,程式是由“MicrosoftVisual C# / Basic .NET”編譯的,那麼為什麼PEiD能夠識别出這款軟體是怎麼編譯的呢?我們可以先檢視一下程式入口的首位元組:
圖2
可見程式的入口位址代碼為“FF 25 0020 40 00”然後是一大串的“00”。然後我們打開userdb.txt,查找一下“Microsoft Visual C# / Basic .NET”字元串來看一下,可以找到以下結果:
[MicrosoftVisual C# / Basic .NET]
signature= FF 25 00 20 ?? ?? 00 00 00 00 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ep_only= true
在signature後面,是“FF 25 0020 ?? ??”(其中的??表示任意字元),也就是說,隻要目标程式的入口代碼部分能夠比對“FF 25 00 20 ?? ??”,就認為程式是由“Microsoft Visual C# / Basic .NET”編譯的。而通過對比圖2,我們的cf.exe程式的入口代碼可以比對這段特征碼,于是也就檢測出了cf.exe的編譯方式。PEiD通過對這種“共性”的比對,就能夠識别出各種各樣的殼以及編譯方式了。
病毒程式的特征碼與上述我們講的有相同的地方也有不同的地方。相同點在于我們同樣需要在病毒的二進制代碼中提取一部分作為病毒特征。但是我們的病毒程式是不能夠采用上述這種方式,即從程式入口進行提取的,因為這樣一來病毒程式和普通的程式的檢測結果就沒有差別了。是以計算機病毒的特征碼需要能夠把病毒程式與一般的程式區分開來,即能夠唯一辨別一個或者一類多态病毒,要能夠成為計算機病毒程式的“指紋”。如果隻是随意從病毒内選取一段二進制代碼串作為該病毒的特征碼,很可能會在正常的程式中也比對到該特征碼,進而出現誤報的情況。是以在我看來,選取恰當的特征代碼串絕對是一個很具技巧性的工作,這需要經驗的積累以及對目标病毒的深刻了解。當然對于不同的防毒軟體廠商而言,都會有自己的一套提取特征碼的方式,可能是自動擷取,也可能是手動分析。
一般來說,病毒特征碼需要滿足以下幾個要求:
1、不能從資料區提取,因為資料區的内容很容易改變,一旦病毒程式變更版本,改變了資料内容,特征碼就會失效。而其它的區塊則相對來說保險一些。
2、在保持特征碼的唯一性的前提下,應當盡量使得特征碼短小精悍,進而減少檢測過程中的時間與空間的複雜度,提高檢測效率。
3、經過詳細的逆向分析之後選取出來的特征碼,才足以将該病毒與其它病毒或正常程式相差別。
4、病毒程式的特征碼一定不能比對到普通程式,比如選取病毒入口點的二進制代碼,就必然出現誤報的情況。
5、特征碼的長度應當控制在64個位元組以内。
特征碼選取的基本方法
病毒的特征碼可能是病毒的感染标記,也可能是若幹計算機指令組成的一段計算機程式。一般使用以下幾種方法來提取病毒的特征碼
1、計算校驗和
這種方法的特點是簡單快速,也是我們之前的專殺工具所采用的方式。但是采用這種方法,一種特征碼隻能比對一個病毒,即便病毒的變動很小,也需要重新提取特征碼,這造成的後果是會使得特征碼庫過于龐大,一般用于臨時提取特征碼。是以這種計算校驗和的方式不是我們讨論的重點。
2、提取特征字元串
病毒檔案中總會存在一些可供識别的字元串,很多時候,這些字元串是某個病毒所特有的,是以這種方式适用于所有病毒的特征碼的提取。采用這種方式甚至還能識别某一大類病毒,但是缺點是需要耗費比較多的掃描時間。以我們之前讨論過的“熊貓燒香”病毒為例,經過我們之前的逆向分析可以知道,病毒最開始會使用“xboy”以及“whboy”這兩個字元串來進行解密的操作。比如我們嘗試一下,在病毒程式的二進制代碼中搜尋“whboy”:
圖3
相信一般的程式中不會出現“whboy”以及“xboy”這兩段字元,是以就可以考慮将這兩個字元串或者其中的一個字元串作為“熊貓燒香”病毒的特征碼。這樣隻要對目标程式中的可列印字元串進行檢索,如果發現了“whboy”就可以認為目标程式是“熊貓燒香”病毒程式。這樣即便是病毒出現了變種,隻要它依舊包含有“whboy”,我們就依然能夠實作清除的工作。或者我們也可以考慮使用更長的字元串,比如上圖中開始的那32個位元組,即“***武*漢*男*生*感*染*下*載*者***”,将其十六進制代碼提取出來作為特征碼,也是可以的。那麼我就将這段字元串作為“熊貓燒香”的特征碼。然後可以使用PEiD檢視一下該段代碼所在的區段:
圖4
可見,檔案偏移0x0c040位于CODE,即代碼區段中,那麼其實在進行比對的時候,我們隻要檢索目标程式的這個區段就可以了。或者為了友善起見,我們在檢測目标程式時,隻檢測位于檔案偏移0x0c040處的字元,如果能夠比對病毒特征碼,就認為目标程式是病毒。
3、提取特征反彙編代碼
病毒的反彙編代碼往往都會有一些比較有特色的地方,那麼我們就可以将這些反彙編代碼的十六進制數值提取出來作為特征碼,以唯一的辨別該病毒。比如我們之前分析過的U盤病毒,它的反彙編代碼有這麼幾句:
圖5
這裡第二行的反彙編代碼為“call $+5”,其實這種寫法并不多見。但事實上這不過是IDA Pro解析方式上的問題,在OD中,這段代碼會被解析為“call 00401929”:
圖6
那麼我們就不妨将這段十六進制代碼提取出來作為我們的特征碼。同樣選取32個位元組,并且加上檔案的偏移:
圖7
此處的檔案偏移為0x1921,檢視區段表:
圖8
可見它位于.text區段,也就是代碼段中。
當然,從反彙編代碼中進行特征碼的提取,方法是有很多的,可能每個人都有自己的方法,我也不敢說我所提取出來的特征碼就一定滿足唯一性等特征,我這裡所舉的都是最簡單的例子。但是選取以下這段代碼明顯是不合适的:
圖9
因為CreateFile這個函數實在是過于普遍,是以如果選取這段代碼作為特征碼,那麼誤報的可能性是非常高的,這需要大家特别注意。當然在實際的工作中,對于同一個病毒而言,為了保險起見,特征碼可能會選擇多處,既有字元串,又有反彙編代碼,進而保證檢測的準确性。
4、兩段檢驗和形式
這種方式包含兩段病毒檔案特殊位置的資料,該資料能夠代表該病毒的特性。我們将這兩段資料的校驗和計算出來。那麼在檢測掃描目标程式時,先計算目标檔案在該位置處的校驗和的值,通過判斷是否符合相應的特征碼來判定目标程式是否為病毒程式。這種方法的準确率高,耗時也比較少。很多時候能夠利用一個特征碼檢測出同一類的病毒。
特征碼檢測的不足
病毒特征碼隻是一種檢測的方式,隻能夠防患于未然。如果說計算機已經中了病毒,那麼就算我們擁有該病毒的特征碼,至多隻能将病毒從計算機中删除,而無法修複該病毒對計算機造成的危害。另外,現在有些軟體能夠實作對病毒特征碼的定位,也就是能夠将病毒程式分為幾個部分,然後使用防毒軟體對這些部分進行清除,哪部分報毒,就說明特征碼在哪部分中,然後再不斷地進行細分,再用殺軟進行檢測,最終确定特征碼的具體位置。而找到特征碼後,就可以修改特征碼,進而實作針對于某一款或某幾款防毒軟體的免殺。
雲清除技術簡介
既然這次講到了病毒的特征碼,那麼在最後不得不簡單講一下雲清除的一些知識。因為傳統的防毒軟體,需要使用者不斷地更新病毒庫,将病毒特征碼儲存在本地的計算機中,這樣才能夠讓本地的防毒軟體能夠識别各種各樣的新式病毒。這種方式的缺點是占用本地計算機資源過大,而且也有一定的滞後性,為了解決這個問題,雲清除技術也就應運而生了。
雲清除是依賴于雲計算的技術,雲技術是分布式計算的一種,其最基本的概念,是通過計算機網絡将龐大的計算處理程式自動分拆成無數個較小的子程式,之後再交由多部伺服器所組成的龐大系統經過搜尋、計算分析之後将處理結果回傳給使用者。通過這項技術,網絡服務提供者可以在數秒之内,達成處理數以千萬計甚至億萬計的資訊,進而達到和“超級計算機”同樣強大效能的網絡服務。
所謂雲清除,就是把安全引擎和病毒木馬特征庫放在伺服器端,解放使用者的個人計算機,進而擷取更加優秀的清除效果、更快的安全響應時間、更小的資源占用以及更快的清除速度,并且無需更新病毒木馬特征庫。
圖10
雲清除是對付病毒木馬泛濫的一種先進而有效的方法。判斷一個檔案是不是病毒,計算的工作不在使用者計算機中完成,而是在一個安全公司的“雲端”,即服務端來做,“雲端”可以配置上千台伺服器,以進行快速的大規模計算,這是對付病毒非常有效的方法。
雲清除也有其弊端,最主要的就是要求使用者必須連接配接網際網路,否則無法完成病毒的清除任務。另外使用者隐私的洩露問題也是雲清除技術必須要解決的問題。
小結
這次我簡單講解了一下關于病毒特征碼的知識,希望大家能夠依照上述方法,或者自己總結方法,試着查找一下病毒程式中符合條件的特征碼。相信大家找到的特征碼能夠更加有效地對病毒進行識别。