版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Win32平臺下的PE文件病毒的研究及實現(xiàn)摘要在計算機病毒技術與反病毒技術激烈斗爭的今天,病毒技術的復雜多變,發(fā)展迅速給計算機用戶同時也給反病毒技術帶了巨大的挑戰(zhàn)。本文詳細剖析了時下較流行的Windows 32位操作系統(tǒng)平臺下最為常見的PE病毒機制,配合以代碼實現(xiàn)的方式,從一個病毒編寫者的角度展示病毒基本原理,并以此為契機從而做到更好的防范病毒。第一部分分別介紹了Windows病毒的基本原理、分類,并著重介紹PE病毒基本原理,基本機制;第二部分則根據(jù)PE病毒原理用編寫實際代碼的方式實現(xiàn)一個感染正常EXE文件(如WinRAR.exe)、關機并通過U盤傳播等功能的病毒程序;第三部分則通過功能測試(
2、白盒測試)、殺毒軟件測試,總結并展望病毒技術;最后通過此次課題的研究成果,結合當今主流反病毒技術,總結Windows PE病毒防范技術。關鍵字:Windows病毒;PE病毒;反病毒技術;PE文件格式;PE病毒實現(xiàn)The Research and Implementation of PE Documentary Virus based on Win32 PlatformAbstractNowadays, computer virus technology is growing rapidly as fast as development speed of anti-virus technolog
3、y. Computer virus technology is becoming complex and changing rapidly. It brings enormous challenges to anti-virus technology. This paper analyzes the most common PE virus mechanism base on Win32 platform that is explained by the way of code realization. The article also demonstrates the basic mecha
4、nism of virus from the perspective of the virus creator and gives the suggestion to achieve a better anti-virus result. At the beginning, the article introduces the basic knowledge of Windows virus and classification. This part highlights the basic tenets of PE virus and basic mechanism. The second
5、part compiles the code realization according to the principles. It can infect an EXE program (e.g. WinRAR.exe) and spread by u disk. The third part shows the result of passing the test (white box testing) and makes the summary and forecast. The last part summarizes the Windows PE anti-virus technolo
6、gy through the research on this topic with mainstream anti-virus technology.Key Words: Windows virus; PE virus; anti-virus technology; PE format; implementation of PE virus program目錄 論文總頁數(shù)32頁1引言12計算機病毒概述12.1計算機病毒的定義12.2計算機病毒的基本性質與本質23 Windows病毒43.1Windows病毒分類43.1.1PE病毒43.1.2腳本病毒43.1.3宏病毒43.2 PE病毒原理4
7、3.2.1 PE文件格式43.2.2檢驗PE文件的有效性73.2.3病毒重定位83.2.4獲取API函數(shù)地址93.2.5文件操作124 Windows PE文件病毒的研究及實現(xiàn)144.1病毒程序實現(xiàn)144.1.1病毒程序編寫背景144.1.2病毒程序基本功能介紹154.1.3病毒程序編寫環(huán)境154.1.4病毒程序簡要流程框圖154.1.5病毒程序主模塊-JERRY.ASM164.1.6病毒程序搜索API函數(shù)模塊-SearchAPI.ASM164.1.7病毒程序感染EXE文件模塊-Modify_PE.ASM174.1.8病毒程序感染及U盤傳播模塊-EffectU.ASM204.1.9病毒程序發(fā)作
8、模塊-Burst.ASM214.2病毒程序測試224.2.1病毒程序測試環(huán)境224.2.2病毒程序測試過程234.2.2病毒程序測試結果244.3病毒程序總結分析284.3.1病毒傳播能力分析284.3.2病毒潛伏能力分析284.3.3病毒破壞能力分析284.3.4病毒程序自我總結284.3.5病毒程序完善方向29結 論29參考文獻29致 謝30聲 明311引言隨著計算機和互聯(lián)網(wǎng)技術的快速發(fā)展,計算機正走進社會的各個領域,走進千家萬戶,計算機系統(tǒng)已經能夠實現(xiàn)生活、管理、辦公的自動化,成為人類社會不可或缺的一部分。然而,計算機系統(tǒng)并不安全,其不安的因素有計算機系統(tǒng)自身的、自然不可抗拒的,也有人為
9、的。計算機病毒就是最不安全因素之一。計算機病毒是計算機技術和以計算機為核心的社會信息化進程發(fā)展到一定階段的必然產物,是計算機犯罪的一種的新的衍化形式。自從第一例計算機病毒出現(xiàn)以來,隨著計算機技術、網(wǎng)絡技術的迅猛發(fā)展,計算機病毒也日益猖獗,成為了計算機網(wǎng)絡安全、信息安全最大公害。各種計算機病毒的產生和蔓延,已經給計算機系統(tǒng)安全造成了巨大的威脅和損害,其造成的計算機資源的損失和破壞,不但會造成資源和財富的巨大浪費,而且有可能造成社會性的災難,正因為如此,我們就應堅決地走到反病毒的行列中來。我們研究病毒,最終目的是為了消滅病毒。大多數(shù)計算機用戶對病毒不了解才會造成病毒的橫行,對于精通病毒原理的人來說
10、,病毒是毫無攻擊力的。我們要做到徹底地消滅病毒,那么就不能全依靠少數(shù)編寫殺毒軟件的人,而是要做到了解病毒基本原理,了解病毒只是為了認識病毒,消除對病毒的恐懼心理,最終達到能夠防毒、清除病毒的目的。所以對于病毒基本原理的學習,對計算機病毒編寫的學習是非常有意義的。Windows PE病毒是所有病毒中數(shù)量極多、破壞性極大的、技巧性最強的一類病毒。譬如CIH、FunLove、中國黑客等。本文就以此類病毒為突破口,從基本原理到病毒代碼的編寫測試,完成一個基本的Windows PE病毒模型,從而更加了解PE病毒,更好的防治病毒。本文第一部分介紹計算機基本知識;第二部分著重介紹計算機病毒中的Windows
11、病毒,從內核級學習PE文件格式,PE病毒原理;第三部分結合第二部分的準備知識,分別介紹每個代碼模塊功能及實現(xiàn);第四部分則介紹了針對PE病毒的一些解決方案;最后一部分對計算機的防治做了展望。2計算機病毒概述2.1計算機病毒的定義計算機病毒(Computer Virus)是一種人為的制造的、能夠進行自我復制的、具有對計算機資源破壞作用的一組程序或指令的集合。這是計算機病毒的廣義定義。類似生物病毒,它能把自身附著在各種類型的文件上或寄生在存儲媒介中,能對付計算機系統(tǒng)和網(wǎng)絡進行各種破壞,同時有獨特的復制能力和傳染性,能夠自我復制主動傳染;另一方面,當文件被復制或在網(wǎng)絡中從一個用戶送到另一個用戶時被動傳
12、染,他們就隨同文件一起蔓延開來。在1994年2月18日公布的中華人民共和國計算機信息系統(tǒng)安全保護條例中,計算機病毒被定義為:“計算機病毒是指編制或者在計算機程序中插入的破壞計算機功能或者破壞數(shù)據(jù),影響計算機使用并且能夠字我復制的一組計算機指令或者程序代碼”。這一定義具有一定的法律性和權威性。是對計算機病毒的狹義定義。2.2計算機病毒的基本性質與本質計算機病毒種類繁多,特征各異,其中主要的有:自我復制能力;很強的感染性;一定的潛伏性;特定的觸發(fā)性;很大的破壞性。1計算機病毒的可執(zhí)行性(程序性)程序性是計算機病毒的基本特征,也是計算機病毒最基本的一種表現(xiàn)形式。程序性也就決定了計算機病毒的可防治性、
13、可清除性。計算機病毒程序與其他合法程序一樣,是一段可執(zhí)行的程序,但他不是一個完整的程序,而是寄生在其他可執(zhí)行程序上的一段程序,因此他享有一切可執(zhí)行程序所能得到的權力。計算機的控制權是關鍵問題。反病毒技術就是要提前取得計算機系統(tǒng)的控制權,識別出計算機病毒的代碼和行為,阻止起取得系統(tǒng)控制權,并及時將其清除。2計算機病毒的傳染性病毒一次源于生物學,傳染也相應成了計算機病毒最基本的特性。計算機病毒的傳染性是指病毒具有把自身復制到其他程序的能力。在生物界,病毒通過傳染從一個生物體擴散到另一個生物體。在適當?shù)臈l件下,他可得到大量的繁殖,并使被感染的生物體表現(xiàn)出病癥甚至死亡。同樣,計算機病毒也會通過各種渠道
14、通過已被感染的計算機擴散到未被感染的計算機,在某些情況下造成被感染的計算機工作失常甚至癱瘓。是否具有傳染性,是判斷一個程序是否為計算機病毒的首要條件。傳染性也決定了計算機病毒的可判斷性。3計算機病毒的非授權性計算機病毒未經授權而執(zhí)行。正常的程序是由用戶調用,再由系統(tǒng)分配資源,完成用戶交給的任務,其目的對用戶是可見的、透明的。而病毒隱藏在正常程序中,竊取正常程序的系統(tǒng)控制權,其目的對用戶是未知的,是未經用戶允許的。4計算機病毒的隱蔽性計算機病毒通常附在正常程序中或磁盤較隱蔽的地方,也有個別的以隱含文件的形式出現(xiàn),目的是不讓用戶發(fā)現(xiàn)他的存在。如果不經過代碼分析,病毒程序與正常程序是不容易區(qū)分開來的
15、,而一旦病毒發(fā)作表現(xiàn)出來,往往已經給計算機系統(tǒng)造成了不同程度破壞。正是由于隱蔽性,計算機病毒得以在用戶沒有察覺的情況下擴散并游離與世界上的百萬臺計算機中。計算機病毒的隱蔽性通常表現(xiàn)在以下兩個方面: 傳染的隱蔽性。大多數(shù)病毒的代碼設計得非常精巧而又短小,一般只有幾百字節(jié)到幾K,而PC對文件的存取速度非???,所以病毒會在轉瞬之間便可將這些病毒程序附著在正常文件之上,一般不具有外部表象,不易被人發(fā)現(xiàn)。 病毒程序存在的隱蔽性。病毒程序通常以隱蔽的方式存在,且被病毒感染的計算機在多數(shù)情況下仍能維持起部分功能,不回因為感染上病毒而使整臺計算機不能使用。計算機病毒設計的精巧之處也在這里。5計算機病毒的潛伏性
16、一個編制精巧的計算機病毒程序,進入系統(tǒng)之后一般不會馬上發(fā)作。潛伏性越好,其在系統(tǒng)中的存在時間就會越長,病毒的傳染范圍就會越大。潛伏性通常表現(xiàn)以下兩個方面: 病毒程序不用專門的檢測程序是檢查不出來的,一旦得到運行機會就繁殖、擴散,繼續(xù)為害。 計算機病毒中往往有一種觸發(fā)機制,不滿足觸發(fā)條件時,計算機病毒除了傳染外不做其他的破壞,只有當觸發(fā)條件滿足時,才會激活病毒的發(fā)作模塊而出現(xiàn)中毒的癥狀。6計算機病毒的可觸發(fā)性計算機病毒因某個事件或數(shù)值的出現(xiàn),誘使病毒實施感染或進行攻擊的特性,稱為可觸發(fā)性。為了隱蔽自己,病毒必須潛伏,少做動作。如果完全不做動作,病毒既不能感染也不能進行破壞,失去殺傷力。病毒既要隱
17、蔽又要維持殺傷力,就必須具有可觸發(fā)性。病毒的觸發(fā)機制是用來控制感染和破壞動作的頻率的。病毒的觸發(fā)機制越多,則傳染性越強。7計算機病毒的破壞性所有的計算機病毒都是一種可執(zhí)行的程序,而這一可執(zhí)行程序又必然要運行,因此,所有的計算機病毒都對計算機系統(tǒng)造成不同程度的影響,輕這降低計算機系統(tǒng)工作效率、占用系統(tǒng)資源,重者導致數(shù)據(jù)丟失、系統(tǒng)崩潰。計算機病毒的破壞性,決定了病毒的危害性。8計算機病毒的寄生性病毒程序嵌入到宿主程序中,依賴與宿主程序的執(zhí)行而生存,這就是計算機病毒的寄生性。病毒程序在侵入到宿主程序中后,一般對宿主程序進行一定的修改,宿主程序一旦執(zhí)行,病毒程序就被激活,從而可以進行自我復制和繁衍。9
18、、計算機病毒的誘惑欺騙性某些病毒常以某種特殊的表現(xiàn)方式,引誘、欺騙用戶不自覺的觸發(fā)、激活病毒,從而實施起感染、破壞功能。如情書變種病毒之一VBS.LoveLetter.F,傳播自身的電子郵件附件名為“Virus Warning.jpg.vbs”,主題為“Dangerous virus warning”,其內容是“There is a dangerous virus circulating.Please click attached picture to view it and learn to avoid it”。3 Windows病毒3.1Windows病毒分類3.1.1PE病毒W(wǎng)in32可
19、執(zhí)行文件,如*.exe、*.dll、*.ocx等,都是PE格式文件。感染PE格式文件的Win32病毒,簡稱PE病毒。在絕大多數(shù)病毒愛好者中,真正的病毒技術在PE病毒中才會得到真正的體現(xiàn)。PE病毒同時也是所有病毒中數(shù)量極多、破壞性極大、技巧性最強的一類病毒。3.1.2腳本病毒腳本(Script)病毒是以腳本程序語言(如VB Script、JavaScript、PHP)編寫而成的病毒。腳本病毒編寫比較簡單,并且編寫的病毒具有傳播快、破壞力大等特點。例如,愛蟲病毒、新歡樂時光病毒等。就都是用VBS(VB Script)編寫的,被稱做VBS腳本病毒。但腳本病毒必須透過Microsoft的WSH(Win
20、dows Scripting Host)才能夠啟動執(zhí)行以及感染其他文件。3.1.3宏病毒宏病毒是單獨的一類病毒,因為它與傳統(tǒng)的病毒有很大的不同,他不感染.EXE、.COM等可執(zhí)行文件,而是將病毒代碼以“宏”的形式潛伏在Microsoft Office文檔中,當采用Office軟件打開這些染毒文件時,這些代碼就會被執(zhí)行并產生破壞作用。由于“宏”是使用VBA(Visual Basic For Application)這樣的高級代碼寫的,因此其編寫過程相對來說比較簡單,而功能又十分強大。宏病毒的產生標志著制造病毒不再是專業(yè)程序員的專利,任何人只要掌握一些基本的“宏”編寫技巧即可編寫出破壞力極大的宏病
21、毒。隨著微軟Office軟件在全世界的不斷普及,宏病毒成為傳播最廣泛、危害最大的一類病毒。3.2 PE病毒原理3.2.1 PE文件格式目前主流的操作系統(tǒng)是Windows操作系統(tǒng),病毒要在Windows操作系統(tǒng)上進行傳播和破壞,其病毒文件也必須遵循PE文件的格式結構,。目前流行的計算機病毒以蠕蟲、木馬等類型病毒為住,這一類的病毒文件也大都是PE格式的文件,因此,我們在這一節(jié)會詳細介紹PE格式文件,這是分析病毒程序的基礎。什么是PE文件格式PE即Portable Executable,可移植、可執(zhí)行,他是Win32可執(zhí)行文件的標準格式。他的一些特性繼承自UNIX的Coff(Commo
22、n object file format)文件格式。Portable Executable就意味著此文件是跨Win32平臺的,即使Windows運行在非Intel的CPU上,任何Win32平臺的PE裝載器都能識別和使用該文件格式。因而,研究學習PE文件格式,除了有助于了解病毒的傳染原理之外,還給我們提供了洞悉Windows結構的良機。PE文件格式詳細剖析PE文件的構成如下:表1 PE文件格式PE文件結構的總體層次分布DOS MZ HeaderDOS StubPE HeaderSection TableSection 1Section 2Section n1DOS小程序PE文件以一
23、個簡單的DOS MZ header開始。有了它,一旦程序在DOS下執(zhí)行時,就能被DOS識別出這是否是有效的執(zhí)行體,然后緊隨MZ Header之后的是DOS Stub(DOS 插樁程序)實際上就是一個在DOS環(huán)境下簡單調用21h中斷顯示“This program can not be run in DOS mode”或者“This program must be run under Win32”之類信息的小程序。2NT映像頭緊接著DOS Stub的是PE Header。PE Header是PE相關結構IMAGE_NI_HEADERS(NT映像頭)的簡稱,他存放了PE整個文件信息分布的重要字段。N
24、T映像頭包含了許多PE裝載器用到的重要域。NT映像頭的結構定義如下:IMAGE_NT_HEADER STRUCTSignature dd ?FileHeader IMAGE_FILE_HEADER <>OptionalHeader IMAGE_OPTIONAL_HEADER32 <>IMAGE_NT_HEADER ENDS而這三部分分別有著各自的數(shù)據(jù)結構(參見Windows.inc文件)。 Signature dd ?字串“50450000”標志著NT映像頭的開始,也是PE文件中與Windows有關內容的開始。他的位置是在DOS程序頭中的偏移3CH處的4個字節(jié)給出的。
25、FileHeader IMAGE_FILE_HEADER STRUCT00H Machine 機器類型02H NumberOfSection 文件中節(jié)的個數(shù)04H TimeDataStamp 生成該文件的時間08HPointerToSymbolTable COFF符號表的偏移0CH NumberOfSymbols 符號數(shù)目10H SizeOfOptionalHeader 可選頭的大小12H Characteristics 標記(exe或dll)IMAGE_FILE_HEADER ENDS其中第2項 NumberOfSection 和第6項SizeOfOptionalHeader對于學習病毒是需
26、要重點關注的。 OptionalHeader 由于OptionalHeader數(shù)據(jù)定義較多,現(xiàn)只列出與學習病毒較重要的一些域。IMAGE_OPTIONAL_HEADER32 STRUCT04H SizeOfCode 代碼段的總尺寸10H AddressOfEntryPoint 程序開始執(zhí)行位置14H BaseOfCode 代碼節(jié)開始的位置1CH ImageBase 可執(zhí)行文件的默認裝入的內存地址20H SectionAlignment 可執(zhí)行文件裝入內存時節(jié)的對齊數(shù)字24H FileAlignment 文件中節(jié)的對齊數(shù)字,一般是一個扇區(qū)38H SizeOfImage 裝入內存后映像的總尺寸3C
27、HSizeOfHeaders NT映像頭+節(jié)表的大小40HCheckSum 校驗和44HSubsystem 可執(zhí)行文件的子系統(tǒng)5CH NumberRvaAndSize 數(shù)據(jù)目錄的項數(shù),一般是1660HDataDirectory 數(shù)據(jù)目錄IMAGE_OPTIONAL_HEADER32 ENDS3節(jié)表緊接著NT映像頭之后的是節(jié)表。節(jié)表實際上是一個結構數(shù)組,其中每個結構包含了該節(jié)的具體信息(每個結構占用28H)。該成員的數(shù)目由映像文件頭(IMAGE_FILE_HEADER)結構中NumberOfSection域決定的。節(jié)表的結構定義如下:IMAGE_SECTION_HEADER STRUCT00HN
28、ame 節(jié)名08HPhyscicalAddress OBJ文件用做表示本節(jié)的物理地址VirtualSize EXE文件中表示節(jié)的實際字節(jié)數(shù)0CHVirtualAddress 本節(jié)的相對虛擬地址10HSizeOfRawData 本節(jié)的經過文件對齊后的尺寸14HPointerToRawData 本節(jié)原始數(shù)據(jù)在文件中的位置18HPointerToRelocation OBJ中表示該節(jié)重定位信息的偏移1CHPointerToLinenumbers 行號偏移20HNumberOfRelocations 本節(jié)要重定位的數(shù)目22HNumberOfLinenumbers 本節(jié)在行號中的行號數(shù)目24HChara
29、cteristics 節(jié)屬性IMAGE_SECTION_HEADER ENDS其中第2項 VirtualSize 、第3項VirtualAddress、第4項SizeOfRawData、第5項PointerToRawData、第10項Characteristics需要重點關注的。3.2.2檢驗PE文件的有效性檢驗PE文件的有效性對于有效地感染文件起著非常大的作用,因為只有在清楚了需要被感染的病毒文件是有效的PE文件時,才可以感染并且達到效果。如何才能校驗指定文件是否為一有效PE文件呢? 這個問題很難回答,完全取決于想要的精準程度。可以檢驗PE文件格式里的各個數(shù)據(jù)結構,或者僅校驗一些關鍵數(shù)據(jù)結構
30、。大多數(shù)情況下,沒有必要校驗文件里的每一個數(shù)據(jù)結構,只要一些關鍵數(shù)據(jù)結構有效,我們就認為是有效的PE文件了。1校驗程序流程 首先檢驗文件頭部第一個字的值是否等于 IMAGE_DOS_SIGNATURE (5A4Dh,即MZ),是則 DOS MZ Header 有效。 一旦證明文件的 DOS MZ Header 有效后,就可用e_lfanew(3CH處來)來定位 PE Header 了。 比較 PE header 的第一個字的值是否等于 IMAGE_NT_HEADER (4550h,即PE)。如果前后兩個值都匹配,那我們就認為該文件是一個有效的PE文件。2校驗程序核心部分代碼的實現(xiàn)如下: edi
31、已經指向IMAGE_DOS_HEADER結構。然后比較DOS MZ Header的首字是否等于字符串"MZ",這里利用了Windows.inc中定義的IMAGE_DOS_SIGNATURE常量。若比較成功,則轉到判斷PE Header,否則設ValidPE 值為FALSE,意味著文件不是有效PE文件。mov edi, pMapping assume edi:ptr IMAGE_DOS_HEADER .if edi.e_magic=IMAGE_DOS_SIGNATURE 。 已定位到PE header,需要讀取DOS MZ Header中的e_lfanew域值。該域含有PE
32、Header在文件中相對文件首部的偏移量。edi加上該值正好定位到PE Header的首字節(jié)。比較它是否是字符串"PE"。這里在此用到了常量IMAGE_NT_SIGNATURE,相等則認為是有效的PE文件。add edi, edi.e_lfanew assume edi:ptr IMAGE_NT_HEADERS .if edi.Signature=IMAGE_NT_SIGNATURE mov ValidPE, TRUE .else mov ValidPE, FALSE .endif3.2.3病毒重定位為什么要重定位病毒首先第一步就需要重定位,那到底為什么要重定
33、位呢?我們在寫正常程序的時候根本不用去關心變量(常量)的位置,因為源程序在編譯的時候它的內存中的位置都被計算好了。程序裝入內存時,系統(tǒng)不會為它重定位。編程時我們需要用到變量(常量)的時候直接用變量名訪問(編譯后就是通過偏移地址訪問)就行了。同時,病毒不可避免也要用到變量(常量),當病毒感染HOST程序后,由于其依附到HOST程序中的位置各有不同,病毒隨著HOST載入內存后,病毒中的各個變量(常量)在內存中的位置自然也會隨著發(fā)生變化。假如病毒在編譯后,其中一變量Var的地址(004010xxh)就已經以二進制代碼的形式固定了,當病毒感染HOST程序以后(即病毒相關代碼已經直接依附到HOST程序中
34、),由于病毒體對變量Var的引用還是對內存地址004010xxh的引用(病毒的這段二進制代碼并不會發(fā)生改變),而在HOST上的004010xxh的位置實際上已經不再存放變量Var了,如果這個時候再用004010xxh的位置來調用Var那么肯定是無法成功的。這樣就造成了病毒對變量的引用不準確,勢必導致病毒無法正常運行。既然如此,病毒就非常有必要對所有病毒代碼中的變量進行重新定位。如何重定位既然重定位是基本且非常重要的東西,那么重定位的具體方法就顯得尤其重要了。本設計采用的是現(xiàn)在最普遍也是最有效的方法。我們先學習下call指令。call指令一般用來調用一個子程序或用來進行轉跳,當這個
35、語句執(zhí)行的時候,它會先將返回地址(即緊接著call語句之后的那條語句在內存中的真正地址)壓入堆棧,然后將IP置為call語句所指向的地址。當子程序碰到ret命令后,就會將堆棧頂端的地址彈出來,并將該地址存放在IP中。根據(jù)以上的描述,我們就可以采取一種調用call命令的方式來獲得當前的重定位值。重定位核心代碼實現(xiàn)如下:call relocaterelocate: pop ebp.lea eax,ebp+(offset Var-offset relocate) 這條語句執(zhí)行之后,堆棧頂端為relocate在內存中的真正地址。 這條語句將relocate在內存中的真正地址存放在ebp寄存器中。 這時
36、eax中存放著Var在內存中的真實地址。當pop語句執(zhí)行完之后,ebp中放的是什么值呢?很明顯是病毒程序中標號relocate在內存中的真正地址。如果病毒程序中有一個變量Var,那么該變量實際在內存中的地址應該是ebp+(offset Var-offset relocate),即參考量relocate在內存中的地址+其它變量與參考量之間的距離=其它變量在內存中的真正地址。有時候我們也采用(ebp-offset relocate)+offset Var的形式進行變量Var的重定位。還有一些其它重定位的方法,但是它們的基本原理都是一樣的。3.2.4獲取API函數(shù)地址為什么要獲取API
37、函數(shù)地址Win32 PE病毒和普通Win32 PE程序一樣需要調用API函數(shù),但是普通的Win32 PE程序里面有一個引入函數(shù)表,該函數(shù)表對應了代碼段中所用到的API函數(shù)在動態(tài)連接庫 (如Kernel32.dll,User32.dll)中的真實地址。這樣,調用API函數(shù)時就可以通過該引入函數(shù)表找到相應API函數(shù)的真正執(zhí)行地址。但是,對于Win32 PE病毒來說,他一般只有一個代碼段,他并不存在引入函數(shù)段。既然如此,病毒就無法像普通PE程序那樣直接調用相關API函數(shù),而應該先找出這些API函數(shù)在相應動態(tài)鏈接庫中的地址。如何獲取API函數(shù)地址1獲得Kernel32基地址如何獲取API
38、函數(shù)地址一直是病毒技術的一個非常重要的話題。要獲得API函數(shù)地址,我們首先需要獲得Kernel32.dll的基地址。為什么我們需要先獲得它呢?因為一旦我們獲得了Kernel32.dll的基地址,那么獲得從Kernel32引出的函數(shù)就成為了可能,即使用戶用到了其他的API(如從User32.dll中引出的)函數(shù)。則可以使用從Kernel32中得到的LoadLibrary函數(shù)和GetProcAddress函數(shù)相結合得到其他API函數(shù)的地址。下面介紹一種獲得Kernel32基地址的方法:利用HOST程序的返回地址,在其附近搜索Kernel32模塊基地址。當系統(tǒng)打開一個可執(zhí)行文件的時候,它會調用Ker
39、nel32.dll中的CreateProcess函數(shù);CreateProcess函數(shù)在完成裝載應用程序后,會先將一個返回地址壓入到堆棧頂端,然后轉向執(zhí)行剛才裝載的應用程序。當該應用程序結束后,會將堆棧頂端數(shù)據(jù)彈出放到IP中,繼續(xù)執(zhí)行。剛才堆棧頂端保存的數(shù)據(jù)其實就是在Kernal32.dll中的返回地址。其實這個過程跟同我們的應用程序用call指令調用子程序類似??梢钥闯?,這個返回地址是在Kernal32.dll模塊中。另外PE文件被裝入內存時是按內存頁對齊的,只要我們從返回地址按照頁對齊的邊界一頁一頁地往低地址搜索,就必然可以找到Kernel32.dll的文件頭地址,即Kernel32模塊的基
40、地址。搜索Kernel32基地址的核心代碼實現(xiàn)如下:mov ecx,esp xor edx,edxgetK32Base:dec ecx .mov dx,word ptr ecx+IMAGE_DOS_HEADER.e_lfanewtest dx,0f000h jnz getK32Basecmp ecx,dword ptr ecx+edx+IMAGE_NT_HEADERS.OptionalHeader.ImageBasejnz getK32Base. mov ebp+offset k32Base,ecx. 將堆棧頂端的數(shù)據(jù)賦給ecx。 逐字節(jié)比較驗證,也可以一頁一頁地搜。 就是ecx+3ch(比較
41、方式類似判斷PE文件的有效性第一步思想一致)。 Dos Header+stub值不會太大,不可能超過4096byte。 看Image_Base值是否等于ecx即模塊起始值。 如果是,就認為找到kernel32的Base值。2利用Kerner32基地址來獲取API函數(shù)地址在參照了引出表結構之后,那么獲得API函數(shù)地址的方法就不理解了。 引出表的結構定義如下:00HCharacteristics04HTimeDateStamp文件生成時間08HMajorVesion主版本號0AHMinerVesion次版本號0CHName指向DLL的名字10HBase開始的序號14HNumberOfFunctio
42、nAddressOfFunctions的項數(shù)18HNumberOfNamesAddressOfNames的項數(shù)1CHAddressOfFunctions指向函數(shù)地址的數(shù)組20HAddressOfNames指向函數(shù)名稱的地址的數(shù)組24HAddressOfNameOrdinals指向輸入序列號的數(shù)組只要理解好最后5項的具體含義,那么搜索API地址的方法就顯而易見了。AddressOfFunctions指向一個數(shù)組,這個數(shù)組的每個成員就指向了一個API函數(shù)的地址,也就是說我們只要從這個數(shù)組里獲得了一個API函數(shù)的地址,那么我們就可以使用相應的API函數(shù)了,但里面的API函數(shù)地址是按數(shù)組存放的,那么我
43、們要使用一個指定的API函數(shù),就必須知道該API函數(shù)在數(shù)組中的具體的位置,也就是一個索引號。上面說的這個索引號則需要表中的最后2項來獲得,AddressOfNames 與AddressOfNameOrdinals指向2個數(shù)組,一個是函數(shù)名字的數(shù)組,一個是函數(shù)名稱的數(shù)組,一個是函數(shù)名字所對應的索引號的數(shù)組,這2個數(shù)組是一一對應的,也就是說,如果第一個數(shù)組中的第M項是我們要查找的函數(shù)的名字,那么第二個數(shù)組中的第M項就是該函數(shù)的索引號。這樣我們就可以通過在第一個數(shù)組中查找我們需要查找的函數(shù)的名字,如果查到,便記住該項目在數(shù)組中的位置,然后再到第二個數(shù)組中相同位置就可以獲得該函數(shù)在AddressOfF
44、unctions中的索引號了。解決以上問題后,我們就知道了如何利用引出表的結構來查找我們需要的函數(shù)地址了。但我們還得需要獲得引出表的結構的地址,其實方法也比較簡單,PE文件中可選映像頭中60H有一個數(shù)據(jù)目錄表DataDirectory,該目錄表的第一個數(shù)據(jù)目錄就存放了導出表結構的地址。 已知API函數(shù)名稱利用Kernel32 Base來獲取函數(shù)地址的方法定位到PE文件頭。從PE文件頭中的可選文件頭中取出數(shù)據(jù)目錄表的第一個數(shù)據(jù)目錄,得到導出表的地址。從導出表的NumberOfNames字段得到以命名函數(shù)的總數(shù),并以這個數(shù)字做微循環(huán)的次數(shù)來構造一個循環(huán)。從AddressOfNames字段指向的函數(shù)
45、名稱地址表的第一項開始,在循環(huán)中將每一項定義的函數(shù)名與要查找的函數(shù)名比較,如果沒有任何一個函數(shù)名符合,說明文件中沒有指定名稱的函數(shù)。如果某一項定義的函數(shù)名與要查找的函數(shù)名符合,那么記住這個函數(shù)名在字符串地址表中的索引值(如x),然后在AddressOfNameOrdinals指向的數(shù)組中以同樣的索引值x去找數(shù)組項中的值,假如該值為m。以m值作為索引值,在AddressOfFunctions字段指向的函數(shù)入口地址表中獲取的RVA就是函數(shù)的入口地址,當函數(shù)被裝入內存后,這個RVA值加上模塊實際裝入的基址(ImageBase),就得到了函數(shù)真正的入口地址。對于病毒來說,通常是通過API函數(shù)名稱來查找
46、API函數(shù)地址。3.2.5文件操作關于文件搜索1文件搜索函數(shù)搜索文件是病毒尋找目標文件的非常重要的功能。在Win32匯編中,通常采用三個API函數(shù)進行文件搜索。 FindFirstFile 該函數(shù)根據(jù)文件名查找文件。 FindNextFile 該函數(shù)根據(jù)調用FindFirstFile函數(shù)時指定的一個文件名查找下一個文件。 FindClose 該函數(shù)用來關閉由FindFirstFile函數(shù)創(chuàng)建的一個搜索句柄。2文件搜索算法文件搜索一般采用遞歸算法進行搜索,也可以采用非遞歸搜索方法,這里我們僅介紹遞歸的算法FindFile Proc 指定找到的目錄為當前工作目錄。 開始搜索文件(*.
47、*)。 該目錄搜索完畢?是則返回,否則繼續(xù)。 找到文件還是目錄?是目錄則調用自身函數(shù)FindFile,否則繼續(xù)。 是文件,如符合感染條件,則調用感染模塊,否則繼續(xù)。 搜索下一個文件(FindNextFile),轉到繼續(xù)。FindFile Endp內存映射文件內存映射文件提供了一組獨立的函數(shù),是應用程序能夠通過內存指針像訪問內存一樣對磁盤上的文件進行訪問。這組內存映射文件函數(shù)將磁盤上的文件的全部或者部分映射到進程虛擬地址空間的某個位置,以后對文件內容的訪問就如同在該地址區(qū)域內直接對內存訪問一樣簡單。這樣,對文件中數(shù)據(jù)的操作便是直接對內存進行操作,大大地提高了訪問的速度,這對于計算機
48、病毒來說,對減少資源占有是非常重要的。1內存映射文件函數(shù) CreateFileMapping該函數(shù)用來創(chuàng)建一個新的文件映射對象。 MapViewOfFile 該函數(shù)將一個文件映射對象映射到當前應用程序的地址空間。 UnMapViewOfFile 該函數(shù)在當前應用程序的內存地址空間解除對一個文件映射對象的映射。 CloseHandle 該函數(shù)用來關閉一個內核對象,其中包括文件、文件映射、進程、線程、安全和同步對象等。2內存映射文件方法在計算機病毒中,通常采用如下幾個步驟: 調用CreateFile函數(shù)打開想要映射的HOST程序,返回文件句柄hFile。 調用CreateFileMapping函數(shù)
49、生成一個建立基于HOST文件句柄hFile的內存映射對象,返回內存映射對象句柄hMap。 調用MapViewOfFile函數(shù)將整個文件(一般還要加上病毒體的大小)映射到內存中。得到指向映射到內存的第一個字節(jié)的指針(pMem)。 用剛才得到的指針pMem對整個HOST文件進行操作,對HOST程序進行病毒感染。 調用UnmapViewFile函數(shù)解除文件映射,傳入?yún)?shù)是pMem。 調用CloseHandle來關閉內存映射文件,傳入?yún)?shù)是hMap。 調用CloseHandle來關閉HOST文件,傳入?yún)?shù)是hFile。感染PE文件1文件感染操作相關函數(shù) CreateFile 該函數(shù)可打開
50、和創(chuàng)建文件、管道、郵槽、通信服務、設備以及控制臺。 CloseHandle 該函數(shù)用來關閉一個內核對象,其中包括文件、文件映射、進。 SetFilePointer 該函數(shù)在一個文件中設置當前的讀寫位置。 ReadFile 該函數(shù)用來從文件中讀取數(shù)據(jù)。 WriteFile 該函數(shù)用來將數(shù)據(jù)寫入文件。 SetEndOfFile 該函數(shù)針對一個打開的文件,將當前文件位置設為文件末尾。 GetFileSize 該函數(shù)得到指定文件的大小。 FlushFileBuffers 該函數(shù)針對指定的文件句柄,刷新內部文件緩沖區(qū)。2文件感染的基本步驟(添加病毒新節(jié)的方式) 判斷目標文件開始的兩個字節(jié)是否為“MZ”。
51、 判斷PE文件標記“PE”。 判斷感染標記,如果已被感染過則跳出繼續(xù)執(zhí)行HOST程序,否則繼續(xù)。 獲得Directory(數(shù)據(jù)目錄)的個數(shù),(每個數(shù)據(jù)目錄信息占8個字節(jié))。 得到節(jié)表起始位置。(Directory的偏移地址+數(shù)據(jù)目錄占用的字節(jié)數(shù)=節(jié)表起始位置)。得到目前最后節(jié)表的末尾偏移(緊接其后用于寫入一個新的病毒節(jié))節(jié)表起始位置+節(jié)的個數(shù)*(每個節(jié)表占用的字節(jié)數(shù)28H)=目前最后節(jié)表的末尾偏移。 開始寫入節(jié)表。a) 寫入節(jié)名(8字節(jié))。b) 寫入節(jié)的實際字節(jié)數(shù)(4字節(jié))。c) 寫入新節(jié)在內存中的開始偏移地址(4字節(jié)),同時可以計算出病毒入口位置上節(jié)在內存中的開始偏移地址+(上節(jié)大小/節(jié)對齊
52、+1)×節(jié)對齊=本節(jié)在內存中的開始偏移地址。d) 寫入本節(jié)(即病毒節(jié))在文件中對齊后的大小。e) 寫入本節(jié)在文件中的開始位置。上節(jié)在文件中的開始位置+上節(jié)對齊后的大小=本節(jié)(即病毒)在文件中的開始位置。f) 修改映像文件頭中的節(jié)表數(shù)目。g) 修改AddressOfEntryPoint(即程序入口點指向病毒入口位置),同時保存舊的AddressOfEntryPoint,以便返回HOST繼續(xù)執(zhí)行。h) 更新SizeOfImage(內存中整個PE映像尺寸=原SizeOfImage+病毒節(jié)經過內存節(jié)對齊后的大小)。i) 寫入感染標記(后面例子中是放在PE頭中)。j) 寫入病毒代碼到新添加的節(jié)
53、中。k) 將當前文件位置設為文件末尾。PE病毒感染其他文件的方法還有很多,譬如PE病毒還可以將自己分散插入到每個節(jié)的空隙中,他的好處就是病毒不增長,但難度較大。3文件感染需要注意的細節(jié)為了提高自己的生存能力,病毒是不應該破壞HOST程序的,既然如此,病毒應該在病毒執(zhí)行完畢后,立刻將控制權交給HOST程序。返回HOST程序相對來說比較簡單,病毒在修改被感染文件代碼開始執(zhí)行位置(AddressOfEntryPoint)時,應該保存原來的值,這樣,病毒在執(zhí)行完病毒代碼之后用一個跳轉語句跳到這段代碼處繼續(xù)執(zhí)行即可。注意,在這里,病毒先會做出一個“現(xiàn)在執(zhí)行程序是否為病毒啟動程序”的判斷,如果不是啟動程序
54、,病毒才會返回HOST程序,否則繼續(xù)執(zhí)行程序其它部分。4 Windows PE文件病毒的研究及實現(xiàn)4.1病毒程序實現(xiàn)4.1.1病毒程序編寫背景21世紀是信息的時代,信息成為一種重要的戰(zhàn)略資源,信息科學成為最活躍學科領域之一,信息技術改變著人們的生活和工作方式,信息產業(yè)成為新的經濟增長點。信息的安全保障能力成為一個國家綜合國力的重要組成部分。隨著計算機和互聯(lián)網(wǎng)技術的快速發(fā)展和廣泛應用,計算機網(wǎng)絡系統(tǒng)的安全受到嚴重的挑戰(zhàn),來自計算機病毒和黑客的攻擊及其其他方面的威脅越來越大。其中,計算機病毒更是計算機安全中很難根治的主要威脅之一。通過對計算機病毒的認識,研究以達到更加深刻地了解病毒,只有了解計算機病毒的原理,掌握計算機病毒的防治技術
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深井泵房施工組織設計
- 歷年英語四級真題及答案
- 2025年華師大新版七年級歷史下冊月考試卷
- 2025年外研版九年級歷史上冊月考試卷含答案
- 2025年浙教版九年級歷史下冊階段測試試卷
- 2025年華師大版選擇性必修3歷史下冊階段測試試卷
- 2025年度農機環(huán)保技術合作開發(fā)合同范本4篇
- 房屋建筑設計合同(2篇)
- 擔保合同補充協(xié)議書(2篇)
- 2025年度綠色建筑項目除草與節(jié)能合同3篇
- 數(shù)學-山東省2025年1月濟南市高三期末學習質量檢測濟南期末試題和答案
- 中儲糧黑龍江分公司社招2025年學習資料
- 湖南省長沙市2024-2025學年高一數(shù)學上學期期末考試試卷
- 船舶行業(yè)維修保養(yǎng)合同
- 2024年林地使用權轉讓協(xié)議書
- 物流有限公司安全生產專項整治三年行動實施方案全國安全生產專項整治三年行動計劃
- 2025屆江蘇省13市高三最后一卷生物試卷含解析
- 產鉗助產護理查房
- 招聘專員轉正述職報告
- (完整版)小學生24點習題大全(含答案)
- 2022年五年級解方程小數(shù)和分數(shù)計算題
評論
0/150
提交評論