????????論文原文的引言主要有兩大部分的內容:介紹計算機病毒,明確本文使用的病毒分類方式;分析傳統計算機病毒檢測存在的弊端。對于計算機病毒的定義,文中給出的定義比較嚴謹,我自己查了一下現在百度百科的定義,兩者基本一致,都提到了計算機病毒包含了生物 病毒的特點,即病毒的傳染性、潛伏性、針對性和破壞性;不過現在很多的定義都多強調了是人為編寫的這一屬性。原文之后將計算機病毒按傳染的方式分,分為傳染磁盤引導區(BOOT)的計算機病毒和傳染可執行文件(FILE)的計算機病毒。
- 傳染磁盤引導區的計算機病毒:當時的電腦,應該主流是使用BIOS(Basic Input/Output System)進行啟動,對應的分區方式是MBR(Master Boot Record)。計算機會通過BIOS系統訪問到磁盤的首個扇區:MBR,就是原文中所謂的Boot區。MBR的大小一般是512字節,其中前面的446字節存儲著啟動操作系統的代碼,后面存儲著一些標識符和MBR的分區表等這里就不贅述了。而傳染磁盤引導區的計算機病毒同常是通過一種“轉儲與重定向”的技術實現對操作系統的奪取。大概的原理就是病毒程序會找到MBR,然后將MBR中健康的引導代碼(前446字節中存儲的啟動程序)復制到磁盤的一個隱蔽位置,然后重寫字節的引導代碼到MBR的引導代碼部分,這樣在BIOS啟動時,就會執行病毒代碼,致使病毒能夠奪取操作系統的控制權。這種病毒隱蔽性強,而且在操作系統啟動前就可以被啟用,能繞過絕大多數安全防護軟件。常見的病毒有Stoned,Michaelangelo。
- 傳染可執行文件的計算機病毒:這種病毒比較常見也比較熟悉。它們主要通過感染可執行文件(當時的.com和.exe)文件,讓系統在執行文件時,先執行病毒文件的程序,后執行健康程序達到感染電腦的目的。在DOS時代,有比較流行的病毒會創建一個與源文件(.exe)同名的.com文件。而因為DOS會先執行.com文件再執行.exe文件從而達到感染電腦的目的。
接著原文指出傳統計算機病毒檢測方法是在程序中尋找已發現病毒的特征串,如找到,則認為該程序染毒,否則,認為該程序是干凈的。這樣的方法有兩大弊端:容易誤檢健康程序、沒有辦法檢測病毒的變種。
- 誤檢健康程序:傳統病毒檢測方法的核心在于“病毒特征串”,這些特征串一般是一些特殊指令(如發送郵件、感染文件的機器指令)、特殊文本(嘲諷提示你的電腦已中毒的字符串)、文件結構特征變化等。在發現病毒后,病毒分析師一般會提取病毒文件,在隔離環境中提取“病毒特征串”提取出的特征串將會用于日后這類病毒的查殺。個人認為,可能是因為原文發表的年代提取特征串的技術不夠成熟,現在通過這種方式查殺誤檢率應該是不高的。
- 沒有辦法檢測病毒的變種:因為特征串需要在已發現的病毒中提取,新型的病毒就可以有意規避,導致傳統病毒查殺方法有較嚴重的滯后性。
原文的第二部分探討了病毒判定專家系統的基本原理,主要是從理論角度驗證這個專家系統的可行性。有兩個主要理論:病毒的不可判定原理和智能判定原理。
- 病毒的不可判定原理:原文其實想要表達兩點:1、馮·諾依曼體系結構讓病毒的存在不可避免,2、不存在可以百分百準確判斷程序是否為病毒的程序。首先馮·諾依曼的計算機體系結構是以存儲器為核心的,所以在這樣的體系結構里指令和數據在物理上的地位其實是相同的,這就導致指令是可以被修改,編寫的,這就給了滋養計算機病毒的土壤。原文對第二點其實沒有太講清楚,我們可以利用反證法證明一下。如果有一個程序A(疑似病毒程序)可以100%正確返回傳入的程序是否為病毒程序,那我們可以利用分支結構寫一個程序:如果程序A認為我是病毒,我就什么都不做;如果程序A認為我不是病毒,我就啟用病毒程序。這樣一個矛盾程序就可以證明程序A不可能存在。而這個反證法能成立也是“得益于”馮·諾伊曼體系結構,這樣這個矛盾程序能夠將自己作為參數傳遞給程序A,因為程序本身也就是一串數據。
- 智能判定原理:這一部分原文主要闡述了作者研發的專家系統的主要原理:通過判斷程序是否有傳染性來判斷這個程序是否是病毒。這個專家系統判定病毒有兩個主要過程:先搭建疑似病毒程序的運行環境,讓疑似程序在環境中運行并記錄可疑的運行結果;然后根據之前運行總結出的規則庫進行正向不精確推理機判斷這個程序是否為病毒。其中提到的MYCIN是早期用于醫療領域的專家系統,雖然是以簡單的IF-THEN的形式進行推理,但是引入了置信度系統,機器的回答不再是簡單的“是”或“否”而是可能性,原文作者應該也是引入了類似置信度系統搭建了正向不精確推理機。
原文的第三部分,也是論文的主體,介紹了這個病毒判定專家系統的設計方法。原文以傳染磁盤引導區的計算機病毒為例介紹專家系統的設計方法,先介紹了這種計算機病毒的主要原理,我在前文也大致描述過了,這里就不贅述了。不過其中有提到了游戲有自己的BOOT程序,容易受到攻擊。這類病毒更像是傳染磁盤引導區的計算機病毒和傳染可執行文件的計算機病毒的結合,通過修改游戲的BOOT啟動程序,達到接管游戲系統環境的目的,常見于破解的盜版游戲,盜版游戲Mod中。不過其實這類病毒制作難度較大,破壞范圍容易停留在游戲系統內部,所以并不常見。
來到核心的判斷邏輯上:
- 第一層判斷:未知BOOT程序是否為某個版本的DOS引導塊或已知軟件的引導快,若是,顯然就不是病毒。這里涉及到一個已知安全BOOT程序庫的搭建。
- 第二層判斷:若不在已知BOOT程序庫中,看這個程序是否為已知病毒BOOT。這里涉及到已知病毒BOOT程序庫的搭建。這兩個判斷看似簡單,其實對比傳統檢測更直接、更快速、更準確,而且為后面的專家系統的判斷減輕了很多負擔。
- 第三層判斷:如果兩個庫中都沒有,則需要運行這個BOOT程序,看是否會存在違反規則的情況出現,這里涉及到規則庫的搭建。
在第一層、第二層判斷中,因為各廠商的BOOT區的一些標識符并不相同,磁盤種類也不盡相同,所以這里的判斷不能是1對1的匹配,需要使用類似于模糊匹配的算法進行判斷。而且只匹配BOOT區的代碼部分(前文提到的前446字節的代碼部分)。
模糊匹配算法:
- 通過JMP語句找到第一條非JMP語句。這里的JMP語句是匯編語言中無條件跳轉指令,指向下一個需要執行的指令地址,通過代碼中的標簽信息獲取到整體BOOT的代碼長度。
- 對比未知BOOT代碼和需要對比的BOOT代碼獲取相同的字節數
- 用相同字節數/代碼長度,得出相同率。原文中認為95%以上的相同率就可以認為這個BOOT代碼是安全的,因為5%的代碼量至多十幾字節不足以完成一個病毒功能的編寫。
- 如果庫中的BOOT代碼為空則不做判斷,取庫中的下一個BOOT進行比較。
在第三層的判斷,也是整個專家系統最核心的部分中,原文先介紹了規則庫的構建。
原文通過分析大麻病毒(前文提到的Stone病毒)的工作流程提出了4條病毒BOOT程序會違反的原則:
- 在DOS自舉中,任何企圖接管敏感性中斷和高端駐留的請求都是不允許的。簡單來說攻擊BOOT的程序主要目的是要接管操作系統,而想要接管操作系統,就需要截獲中斷向量,要想截獲中斷向量,就需要駐留在內存中。因為DOS使用內存中的低端,所以一般BOOT病毒會使用高端駐留的方式,可以以此看BOOT程序是否為病毒。
- 磁盤引導扇中絕對不能出現寫盤指令。這一點比較顯而易見,因為正常健康的BOOT程序一般是不會有寫盤指令的。
- 中判別時間和產生隨機數進行判斷,都是可疑的。主要是提到病毒需要一個啟動條件,而這個條件往往通過時間的方式觸發。可以根據這個點判斷BOOT程序是否為病毒。
- 要密切注意最后控制權的移交。
根據這四條原則最終形成的規則庫能夠還不能比較準確的判斷未知BOOT程序是否為病毒程序,所以原文作者為構建的規則庫中的規則進行了加權。這樣可以構建出類似于MYCIN專家系統中的置信度體系,給出一個可能性,更加利于病毒的判斷。
這篇論文中,主要的思想是將專家系統的思想移植到病毒判斷的算法上,其核心在于模糊的不精確的判斷。而在圖形學領域其實存在非常多需要模糊判斷的問題,比如在角色的動畫與運動控制方面。現在常用IK生成可能的動作,但仍不算特別準確,像一直被困擾的角色上樓梯的問題。我感覺這方面其實也可以利用這篇論文的思想。通過一些角色運動不能違反的原則如:人的膝蓋不能向后彎曲、走路時手臂擺動與腿部運動相反等構建出一套知識庫。并利用生物力學和解刨學的規則完善規則庫,甚至是通過不停的實機測試完善規則庫。通過這個規則庫我們就能比較準確的判斷某個角色動畫是否合理,從而制作出更加合理的角色動畫。
參考文獻
[1]雷軍.計算機病毒判定專家系統原理與設計[J].計算機研究與發展,1992,(08):53-59+66.