1. 程式人生 > >病毒木馬查殺實戰第018篇:病毒特徵碼查殺之基本原理

病毒木馬查殺實戰第018篇:病毒特徵碼查殺之基本原理

前言

       在本系列的導論中,我曾經在“病毒查殺方法”中簡單講解過特徵碼查殺這種方式。而我也在對於實際病毒的專殺工具編寫中,使用過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

       雲查殺是對付病毒木馬氾濫的一種先進而有效的方法。判斷一個檔案是不是病毒,計算的工作不在使用者計算機中完成,而是在一個安全公司的“雲端”,即服務端來做,“雲端”可以配置上千臺伺服器,以進行快速的大規模計算,這是對付病毒非常有效的方法。

       雲查殺也有其弊端,最主要的就是要求使用者必須連線網際網路,否則無法完成病毒的查殺任務。另外使用者隱私的洩露問題也是雲查殺技術必須要解決的問題。

小結

       這次我簡單講解了一下關於病毒特徵碼的知識,希望大家能夠依照上述方法,或者自己總結方法,試著查詢一下病毒程式中符合條件的特徵碼。相信大家找到的特徵碼能夠更加有效地對病毒進行識別。

相關推薦

病毒木馬實戰018病毒特徵基本原理

前言       在本系列的導論中,我曾經在“病毒查殺方法”中簡單講解過特徵碼查殺這種方式。而我也在對於實際病毒的專殺工具編寫中,使用過CRC32演算法來對目標程式進行指紋匹配,從而進行病毒判定。一般來說,類似於MD5以及CRC32這樣的演算法,在病毒大規模爆發時是可以提高查

病毒木馬實戰019病毒特征編程實現

ptr lose if語句 x11 epo virus 木馬 提取 error 前言 上次我們已經簡介過了病毒特征碼提取的基本方法,那麽這次我們就通過編程來實現對於病毒的特征碼查殺。 定義特征碼存儲結構 為了簡單起見。這次我們使用的是setup.

病毒木馬實戰028某APT攻擊的技術分析

樣本檔案基本資訊 本分析報告共涉及兩個樣本檔案,其基本資訊如下:   1號樣本 2號樣本 樣本名稱 處理籤(2018年)1304.pdf.hta 組織部幹部四處最新通

病毒木馬實戰027“白加黑”惡意程式研究(中)

前言        這次討論的是一個真實的非常典型的利用“白加黑”手段進行破壞的團伙,我能深刻地感受到它們在很多方面確實是花了一些心思的,也就是在隱藏自身行為,誘惑純潔的大眾進行點選從而得到執行方面,是有一些亮點的,那麼這次我就為大家

病毒木馬實戰026“白加黑”惡意程式研究(上)

前言        眾所周知,傳統的惡意程式都是由單一檔案構成的,從而實現某一種或者幾種惡意功能。而這類的惡意程式為了避免被發現以及被查殺,往往會採用五花八門的自我隱藏技術以及免殺技術,病毒程式的作者很多時候也是腦洞大開,為了對抗殺軟的查殺也是無所不用其

病毒木馬實戰025JS下載者指令碼木馬的分析與防禦

前言        這次我與大家分享的是我所總結的關於JS下載者指令碼木馬的分析與防禦技術。之所以要選擇這樣的一個題目,是因為在日常的病毒分析工作中,每天都會遇到這類病毒樣本,少則幾個,多則幾十個(當然了,更多的樣本已經被自動分析系統攔截下來了)。而

病毒木馬實戰017U盤病毒工具的編寫

BOOL CUVirusKillerDlg::OnDeviceChange( UINT nEventType, // An event type. DWORD dwData // The address of a structure that

Linux實戰RHEL7.3 yum更換實戰

yum個人筆記分享(在線閱讀):http://note.youdao.com/noteshare?id=cdae09cf51bf77a4e94a2e2865562dbbPDF版本下載http://down.51cto.com/data/2323064本文出自 “人才雞雞” 博客,請務必保留此出處http://

Linux實戰RHEL7.3下Nginx虛擬主機配置實戰(基於別名)

虛擬主機 nginx個人筆記分享(在線閱讀):http://note.youdao.com/noteshare?id=05daf711c28922e50792c4b09cf63c58PDF版本下載http://down.51cto.com/data/2323313本文出自 “人才雞雞” 博客,請務必保留此出處

Linux實戰CentOS7.3下Nginx虛擬主機配置實戰(基於端口)

基於 sub 主機配置 centos7.3 entos ada .com 版本 fad 個人筆記分享(在線閱讀): http://note.youdao.com/noteshare?id=9a8b56ec54800ccf197eb6c23de55a85&sub=2E3048

R實戰 數據處理

ase 語言 dex test 矩陣 表達 set mat cond 在實際分析數據之前,必須對數據進行清理和轉化,使數據符合相應的格式,提高數據的質量。數據處理通常包括增加新的變量、處理缺失值、類型轉換、數據排序、數據集的合並和獲取子集等。 一,增加新的變量 通常需要

R實戰 數據處理(基礎)

計算 edi 字符數 定義函數 空間 數值 sqrt 字符類 ceil 數據結構用於存儲數據,不同的數據結構對應不同的操作方法,對應不同的分析目的,應選擇合適的數據結構。在處理數據時,為了便於檢查數據對象,可以通過函數attributes(x)來查看數據對象的屬性,str(

Java 10 實戰 1 局部變量類型推斷

static nsh ima 推斷 定義類 println 虛擬機 ID 圖片 現在 Java 9 被遺棄了直接升級到了 Java 10,之前也發過 Java 10 新特性的文章,現在是開始實戰 Java 10 的時候了。 今天要實戰的是 Java 10 中最重要的特性:局

Linux實戰基於Centos6.9+7.4主備DNS服務器搭建實戰

服務器搭建 word uda notes centos6 fcc bfc data 閱讀 個人筆記分享(在線閱讀): http://note.youdao.com/noteshare?id=7898fa39596740bfcc9ca42ad643f045&sub=28A00

R實戰 列聯表和頻數表

列聯表是觀測資料按兩個或更多屬性(定性變數)分類時所列出的頻數分佈表,它是由兩個以上的變數進行交叉分類的頻數分佈表。互動分類的目的是將兩變數分組,然後比較各組的分佈狀況,以尋找變數間的關係。 按兩個變數交叉分類的,該列聯表稱為兩維列聯表;若按3個變數交叉分類,所得的列聯表稱為3維列聯表,依次類推。一維列聯表

SpringCloud實戰 | SpringCloud整合OpenFeign實現微服務之間的呼叫

## **一. 前言** 微服務實戰系列是基於開源微服務專案 [有來商城youlai-mall](https://github.com/hxrui/youlai-mall) 版本升級為背景來開展的,本篇則是講述SpringCloud整合OpenFeign實現微服務之間的相互呼叫,有興趣的朋友可以進去給個sta

Spring Cloud實戰 | Spring Cloud Gateway+Spring Security OAuth2+JWT實現微服務統一認證授權

## **一. 前言** 本篇實戰案例基於 [youlai-mall](https://github.com/hxrui/youlai-mall) 專案。專案使用的是當前主流和最新版本的技術和解決方案,自己不會太多華麗的言辭去描述,只希望能勾起大家對程式設計的一點喜歡。所以有興趣的朋友可以進入 [gith

Spring Cloud實戰 | Spring Cloud整合Spring Security OAuth2認證伺服器統一認證自定義異常處理

[本文完整程式碼下載點選](https://github.com/hxrui/youlai-mall.git) # 一. 前言 相信瞭解過我或者看過我之前的系列文章應該多少知道點我寫這些文章包括建立 [有來商城youlai-mall](https://github.com/hxrui/youlai

Docker實戰 | Docker安裝Nginx,實現基於vue-element-admin框架構建的專案線上部署

## 一. 前言 在上一文中 [點選跳轉](https://www.cnblogs.com/haoxianrui/p/14088400.html) 通過IDEA整合Docker外掛實現微服務的一鍵部署,但 [youlai-mall](https://github.com/hxrui/youlai-mall

Docker實戰 | Docker啟用TLS加密解決暴露2375埠引發的安全漏洞,被黑掉三臺雲主機的教訓總結

## 一. 前言 在之前的文章中 [IDEA整合Docker外掛實現一鍵自動打包部署微服務專案](https://www.cnblogs.com/haoxianrui/p/14088400.html),其中開放了伺服器2375埠監聽,此做法卻引發出來一個安全問題,在上篇文章評論也有好心的童鞋提示,但自己心存