本文將對當今先進的病毒/反病毒技術做全面而細致的介紹,重點當然放在了反病毒上,特別是虛擬機和
實時監控技術。文中首先介紹幾種當今較為流行的病毒技術,包括獲取系統核心態特權級,駐留,截獲系
統操作,變形和加密等。然後分五節詳細討論虛擬機技術:第一節簡單介紹一下虛擬機的概論;第二節介
紹加密變形病毒,作者會分析兩個著名變形病毒的解密子;第三節是虛擬機實現技術詳解,其中會對兩種
不同方案進行比較,同時將剖析一個查毒用虛擬機的總體控制結構;第四節主要是對特定指令處理函數的
分析;最後在第五節中列出了一些反虛擬執行技術做為今後改進的參照。論文的第三章主要介紹實時監控
技術,由於win9x和winnt/2000系統機制和驅動模型不同,所以會分成兩個操作系統進行討論。其中涉及
的技術很廣泛:包括驅動編程技術,文件鉤掛,特權級間通信等等。本文介紹的技術涉及操作系統底層機
制,難度較大。所提供的代碼,包括一個虛擬機C語言源代碼和兩個病毒實時監控驅動程序反匯編代碼,
具有一定的研究和實用價值。
關鍵字:病毒,虛擬機,實時監控
文檔內容目錄
1.緒 論
1. 1課題背景
1.2當今病毒技術的發展狀況
1.2.1系統核心態病毒
1.2.2駐留病毒
1.2.3截獲系統操作
1.2.4加密變形病毒
1.2.5反跟蹤/反虛擬執行病毒
1.2.6直接API調用
1.2.7病毒隱藏
1.2.8病毒特殊感染法
2.虛擬機查毒
2.1虛擬機概論
2. 2加密變形病毒
2.3虛擬機實現技術詳解
2.4虛擬機代碼剖析
2.4.1不依賴標志寄存器指令模擬函數的分析
2.4.2依賴標志寄存器指令模擬函數的分析
2.5反虛擬機技術
3.病毒實時監控
3.1實時監控概論
3.2病毒實時監控實現技術概論
3.3WIN9X下的病毒實時監控
3.3.1實現技術詳解
3.3.2程序結構與流程
3.3.3HOOKSYS.VXD逆向工程代碼剖析
3.4WINNT/2000下的病毒實時監控
3.4.1實現技術詳解
3.4.2程序結構與流程
3.4.3HOOKSYS.SYS逆向工程代碼剖析
結論
致謝
主要參考文獻
1.緒 論
本論文研究的主要內容正如其題目所示是設計並編寫一個先進的反病毒引擎。首先需要對這“先進”二字
做一個解釋,何為“先進”?眾所周知,傳統的反病毒軟件使用的是基於特征碼的靜態掃描技術,即在文
件中尋找特定十六進制串,如果找到,就可判定文件感染了某種病毒。但這種方法在當今病毒技術迅猛發
展的形勢下已經起不到很好的作用了。原因我會在以下的章節中具體描述。因此本論文將不對殺毒引擎中
的特征碼掃描和病毒代碼清除模塊做分析。我們要討論的是為應付先進的病毒技術而必需的兩大反病毒技
術--虛擬機和實時監控技術。具體什麼是虛擬機,什麼是實時監控,我會在相應的章節中做詳盡的介紹。
這裡我要說明的一點是,這兩項技術雖然在前人的工作中已有所體現(被一些國內外先進的反病毒廠家所
使用),但出於商業目的,這些技術並沒有被完全公開,所以你無論從書本文獻還是網路上的資料中都無
法找到關於這些技術的內幕。而我會在相關的章節中剖析大量的程序源碼(主要是2.4節中的一個完整的
虛擬機源碼)或是逆向工程代碼(3.3.3節和3.4.3節中三個我逆向工程的某著名反病毒軟件的實時監控驅
動程序及客戶程序的反匯編代碼),並同時公布一些我個人挖掘的操作系統內部未公開的機制和數據結構
。另外我在文中會大量地提到或引用一些關於系統底層奧秘的大師級經典圖書,這算是給喜愛系統級編程
但又苦於找不到合適教材的朋友開了一份書單。下面就開始進入論文的正題。
1.1課題背景
本論文涉及的兩個主要技術,也是當今反病毒界使用的最為先進的技術中的兩個,究竟是作何而用的呢?
首先說說虛擬機技術,它主要是為查殺加密變形病毒而設計的。簡單地來說,所謂虛擬機並不是個虛擬的
機器,說得更合適一些應該是個虛擬CPU(用軟件實現的CPU),只不過病毒界都這麼叫而已。它的作用主
要是模擬INTEL X86 CPU的工作過程來解釋執行可執行代碼,與真正的CPU一樣能夠取指,譯碼並執行相應
機器指令規定的操作。當然什麼是加密變形病毒,它們為什麼需要被虛擬執行以及怎樣虛擬執行等問題會
在合適的章節中得到解答。再說另一個重頭戲--實時監控技術,它的用處更為廣泛,不僅局限於查殺病毒
。被實時監控的對象也很多,如中斷(Intmon),頁面錯誤(Pfmon),磁盤訪問(Diskmon)等等。用於
殺毒的監控主要是針對文件訪問,在你要對一個文件進行訪問時,實時監控會先檢查文件是否為帶毒文件
,若是,則由用戶選擇是清除病毒還是取消此次操作請求。這樣就給了用戶一個相對安全的執行環境。但
同時,實時監控會使系統性能有所下降,不少殺毒軟件的用戶都抱怨他們的實時監控讓系統變得奇慢無比
而且不穩定。這就給我們的設計提出了更高的要求,即怎樣在保證准確攔截文件操作的同時,讓實時監控
占用的系統資源更少。我會在病毒實時監控一節中專門討論這個問題。這兩項技術在國內外先進的反病毒
廠家的產品中都有使用,雖然它們的源代碼沒有公開,但我們還是可以通過逆向工程的方法來窺視一下它
們的設計思路。其實你用一個十六進制編輯器來打開它們的可執行文件,也許就會看到一些沒有剝掉的調
試符號、變量名字或輸出信息,這些蛛絲馬跡對於理解代碼的意圖大有裨益。同時,在反病毒軟件的安裝
目錄中後綴為.VXD或.SYS就是執行實時監控的驅動程序,可以拿來逆向一下(參看我在後面分析驅動源代
碼中的討論)。相信至此,我們對這兩項技術有了一個大體的了解。後面我們將深入到技術的細節中去。
1.2當今病毒技術的發展狀況
要討論怎樣反病毒,就必須從病毒技術本身的討論開始。正是所謂“知己知彼,百戰不殆”。其實,我認
為目前規定研究病毒技術屬於違法行為存在著很大的弊端。很難想象一個毫無病毒寫作經驗的人會成為殺
毒高手。據我了解,目前國內一些著名反病毒軟件公司的研發隊伍中不乏病毒寫作高手。只不過他們將同
樣的技術用到了正道上,以‘毒’攻‘毒’。所以我希望這篇論文能起到拋磚引玉的作用,期待著有更多
的人會將病毒技術介紹給大眾。當今的病毒與DOS和WIN3.1時代下的從技術角度上看有很多不同。我認為
最大的轉變是:引導區病毒減少了,而腳本型病毒開始泛濫。原因是在當今的操作系統下直接改寫磁盤的
引導區會有一定的難度(DOS則沒有保護,允許調用INT13直接寫盤),而且引導區的改動很容易被發現,
所以很少有人再寫了;而腳本病毒以其傳播效率高且容易編寫而深得病毒作者的青睐。當然由於這兩種病
毒用我上面說過的基於特征碼的靜態掃描技術就可以查殺,所以不在我們的討論之列。我要討論的技術主
要來自於二進制外殼型病毒(感染文件的病毒),並且這些技術大都和操作系統底層機制或386以上CPU的
保護模式相關,所以值得研究。大家都知道DOS下的外殼型病毒主要感染16位的COM或EXE文件,由於DOS沒
有保護,它們能夠輕松地進行駐留,減少可用內存(通過修改MCB鏈),修改系統代碼,攔截系統服務或
中斷。而到了WIN9X和WINNT/2000時代,想寫個運行其上的32位WINDOWS病毒絕非易事。由於頁面保護,你
不可能修改系統的代碼頁。由於I/O許可位圖中的規定,你也不能進行直接端口訪問。在WINDOWS中你不可
能象在DOS中那樣通過截獲INT21H來攔截所有文件操作。總之,你以一個用戶態程序運行,你的行為將受
到操作系統嚴格的控制,不可能再象DOS下那樣為所欲為了。另外值得一提的是,WINDOWS下采用的可執行
文件格式和DOS下的EXE截然不同(普通程序采用PE格式,驅動程序采用LE),所以病毒的感染文件的難度
增大了(PE和LE比較復雜,中間分了若干個節,如果感染錯了,將導致文件不能繼續執行)。因為當今病
毒的新技術太多,我不可能將它們逐一詳細討論,於是就選取了一些重要並具有代表性的在本章的各小節
中進行討論。
1.2.1系統核心態病毒
在介紹什麼是系統核心態病毒之前,有必要討論一下核心態與用戶態的概念。其實只要隨便翻開一本關於
386保護模式匯編程序設計的教科書,都可以找到對這兩個概念的講述。386及以上的CPU實現了4個特權級
模式(WINDOWS只用到了其中兩個),其中特權級0(Ring0)是留給操作系統代碼,設備驅動程序代碼使
用的,它們工作於系統核心態;而特權極3(Ring3)則給普通的用戶程序使用,它們工作在用戶態。運行
於處理器核心態的代碼不受任何的限制,可以自由地訪問任何有效地址,進行直接端口訪問。而運行於用
戶態的代碼則要受到處理器的諸多檢查,它們只能訪問映射其地址空間的頁表項中規定的在用戶態下可訪
問頁面的虛擬地址,且只能對任務狀態段(TSS)中I/O許可位圖(I/O Permission Bitmap)中規定的可
訪問端口進行直接訪問(此時處理器狀態和控制標志寄存器EFLAGS中的IOPL通常為0,指明當前可以進行
直接I/O的最低特權級別是Ring0)。以上的討論只限於保護模式操作系統,象DOS這種實模式操作系統則
沒有這些概念,其中的所有代碼都可被看作運行在核心態。既然運行在核心態有如此之多的優勢,那麼病
毒當然沒有理由不想得到Ring0。處理器模式從Ring3向Ring0的切換發生在控制權轉移時,有以下兩種情
況:訪問調用門的長轉移指令CALL,訪問中斷門或陷阱門的INT指令。具體的轉移細節由於涉及復雜的保
護檢查和堆棧切換,不再贅述,請參閱相關資料。現代的操作系統通常使用中斷門來提供系統服務,通過
執行一條陷入指令來完成模式切換,在INTEL X86上這條指令是INT,如在WIN9X下是INT30(保護模式回調
),在LINUX下是INT80,在WINNT/2000下是INT2E。用戶模式的服務程序(如系統DLL)通過執行一個
INTXX來請求系統服務,然後處理器模式將切換到核心態,工作於核心態的相應的系統代碼將服務於此次
請求並將結果傳給用戶程序。下面就舉例子說明病毒進入系統核心態的方法。
在WIN9X下進程虛擬地址空間中映射共享系統代碼的部分(3G--4G)中除了最上面4M頁表有頁面保護外其
它地方可由用戶程序讀寫。如果你用Softice(系統級調試器)的PAGE命令查看這些地址的頁屬性,則你
會驚奇地發現U RW位,這說明這些地址可從用戶態