?? 反病毒引擎設計.htm
字號:
StopToRunVirusCode-@0[ebx] ;你的異常處理函數的偏移<BR> push ecx
;你的異常處理函數的偏移壓棧<BR> push eax
;前一個err結構的地址壓棧<BR> ;構造err結構,記這時候的esp(err結構指針)為esp0<BR> ……<BR> StopToRunVirusCode:<BR> @1
= StopToRunVirusCode<BR> xor ebx, ebx
;發生異常時系統在你的練前又加了一個err結構,<BR>
;所以要先找到原來的結構地址<BR> mov eax, fs:[ebx] ;
取現在的err結構的地址eax<BR> mov esp, [eax] ;
取下個結構地址即eps0到esp<BR> RestoreSE:
;沒有發生異常時順利的回到這里,你這時的esp為本esp0<BR> pop dword ptr fs:[ebx]
;彈出原來的前一個結構的地址到fs:0<BR> pop eax
;彈出你的異常處理地址,平棧而已<BR> 1.2.7病毒隱藏<BR>實現進程或模塊隱藏應該是一個成功病毒所必須具備的特征。在WIN9X下Kernel32.dll有一個可以使進程從進程管理器進程列表中消失的導出函數RegisterServiceProcess
,但它不能使病毒逃離一些進程瀏覽工具的監視。但當你知道這些工具是如何來枚舉進程后,你也會找到對付這些工具相應的辦法。進程瀏覽工具在WIN9X下大都使用一個叫做ToolHelp32.dll的動態連接庫中的Process32First和Process32Next兩個函數來實現進程枚舉的;而在WINNT/2000里也有PSAPI.DLL導出的EnumProcess可用以實現同樣之功能。所以病毒就可以考慮修改這些公用函數的部分代碼,使之不能返回特定進程的信息從而實現病毒的隱藏。<BR><BR>但事情遠沒有想象中那么簡單,俗話說“道高一尺,魔高一丈”,此理不謬。由于現在很多逆項工程師的努力,微軟力圖隱藏的許多秘密已經逐步被人們所挖掘出來。當然其中就包括WINDOWS內核使用的管理進程和模塊的內部數據結構和代碼。比如WINNT/2000用由ntoskrnl.exe導出的內核變量PsInitialSystemProcess所指向的進程Eprocess塊雙向鏈表來描述系統中所有活動的進程。如果進程瀏覽工具直接在驅動程序的幫助下從系統內核空間中讀出這些數據來枚舉進程,那么任何病毒也無法從中逃脫。<BR><BR>有關Eprocess的具體結構和功能,請參看David
A.Solomon和Mark E.Russinovich的《Inside
Windows2000》第三版。<BR><BR>1.2.8病毒特殊感染法<BR>對病毒稍微有些常識的人都知道,普通病毒是通過將自身附加到宿主尾部(如此一來,宿主的大小就會增加),并修改程序入口點來使病毒得到擊活。但現在不少病毒通過使用特殊的感染技巧能夠使宿主大小及宿主文件頭上的入口點保持不變。<BR><BR>附加了病毒代碼卻使被感染文件大小不變聽起來讓人不可思議,其實它是利用了PE文件格式的特點:PE文件的每個節之間留有按簇大小對齊后的空洞,病毒體如果足夠小則可以將自身分成幾份并分別插入到每個節最后的空隙中,這樣就不必額外增加一個節,因而文件大小保持不變。著名的CIH病毒正是運用這一技術的典型范例(它的大小只有1K左右)。<BR><BR>病毒在不修改文件頭入口點的前提下要想獲得控制權并非易事:入口點不變意味著程序是從原程序的入口代碼處開始執行的,病毒必須要將原程序代碼中的一處修改為導向病毒入口的跳轉指令。原理就是這樣,但其中還存在很多可討論的地方,如在原程序代碼的何處插入這條跳轉指令。一些查毒工具掃描可執行文件頭部的入口點域,如果發現它指向的地方不正常,即不在代碼節而在資源節或重定位節中,則有理由懷疑文件感染了某種病毒。所以剛才討論那種病毒界稱之為EPO(入口點模糊)的技術可以很好的對付這樣的掃描,同時它還是反虛擬執行的重要手段。<BR><BR>另外值得一提的是現在不少病毒已經支持對壓縮文件的感染。如Win32.crypto病毒就可以感染ZIP,ARJ,RAR,ACE,CAB
等諸多類型的壓縮文件。這些病毒的代碼中含有對特定壓縮文件類型解壓并壓縮的代碼段,可以先把壓縮文件中的內容解壓出來,然后對合適的文件進行感染,最后再將感染后文件壓縮回去并同時修改壓縮文件頭部的校驗和。目前不少反病毒軟件都支持查多種格式的壓縮文件,但對有些染毒的壓縮文件無法殺除。原因我想可能是怕由于某種緣故,如解壓或壓縮有誤,校驗和計算不對等,使得清除后壓縮文件格式被破壞。病毒卻不用對用戶的文件損壞負責,所以不存在這種擔心。<BR><BR>2.虛擬機查毒<BR>2.1虛擬機概論<BR>近些年,虛擬機,在反病毒界也被稱為通用解密器,已經成為反病毒軟件中最引人注目的部分,盡管反病毒者對于它的運用還遠沒有達到一個完美的程度,但虛擬機以其諸如"病毒指令碼模擬器"和"Stryker"等多變的名稱為反病毒產品的市場銷售帶來了光明的前景。以下的討論將把我們帶入一個精彩的虛擬技術的世界中。
<BR><BR>首先要談及的是虛擬機的概念和它與諸如Vmware(美國VMWARE公司生產的一款虛擬機,它支持在WINNT/2000環境下運行如Linux等其它操作系統)和WIN9X下的VDM(DOS虛擬機,它用來在32位保護模式環境中運行16實模式代碼)的區別。其實這些虛擬機的設計思想是有淵源可尋的,早在上個世紀60年代IBM就開發了一套名為VM/370的操作系統。VM/370在不同的程序之間提供搶先式多任務,作法是在單一實際的硬件上模式出多部虛擬機器。典型的VM/370會話,使用者坐在電纜連接的遠程終端前,經由控制程序的一個IPL命令,模擬真實機器的初始化程序裝載操作,于是
一套完整的操作系統被載入虛擬機器中,并開始為使用者著手創建一個會話。這套模擬系統是如此的完備,系統程序員甚至可以運行它的一個虛擬副本,來對新版本進行除錯。Vmware與此非常相似,它作為原操作系統下的一個應用程序可以為運行于其上的目標操作系統創建出一部虛擬的機器,目標操作系統就象運行在單獨一臺真正機器上,絲毫察覺不到自己處于Vmware的控制之下。當在Vmware中按下電源鍵(Power
On)時,窗口里出現了機器自檢畫面,接著是操作系統的載入,一切都和真的一樣。而WIN9X為了讓多個程序共享CPU和其它硬件資源決定使用VMs(所有Win32應用程序運行在一部系統虛擬機上;而每個16位DOS程序擁有一部DOS虛擬機)。VM是一個完全由軟件虛構出來的東西,以和真實電腦完全相同的方式來回應應用程序所提出的需求。從某種角度來看,你可以將一部標準的PC的結構視為一套API。這套API的元素包括硬件I/O系統,和以中斷為基礎的BIOS和MS-DOS。WIN9X常常以它自己的軟件來代理這些傳統的API元素,以便能夠對珍貴的硬件多重發訊。在VM上運行的應用程序認為自己獨占整個機器,它們相信自己是從真正的鍵盤和鼠標獲得輸入,并從真正的屏幕上輸出。稍被加一點限制,它們甚至可以認為自己完全擁有CPU和全部內存。實現虛擬技術關鍵在于軟件虛擬化和硬件虛擬化,下面簡要介紹WIN9X下的DOS虛擬機的實現。<BR><BR>當Windows移往保護模式后,保護模式程序無法直接調用實模式的MS-DOS處理例程,也不能直接調用實模式的BIOS。軟件虛擬化就是用來描述保護模式Windows部件是如何能夠和實模式MS-DOS和BIOS彼此互動。軟件虛擬化要求操作系統能夠攔截企圖跨越保護模式和實模式邊界的調用,并且調整適當的參數寄存器后,改變CPU模式。WIN9X使用虛擬設備驅動(VXD)攔截來自保護模式的中斷,通過實模式中斷向量表(IVT),將之轉換為實模式中斷調用。做為轉換的一部分,VXD必須使用置于保護模式擴展內存中的參數,生成出適當的參數,并將之放在實模式(V86)操作系統可以存取的地方。服務結束后,VXD在把結果交給擴展內存中保護模式調用端。16位DOS程序中大量的21H和13H中斷調用就此解決,但其中還存在不少直接端口I/O操作,這就需要引入硬件虛擬化來解決。虛擬硬件的出現是為了在硬件中斷請求線上產生中斷請求,為了回應IN和OUT指令,改變特殊內存映射位置等原因。硬件虛擬化依賴于Intel
80386+的幾個特性。其中一個是I/O許可掩碼,使操作系統可能誘捕(Trap)對任何一個端口的所有IN/OUT指令。另一個特性是:由硬件輔助的分頁機制,使操作系統能夠提供虛擬內存,并攔截對內存地址的存取操作,將Video
RAM虛擬化是此很好的例證。最后一個必要的特性是CPU的虛擬8086(V86)模式 ,讓DOS程序象在實模式中那樣地執行。
<BR><BR>我們下面討論用于查毒的虛擬機并不是象某些人想象的:如Vmware一樣為待查可執行程序創建一個虛擬的執行環境,提供它可能用到的一切元素,包括硬盤,端口等,讓它在其上自由發揮,最后根據其行為來判定是否為病毒。當然這是個不錯的構想,但考慮到其設計難度過大(需模擬元素過多且行為分析要借助人工智能理論),因而只能作為以后發展的方向。我設計的虛擬機嚴格的說不能稱之為虛擬機器,而叫做虛擬CPU,通用解密器等更為合適一些,但由于反病毒界習慣稱之為虛擬機,所以在下面的討論中我還將延續這個名稱。查毒的虛擬機是一個軟件模擬的CPU,它可以象真正CPU一樣取指,譯碼,執行,它可以模擬一段代碼在真正CPU上運行得到的結果。給定一組機器碼序列,虛擬機會自動從中取出第一條指令操作碼部分,判斷操作碼類型和尋址方式以確定該指令長度,然后在相應的函數中執行該指令,并根據執行后的結果確定下條指令的位置,如此循環反復直到某個特定情況發生以結束工作,這就是虛擬機的基本工作原理和簡單流程。設計虛擬機查毒的目的是為了對付加密變形病毒,虛擬機首先從文件中確定并讀取病毒入口處代碼,然后以上述工作步驟解釋執行病毒頭部的解密段(decryptor),最后在執行完的結果(解密后的病毒體明文)中查找病毒的特征碼。這里所謂的“虛擬”,并非是創建了什么虛擬環境,而是指染毒文件并沒有實際執行,只不過是虛擬機模擬了其真實執行時的效果。這就是虛擬機查毒基本原理,具體介紹請參看后面的相關章節。
<BR><BR>當然,虛擬執行技術使用范圍遠不止自動脫殼(虛擬機查毒實際上是自動跟蹤病毒入口的解密子將加密的病毒體按其解密算法進行解密),它還可以應用在跨平臺高級語言解釋器,惡意代碼分析,調試器。如劉濤濤設計的國產調試器Trdos就是完全利用虛擬技術解釋執行被調試程序的每條指令,這種調試器比較起傳統的斷點式調試器(Debug,Softice等)具有諸多優勢,如不易被被調試者察覺,斷點個數沒有限制等。
<BR><BR>2.2加密變形病毒<BR>前面提到過設計虛擬機查毒的目的是為了對付加密變形病毒。這一章就重點介紹加密變形技術。<BR><BR>早期病毒沒有使用任何復雜的反檢測技術,如果拿反匯編工具打開病毒體代碼看到的將是真正的機器碼。因而可以由病毒體內某處一段機器代碼和此處距離病毒入口(注意不是文件頭)偏移值來唯一確定一種病毒。查毒時只需簡單的確定病毒入口并在指定偏移處掃描特定代碼串。這種靜態掃描技術對付普通病毒是萬無一失的。<BR><BR>隨著病毒技術的發展,出現了一類加密病毒。這類病毒的特點是:其入口處具有解密子(decryptor),而病毒主體代碼被加了密。運行時首先得到控制權的解密代碼將對病毒主體進行循環解密,完成后將控制交給病毒主體運行,病毒主體感染文件時會將解密子,用隨機密鑰加密過的病毒主體,和保存在病毒體內或嵌入解密子中的密鑰一同寫入被感染文件。由于同一種病毒的不同傳染實例的病毒主體是用不同的密鑰進行加密,因而不可能在其中找到唯一的一段代碼串和偏移來代表此病毒的特征,似乎靜態掃描技術對此即將失效。但仔細想想,不同傳染實例的解密子仍保持不變機器碼明文(從理論上講任何加密程序中都存在未加密的機器碼,否則程序無法執行),所以將特征碼選于此處雖然會冒一定的誤報風險(解密子中代碼缺少病毒特性,同樣的特征碼也會出現在正常程序中),但仍不失為一種有效的方法。<BR><BR>由于加密病毒還沒有能夠完全逃脫靜態特征碼掃描,所以病毒寫作者在加密病毒的基礎之上進行改進,使解密子的代碼對不同傳染實例呈現出多樣性,這就出現了加密變形病毒。它和加密病毒非常類似,唯一的改進在于病毒主體在感染不同文件會構造出一個功能相同但代碼不同的解密子,也就是不同傳染實例的解密子具有相同的解密功能但代碼卻截然不同。比如原本一條指令完全可以拆成幾條來完成,中間可能會被插入無用的垃圾代碼。這樣,由于無法找到不變的特征碼,靜態掃描技術就徹底失效了。下面先舉兩個例子說明加密變形病毒解密子構造,然后再討論怎樣用虛擬執行技術檢測加密變形病毒。<BR><BR>著名多形病毒Marburg的變形解密子:<BR><BR> 00401020:
movsx edi,si ;病毒入口<BR> 00401023: movsx
edx,bp<BR> 00401026: jmp
00408a99<BR> ......<BR> 00407400:
;病毒體入口<BR> 加密的病毒主體<BR> 00408a94:
;解密指針初始值<BR> ......<BR> 00408a99: mov
dl,f7<BR> 00408a9b: movsx edx,bx<BR> 00408a9e: mov
ecx,cf4b9b4f<BR> 00408aa3: call
00408ac4<BR> ......<BR> 00408ac4: pop
ebx<BR> 00408ac5: jmp
00408ade<BR> ......<BR> 00408ade: mov
cx,di<BR> 00408ae1: add ebx,9fdbd22d<BR> 00408ae7:
jmp 00408b08<BR> ......<BR> 00408b08: add
ecx,80c1fbc1<BR> 00408b0e: mov ebp,7fcdeff3
;循環解密記數器初值<BR> 00408b13: sub cl,39<BR> 00408b16:
movsx esi,si<BR> 00408b19: add dword ptr[ebx+60242dbf],9ef42073
;解密語句,9ef42073是密鑰<BR> 00408b23: mov
edx,6fd1d4cf<BR> 00408b28: mov di,dx<BR> 00408b2b:
inc ebp<BR> 00408b2c: xor dl,a3<BR> 00408b2f: mov
cx,si<BR> 00408b32: sub ebx,00000004 ;移動解密偏移指針,逆向解密
<BR> 00408b38: mov ecx,86425df9<BR> 00408b3d: cmp
ebp,7fcdf599 ;判斷解密結束與否<BR> 00408b43: jnz
00408b16<BR> 00408b49: jmp
00408b62<BR> ......<BR> 00408b62: mov
di,bp<BR> 00408b65: jmp 00407400
;將控制權交給解密后的病毒體入口<BR> 著名多形病毒Hps的變形解密子:<BR><BR> 005365b8:
;解密指針初始值和病毒體入口<BR> 加密的病毒主體
<BR> ......<BR> 005379cd: call
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -