您現在的位置:網站首頁答辯論文論文指導實戰方法

反病毒引擎設計之緒論篇

  • 簡介:1.緒論
    • 請與管理員聯系購買資料 QQ:5739126
  • 論文簡介
  • 相關論文
  • 論文下載
1.緒論

本文研究的主要內容正如其題目所示是設計并編寫一個先進的反病毒引擎。首先需要對這“先進”二字做一個解釋,何為“先進”?眾所周知,傳統的反病毒軟件使用的是基于特征碼的靜態掃描技術,即在文件中尋找特定十六進制串,如果找到,就可判定文件感染了某種病毒。但這種方法在當今病毒技術迅猛發展的形勢下已經起不到很好的作用了。原因我會在以下的章節中具體描述。因此本文將不對殺毒引擎中的特征碼掃描和病毒代碼清除模塊做分析。我們要討論的是為應付先進的病毒技術而必需的兩大反病毒技術--虛擬機和實時監控技術。具體什么是虛擬機,什么是實時監控,我會在相應的章節中做詳盡的介紹。這里我要說明的一點是,這兩項技術雖然在前人的工作中已有所體現(被一些國內外先進的反病毒廠家所使用),但出于商業目的,這些技術并沒有被完全公開,所以你無論從書本文獻還是網路上的資料中都無法找到關于這些技術的內幕。而我會在相關的章節中剖析大量的程序源碼(主要是2.4節中的一個完整的虛擬機源碼)或是逆向工程代碼(3.3.3節和3.4.3節中三個我逆向工程的某著名反病毒軟件的實時監控驅動程序及客戶程序的反匯編代碼),并同時公布一些我個人挖掘的操作系統內部未公開的機制和數據結構。下面就開始進入正題。

目錄

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病毒特殊感染法

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指令。具體的轉移細節由于涉及復雜的保護檢查和堆棧切換,不再贅述,請參閱相關資料,F代的操作系統通常使用中斷門來提供系統服務,通過執行一條陷入指令來完成模式切換,在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, [email protected][ecx] ;取得需要工作在Ring0的函數的偏移地址
push esi
mov [ebx-04h], si
shr esi, 16
mov [ebx+02h], si ;設置為新的中斷入口地址
pop esi
; *************************************
; * 產生一個異常來進入Ring0 *
; *************************************
int HookExceptionNumber ;產生一個異常


當然,后面還有恢復原來中斷入口地址和異常處理幀的代碼。

剛才所討論的技術僅限于WIN9X,想在WINNT/2000下進入Ring0則沒有這么容易。主要的原因是WINNT/2000沒有上述的漏洞,它們的系統代碼頁面(2G--4G)有很好的頁保護。大于0x80000000的虛擬地址對于用戶程序是不可見的。如果你用Softice的PAGE命令查看這些地址的頁屬性,你會發現S位,這說明這些地址僅可從核心態訪問。所以想在IDT,GDT隨意構造描述符,運行時修改內核是根本做不到的。所能做的僅是通過加載一個驅動程序,使用它來做你在Ring3下做不到的事情。病毒可以在它們加載的驅動中修改內核代碼,或為病毒本身創建調用門(利用NT由Ntoskrnl.exe導出的未公開的系統服務KeI386AllocateGdtSelectors,KeI386SetGdtSelector,KeI386ReleaseGdtSelectors)。如Funlove病毒就利用驅動來修改系統文件(Ntoskrnl.exe,Ntldr)以繞過安全檢查。但這里面有兩個問題,其一是驅動程序從哪里來,現代病毒普遍使用一個稱為“Drop”的技術,即在病毒體本身包含驅動程序二進制碼(可以進行壓縮或動態構造文件頭),在病毒需要使用時,動態生成驅動程序并將它們扔到磁盤上,然后馬上通過在SCM(服務控制管理器)注冊并最終調用StartService來使驅動程序得以運行;其二是加載一個驅動程序需要管理員身份,普通帳號在調用上述的加載函數時會返回失。ò踩酉到y要檢查用戶的訪問令牌(Token)中有無SeLoadDriverPrivilege特權),但多數用戶在大多時候登錄時會選擇管理員身份,否則連病毒實時監控驅動也同樣無法加載,所以留給病毒的機會還是很多的。

1.2.2駐留病毒

駐留病毒是指那些在內存中尋找合適的頁面并將病毒自身拷貝到其中且在系統運行期間能夠始終保持病毒代碼的存在。駐留病毒比那些直接感染(Direct-action)型病毒更具隱蔽性,它通常要截獲某些系統操作來達到感染傳播的目的。進入了核心態的病毒可以利用系統服務來達到此目的,如CIH病毒通過調用一個由VMM導出的服務VMMCALL_PageAllocate在大于0xC0000000的地址上分配一塊頁面空間。而處于用戶態的程序要想在程序退出后仍駐留代碼的部分于內存中似乎是不可能的,因為無論用戶程序分配何種內存都將作為進程占用資源的一部分,一旦進程結束,所占資源將立即被釋放。所以我們要做的是分配一塊進程退出后仍可保持的內存。
病毒寫作小組29A的成員GriYo 運用的一個技術很有創意:他通過CreateFileMappingA 和MapViewOfFile創建了一個區域對象并映射它的一個視口到自己的地址空間中去,并把病毒體搬到那里,由于文件映射所在的虛擬地址處于共享區域(能夠被所有進程看到,即所有進程用于映射共享區內虛擬地址的頁表項全都指向相同的物理頁面),所以下一步他通過向Explorer.exe中注入一段代碼(利用WriteProcessMemory來向其它進程的地址空間寫入數據),而這段代碼會從Explorer.exe的地址空間中再次申請打開這個文件映射。如此一來,即便病毒退出,但由于Explorer.exe還對映射頁面保持引用,所以一份病毒體代碼就一直保持在可以影響所有進程的內存頁面中直至Explorer.exe退出。
.........
查看評論 已有0位網友發表了看法
  • 驗證碼:
四川三人麻将 广西快乐双彩号码推荐 12奖金对照表 体彩浙江11选5中奖规则 重庆时时彩软件 天津11选五遗漏 黑龙江11选五开奖图 哪些是蓝筹股 中国福利彩票上海天天彩选4 天津时时彩每天多少期 后二组选包胆倍投方案