廣義病毒涵蓋所有威脅電腦安全的程式,大致分七類:
早期病毒技術簡單,廣泛採用特徵碼比對。特徵碼為一串十六進位字串(如第 1034 位元組為 0xEC 0x99 0x80 0x99 即大麻病毒),長度可達數十位元組,多特徵碼交叉驗證確保準確度。
病毒進化為多型(每次感染變形),同類病毒變體達天文數字,甚至連續三位元組都不同。對策:特徵碼分段、引入「遮罩位元組」(不參與比較),但誤報率大增,現已難有效應對新病毒。
分析指令順序、特定組合等病毒行為特徵(如非常規讀寫檔案、終結自身、非常規進入 Ring 0),判斷未知病毒。優於靜態特徵碼,具備一定未知病毒處理能力,但仍有誤判,且無法確定為病毒而無法直接殺毒。
極少數防毒軟體採用虛擬機技術,模擬可控程式運行環境(如《駭客任務》母體)。病毒在虛擬機中脫去偽裝進行傳染時被發現,可偵測大部分多型與大量未知病毒,查殺效果佳。
| 技術 | 比喻 | 優點 | 缺點 |
|---|---|---|---|
| 特徵碼 | 照相識別臉孔 | 速度快、準確率高 | 無法對付多型/加密病毒 |
| 廣譜特徵 | 拿照片追查已知罪犯,注意假髮墨鏡 | 可偵測部分多型病毒 | 誤報率高 |
| 啟發式 | 警察看你帶槍起疑 | 誤報率低、能查多型與變種 | 未知病毒偵測能力較低 |
| 行為判定(虛擬機) | 偵探依行為識別犯罪 | 能判別未知病毒、標準病毒準確率高 | 實現難度大、速度慢 |
typedef struct tagVSIGNATURE {
BAV_SIGN_TYPE eType; // 特徵碼類型枚舉
DWORD dwOffset; // 偏移量
DWORD dwSize; // 長度
BYTE Signature[MAX_SIGNATURE_LEN]; // 特徵碼串,目前 32 位元組
} VSIGNATURE;
typedef struct tagVRECORD {
int nSize; // 結構版本控制
DWORD dwVirusID; // 病毒 ID
DWORD dwSignCount; // 特徵碼段數
PVSIGNATURE pVSing[8]; // 各段特徵碼內容
DWORD dwTreatCount; // 處理方法數
PVTREATMENT pVTreat[8]; // 處理方法內容
} VRECORD;
VSIGNATURE 存放單一特徵碼,VRECORD 組成完整病毒記錄。演示版病毒庫直接編碼在 CVirusDB::Load() 中,例如 EICAR 測試病毒第一段特徵碼為 32 位元組十六進位串。