先進的反病毒引擎設計之概念分析篇(轉)

RegisterForBlog發表於2007-09-19
先進的反病毒引擎設計之概念分析篇(轉)[@more@]

  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位,這說明這些地址可從使用者態直接讀出或寫入。這意味著任何一個使用者程式都能夠在其執行過程中惡意或無意地破壞作業系統內碼表。由此病毒就可以在GDT(全域性描述符表),LDT(區域性描述符表)中隨意構造門描述符並藉此進入核心態。當然,也不一定要藉助門描述,還有許多方法可以得到Ring0。據我所知的方法就不下10餘種之多,如透過呼叫門(Callgate),中斷門(Intgate),陷阱門(Trapgate),異常門(Fault),中斷請求(IRQs),埠(Ports),虛擬機器管理器(VMM),回撥(Callback),形式轉換(Thunks),裝置IO控制(DeviceIOControl),API函式(SetThreadContext) ,中斷2E服務(NTKERN.VxD)。由於篇幅的限制我不可能將所有的方法逐一描述清楚,這裡我僅選取最具有代表性的CIH病毒1.5版開頭的一段程式碼。

  人們常說CIH病毒運用了VXD(虛擬裝置驅動)技術,其實它本身並不是VXD。只不過它利用WIN9X上述漏洞,在IDT(中斷描述符表)中構造了一個DPL(段特權級)為3的中斷門(意味著可以從Ring3下執行訪問該中斷門的INT指令),並使描述符指向自己私有地址空間中的一個需要工作在Ring0下的函式地址。這樣一來CIH就可以透過簡單的執行一條INTXX指令(CIH選擇使用INT3,是為了使同樣接掛INT3的系統偵錯程式Softice無法正常工作以達到反跟蹤的目的)進入系統核心態,從而呼叫系統的VMM和VXD服務。以下是我註釋的一段CIH1.5的原始碼:

  ; *************************************

  ; * 修改IDT以求得核心態特權級 *

  ; *************************************

  push eax

  sidt [esp-02h] ;取得IDT表基地址

  pop ebx

  add ebx, HookExceptionNumber*08h+04h ;ZF = 0

  cli ;讀取修改系統資料時先禁止中斷

  mov ebp, [ebx]

  mov bp, [ebx-04h] ;取得原來的中斷入口地址

  lea esi, MyExceptionHook-@1[ecx] ;取得需要工作在Ring0的函式的偏移地址

  push esi

  mov [ebx-04h], si

  shr esi, 16

  mov [eb

  

·上一篇:

·下一篇:
 
     最新更新
·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·


| | | | | | |

Copyright © 2004 - 2007 All Rights Reserved

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10763080/viewspace-970245/,如需轉載,請註明出處,否則將追究法律責任。

先進的反病毒引擎設計之概念分析篇(轉)
請登入後發表評論 登入
全部評論

相關文章