毕业设计(论文)-Win32平台下的PE文件病毒的研究及实现1.doc_第1页
毕业设计(论文)-Win32平台下的PE文件病毒的研究及实现1.doc_第2页
毕业设计(论文)-Win32平台下的PE文件病毒的研究及实现1.doc_第3页
毕业设计(论文)-Win32平台下的PE文件病毒的研究及实现1.doc_第4页
毕业设计(论文)-Win32平台下的PE文件病毒的研究及实现1.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Win32平台下的PE文件病毒的研究及实现摘要在计算机病毒技术与反病毒技术激烈斗争的今天,病毒技术的复杂多变,发展迅速给计算机用户同时也给反病毒技术带了巨大的挑战。本文详细剖析了时下较流行的Windows 32位操作系统平台下最为常见的PE病毒机制,配合以代码实现的方式,从一个病毒编写者的角度展示病毒基本原理,并以此为契机从而做到更好的防范病毒。第一部分分别介绍了Windows病毒的基本原理、分类,并着重介绍PE病毒基本原理,基本机制;第二部分则根据PE病毒原理用编写实际代码的方式实现一个感染正常EXE文件(如WinRAR.exe)、关机并通过U盘传播等功能的病毒程序;第三部分则通过功能测试(白盒测试)、杀毒软件测试,总结并展望病毒技术;最后通过此次课题的研究成果,结合当今主流反病毒技术,总结Windows PE病毒防范技术。关键字:Windows病毒;PE病毒;反病毒技术;PE文件格式;PE病毒实现目录 论文总页数32页1引言12计算机病毒概述12.1计算机病毒的定义12.2计算机病毒的基本性质与本质23 Windows病毒43.1Windows病毒分类43.1.1PE病毒43.1.2脚本病毒43.1.3宏病毒43.2 PE病毒原理43.2.1 PE文件格式43.2.2检验PE文件的有效性73.2.3病毒重定位83.2.4获取API函数地址93.2.5文件操作124 Windows PE文件病毒的研究及实现144.1病毒程序实现144.1.1病毒程序编写背景144.1.2病毒程序基本功能介绍154.1.3病毒程序编写环境154.1.4病毒程序简要流程框图154.1.5病毒程序主模块-JERRY.ASM164.1.6病毒程序搜索API函数模块-SearchAPI.ASM164.1.7病毒程序感染EXE文件模块-Modify_PE.ASM174.1.8病毒程序感染及U盘传播模块-EffectU.ASM204.1.9病毒程序发作模块-Burst.ASM214.2病毒程序测试224.2.1病毒程序测试环境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引言随着计算机和互联网技术的快速发展,计算机正走进社会的各个领域,走进千家万户,计算机系统已经能够实现生活、管理、办公的自动化,成为人类社会不可或缺的一部分。然而,计算机系统并不安全,其不安的因素有计算机系统自身的、自然不可抗拒的,也有人为的。计算机病毒就是最不安全因素之一。计算机病毒是计算机技术和以计算机为核心的社会信息化进程发展到一定阶段的必然产物,是计算机犯罪的一种的新的衍化形式。自从第一例计算机病毒出现以来,随着计算机技术、网络技术的迅猛发展,计算机病毒也日益猖獗,成为了计算机网络安全、信息安全最大公害。各种计算机病毒的产生和蔓延,已经给计算机系统安全造成了巨大的威胁和损害,其造成的计算机资源的损失和破坏,不但会造成资源和财富的巨大浪费,而且有可能造成社会性的灾难,正因为如此,我们就应坚决地走到反病毒的行列中来。我们研究病毒,最终目的是为了消灭病毒。大多数计算机用户对病毒不了解才会造成病毒的横行,对于精通病毒原理的人来说,病毒是毫无攻击力的。我们要做到彻底地消灭病毒,那么就不能全依靠少数编写杀毒软件的人,而是要做到了解病毒基本原理,了解病毒只是为了认识病毒,消除对病毒的恐惧心理,最终达到能够防毒、清除病毒的目的。所以对于病毒基本原理的学习,对计算机病毒编写的学习是非常有意义的。Windows PE病毒是所有病毒中数量极多、破坏性极大的、技巧性最强的一类病毒。譬如CIH、FunLove、中国黑客等。本文就以此类病毒为突破口,从基本原理到病毒代码的编写测试,完成一个基本的Windows PE病毒模型,从而更加了解PE病毒,更好的防治病毒。本文第一部分介绍计算机基本知识;第二部分着重介绍计算机病毒中的Windows病毒,从内核级学习PE文件格式,PE病毒原理;第三部分结合第二部分的准备知识,分别介绍每个代码模块功能及实现;第四部分则介绍了针对PE病毒的一些解决方案;最后一部分对计算机的防治做了展望。2计算机病毒概述2.1计算机病毒的定义计算机病毒(Computer Virus)是一种人为的制造的、能够进行自我复制的、具有对计算机资源破坏作用的一组程序或指令的集合。这是计算机病毒的广义定义。类似生物病毒,它能把自身附着在各种类型的文件上或寄生在存储媒介中,能对付计算机系统和网络进行各种破坏,同时有独特的复制能力和传染性,能够自我复制主动传染;另一方面,当文件被复制或在网络中从一个用户送到另一个用户时被动传染,他们就随同文件一起蔓延开来。在1994年2月18日公布的中华人民共和国计算机信息系统安全保护条例中,计算机病毒被定义为:“计算机病毒是指编制或者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够字我复制的一组计算机指令或者程序代码”。这一定义具有一定的法律性和权威性。是对计算机病毒的狭义定义。2.2计算机病毒的基本性质与本质计算机病毒种类繁多,特征各异,其中主要的有:自我复制能力;很强的感染性;一定的潜伏性;特定的触发性;很大的破坏性。1计算机病毒的可执行性(程序性)程序性是计算机病毒的基本特征,也是计算机病毒最基本的一种表现形式。程序性也就决定了计算机病毒的可防治性、可清除性。计算机病毒程序与其他合法程序一样,是一段可执行的程序,但他不是一个完整的程序,而是寄生在其他可执行程序上的一段程序,因此他享有一切可执行程序所能得到的权力。计算机的控制权是关键问题。反病毒技术就是要提前取得计算机系统的控制权,识别出计算机病毒的代码和行为,阻止起取得系统控制权,并及时将其清除。2计算机病毒的传染性病毒一次源于生物学,传染也相应成了计算机病毒最基本的特性。计算机病毒的传染性是指病毒具有把自身复制到其他程序的能力。在生物界,病毒通过传染从一个生物体扩散到另一个生物体。在适当的条件下,他可得到大量的繁殖,并使被感染的生物体表现出病症甚至死亡。同样,计算机病毒也会通过各种渠道通过已被感染的计算机扩散到未被感染的计算机,在某些情况下造成被感染的计算机工作失常甚至瘫痪。是否具有传染性,是判断一个程序是否为计算机病毒的首要条件。传染性也决定了计算机病毒的可判断性。3计算机病毒的非授权性计算机病毒未经授权而执行。正常的程序是由用户调用,再由系统分配资源,完成用户交给的任务,其目的对用户是可见的、透明的。而病毒隐藏在正常程序中,窃取正常程序的系统控制权,其目的对用户是未知的,是未经用户允许的。4计算机病毒的隐蔽性计算机病毒通常附在正常程序中或磁盘较隐蔽的地方,也有个别的以隐含文件的形式出现,目的是不让用户发现他的存在。如果不经过代码分析,病毒程序与正常程序是不容易区分开来的,而一旦病毒发作表现出来,往往已经给计算机系统造成了不同程度破坏。正是由于隐蔽性,计算机病毒得以在用户没有察觉的情况下扩散并游离与世界上的百万台计算机中。计算机病毒的隐蔽性通常表现在以下两个方面: 传染的隐蔽性。大多数病毒的代码设计得非常精巧而又短小,一般只有几百字节到几K,而PC对文件的存取速度非常快,所以病毒会在转瞬之间便可将这些病毒程序附着在正常文件之上,一般不具有外部表象,不易被人发现。 病毒程序存在的隐蔽性。病毒程序通常以隐蔽的方式存在,且被病毒感染的计算机在多数情况下仍能维持起部分功能,不回因为感染上病毒而使整台计算机不能使用。计算机病毒设计的精巧之处也在这里。5计算机病毒的潜伏性一个编制精巧的计算机病毒程序,进入系统之后一般不会马上发作。潜伏性越好,其在系统中的存在时间就会越长,病毒的传染范围就会越大。潜伏性通常表现以下两个方面: 病毒程序不用专门的检测程序是检查不出来的,一旦得到运行机会就繁殖、扩散,继续为害。 计算机病毒中往往有一种触发机制,不满足触发条件时,计算机病毒除了传染外不做其他的破坏,只有当触发条件满足时,才会激活病毒的发作模块而出现中毒的症状。6计算机病毒的可触发性计算机病毒因某个事件或数值的出现,诱使病毒实施感染或进行攻击的特性,称为可触发性。为了隐蔽自己,病毒必须潜伏,少做动作。如果完全不做动作,病毒既不能感染也不能进行破坏,失去杀伤力。病毒既要隐蔽又要维持杀伤力,就必须具有可触发性。病毒的触发机制是用来控制感染和破坏动作的频率的。病毒的触发机制越多,则传染性越强。7计算机病毒的破坏性所有的计算机病毒都是一种可执行的程序,而这一可执行程序又必然要运行,因此,所有的计算机病毒都对计算机系统造成不同程度的影响,轻这降低计算机系统工作效率、占用系统资源,重者导致数据丢失、系统崩溃。计算机病毒的破坏性,决定了病毒的危害性。8计算机病毒的寄生性病毒程序嵌入到宿主程序中,依赖与宿主程序的执行而生存,这就是计算机病毒的寄生性。病毒程序在侵入到宿主程序中后,一般对宿主程序进行一定的修改,宿主程序一旦执行,病毒程序就被激活,从而可以进行自我复制和繁衍。9、计算机病毒的诱惑欺骗性某些病毒常以某种特殊的表现方式,引诱、欺骗用户不自觉的触发、激活病毒,从而实施起感染、破坏功能。如情书变种病毒之一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病毒Win32可执行文件,如*.exe、*.dll、*.ocx等,都是PE格式文件。感染PE格式文件的Win32病毒,简称PE病毒。在绝大多数病毒爱好者中,真正的病毒技术在PE病毒中才会得到真正的体现。PE病毒同时也是所有病毒中数量极多、破坏性极大、技巧性最强的一类病毒。3.1.2脚本病毒脚本(Script)病毒是以脚本程序语言(如VB Script、JavaScript、PHP)编写而成的病毒。脚本病毒编写比较简单,并且编写的病毒具有传播快、破坏力大等特点。例如,爱虫病毒、新欢乐时光病毒等。就都是用VBS(VB Script)编写的,被称做VBS脚本病毒。但脚本病毒必须透过Microsoft的WSH(Windows Scripting Host)才能够启动执行以及感染其他文件。3.1.3宏病毒宏病毒是单独的一类病毒,因为它与传统的病毒有很大的不同,他不感染.EXE、.COM等可执行文件,而是将病毒代码以“宏”的形式潜伏在Microsoft Office文档中,当采用Office软件打开这些染毒文件时,这些代码就会被执行并产生破坏作用。由于“宏”是使用VBA(Visual Basic For Application)这样的高级代码写的,因此其编写过程相对来说比较简单,而功能又十分强大。宏病毒的产生标志着制造病毒不再是专业程序员的专利,任何人只要掌握一些基本的“宏”编写技巧即可编写出破坏力极大的宏病毒。随着微软Office软件在全世界的不断普及,宏病毒成为传播最广泛、危害最大的一类病毒。3.2 PE病毒原理3.2.1 PE文件格式目前主流的操作系统是Windows操作系统,病毒要在Windows操作系统上进行传播和破坏,其病毒文件也必须遵循PE文件的格式结构,。目前流行的计算机病毒以蠕虫、木马等类型病毒为住,这一类的病毒文件也大都是PE格式的文件,因此,我们在这一节会详细介绍PE格式文件,这是分析病毒程序的基础。什么是PE文件格式PE即Portable Executable,可移植、可执行,他是Win32可执行文件的标准格式。他的一些特性继承自UNIX的Coff(Common 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文件以一个简单的DOS MZ header开始。有了它,一旦程序在DOS下执行时,就能被DOS识别出这是否是有效的执行体,然后紧随MZ Header之后的是DOS Stub(DOS 插桩程序)实际上就是一个在DOS环境下简单调用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整个文件信息分布的重要字段。NT映像头包含了许多PE装载器用到的重要域。NT映像头的结构定义如下:IMAGE_NT_HEADER STRUCTSignature dd ?FileHeader IMAGE_FILE_HEADER OptionalHeader IMAGE_OPTIONAL_HEADER32 IMAGE_NT_HEADER ENDS而这三部分分别有着各自的数据结构(参见Windows.inc文件)。 Signature dd ?字串“50450000”标志着NT映像头的开始,也是PE文件中与Windows有关内容的开始。他的位置是在DOS程序头中的偏移3CH处的4个字节给出的。 FileHeader IMAGE_FILE_HEADER STRUCT00H Machine 机器类型02H NumberOfSection 文件中节的个数04H TimeDataStamp 生成该文件的时间08HPointerToSymbolTable COFF符号表的偏移0CH NumberOfSymbols 符号数目10H SizeOfOptionalHeader 可选头的大小12H Characteristics 标记(exe或dll)IMAGE_FILE_HEADER ENDS其中第2项 NumberOfSection 和第6项SizeOfOptionalHeader对于学习病毒是需要重点关注的。 OptionalHeader 由于OptionalHeader数据定义较多,现只列出与学习病毒较重要的一些域。IMAGE_OPTIONAL_HEADER32 STRUCT04H SizeOfCode 代码段的总尺寸10H AddressOfEntryPoint 程序开始执行位置14H BaseOfCode 代码节开始的位置1CH ImageBase 可执行文件的默认装入的内存地址20H SectionAlignment 可执行文件装入内存时节的对齐数字24H FileAlignment 文件中节的对齐数字,一般是一个扇区38H SizeOfImage 装入内存后映像的总尺寸3CHSizeOfHeaders NT映像头+节表的大小40HCheckSum 校验和44HSubsystem 可执行文件的子系统5CH NumberRvaAndSize 数据目录的项数,一般是1660HDataDirectory 数据目录IMAGE_OPTIONAL_HEADER32 ENDS3节表紧接着NT映像头之后的是节表。节表实际上是一个结构数组,其中每个结构包含了该节的具体信息(每个结构占用28H)。该成员的数目由映像文件头(IMAGE_FILE_HEADER)结构中NumberOfSection域决定的。节表的结构定义如下:IMAGE_SECTION_HEADER STRUCT00HName 节名08HPhyscicalAddress OBJ文件用做表示本节的物理地址VirtualSize EXE文件中表示节的实际字节数0CHVirtualAddress 本节的相对虚拟地址10HSizeOfRawData 本节的经过文件对齐后的尺寸14HPointerToRawData 本节原始数据在文件中的位置18HPointerToRelocation OBJ中表示该节重定位信息的偏移1CHPointerToLinenumbers 行号偏移20HNumberOfRelocations 本节要重定位的数目22HNumberOfLinenumbers 本节在行号中的行号数目24HCharacteristics 节属性IMAGE_SECTION_HEADER ENDS其中第2项 VirtualSize 、第3项VirtualAddress、第4项SizeOfRawData、第5项PointerToRawData、第10项Characteristics需要重点关注的。3.2.2检验PE文件的有效性检验PE文件的有效性对于有效地感染文件起着非常大的作用,因为只有在清楚了需要被感染的病毒文件是有效的PE文件时,才可以感染并且达到效果。如何才能校验指定文件是否为一有效PE文件呢? 这个问题很难回答,完全取决于想要的精准程度。可以检验PE文件格式里的各个数据结构,或者仅校验一些关键数据结构。大多数情况下,没有必要校验文件里的每一个数据结构,只要一些关键数据结构有效,我们就认为是有效的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校验程序核心部分代码的实现如下: edi已经指向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 Header在文件中相对文件首部的偏移量。edi加上该值正好定位到PE Header的首字节。比较它是否是字符串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病毒重定位为什么要重定位病毒首先第一步就需要重定位,那到底为什么要重定位呢?我们在写正常程序的时候根本不用去关心变量(常量)的位置,因为源程序在编译的时候它的内存中的位置都被计算好了。程序装入内存时,系统不会为它重定位。编程时我们需要用到变量(常量)的时候直接用变量名访问(编译后就是通过偏移地址访问)就行了。同时,病毒不可避免也要用到变量(常量),当病毒感染HOST程序后,由于其依附到HOST程序中的位置各有不同,病毒随着HOST载入内存后,病毒中的各个变量(常量)在内存中的位置自然也会随着发生变化。假如病毒在编译后,其中一变量Var的地址(004010xxh)就已经以二进制代码的形式固定了,当病毒感染HOST程序以后(即病毒相关代码已经直接依附到HOST程序中),由于病毒体对变量Var的引用还是对内存地址004010xxh的引用(病毒的这段二进制代码并不会发生改变),而在HOST上的004010xxh的位置实际上已经不再存放变量Var了,如果这个时候再用004010xxh的位置来调用Var那么肯定是无法成功的。这样就造成了病毒对变量的引用不准确,势必导致病毒无法正常运行。既然如此,病毒就非常有必要对所有病毒代码中的变量进行重新定位。如何重定位既然重定位是基本且非常重要的东西,那么重定位的具体方法就显得尤其重要了。本设计采用的是现在最普遍也是最有效的方法。我们先学习下call指令。call指令一般用来调用一个子程序或用来进行转跳,当这个语句执行的时候,它会先将返回地址(即紧接着call语句之后的那条语句在内存中的真正地址)压入堆栈,然后将IP置为call语句所指向的地址。当子程序碰到ret命令后,就会将堆栈顶端的地址弹出来,并将该地址存放在IP中。根据以上的描述,我们就可以采取一种调用call命令的方式来获得当前的重定位值。重定位核心代码实现如下:call relocaterelocate: pop ebp.lea eax,ebp+(offset Var-offset relocate) 这条语句执行之后,堆栈顶端为relocate在内存中的真正地址。 这条语句将relocate在内存中的真正地址存放在ebp寄存器中。 这时eax中存放着Var在内存中的真实地址。当pop语句执行完之后,ebp中放的是什么值呢?很明显是病毒程序中标号relocate在内存中的真正地址。如果病毒程序中有一个变量Var,那么该变量实际在内存中的地址应该是ebp+(offset Var-offset relocate),即参考量relocate在内存中的地址+其它变量与参考量之间的距离=其它变量在内存中的真正地址。有时候我们也采用(ebp-offset relocate)+offset Var的形式进行变量Var的重定位。还有一些其它重定位的方法,但是它们的基本原理都是一样的。3.2.4获取API函数地址为什么要获取API函数地址Win32 PE病毒和普通Win32 PE程序一样需要调用API函数,但是普通的Win32 PE程序里面有一个引入函数表,该函数表对应了代码段中所用到的API函数在动态连接库 (如Kernel32.dll,User32.dll)中的真实地址。这样,调用API函数时就可以通过该引入函数表找到相应API函数的真正执行地址。但是,对于Win32 PE病毒来说,他一般只有一个代码段,他并不存在引入函数段。既然如此,病毒就无法像普通PE程序那样直接调用相关API函数,而应该先找出这些API函数在相应动态链接库中的地址。如何获取API函数地址1获得Kernel32基地址如何获取API函数地址一直是病毒技术的一个非常重要的话题。要获得API函数地址,我们首先需要获得Kernel32.dll的基地址。为什么我们需要先获得它呢?因为一旦我们获得了Kernel32.dll的基地址,那么获得从Kernel32引出的函数就成为了可能,即使用户用到了其他的API(如从User32.dll中引出的)函数。则可以使用从Kernel32中得到的LoadLibrary函数和GetProcAddress函数相结合得到其他API函数的地址。下面介绍一种获得Kernel32基地址的方法:利用HOST程序的返回地址,在其附近搜索Kernel32模块基地址。当系统打开一个可执行文件的时候,它会调用Kernel32.dll中的CreateProcess函数;CreateProcess函数在完成装载应用程序后,会先将一个返回地址压入到堆栈顶端,然后转向执行刚才装载的应用程序。当该应用程序结束后,会将堆栈顶端数据弹出放到IP中,继续执行。刚才堆栈顶端保存的数据其实就是在Kernal32.dll中的返回地址。其实这个过程跟同我们的应用程序用call指令调用子程序类似。可以看出,这个返回地址是在Kernal32.dll模块中。另外PE文件被装入内存时是按内存页对齐的,只要我们从返回地址按照页对齐的边界一页一页地往低地址搜索,就必然可以找到Kernel32.dll的文件头地址,即Kernel32模块的基地址。搜索Kernel32基地址的核心代码实现如下: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. 将堆栈顶端的数据赋给ecx。 逐字节比较验证,也可以一页一页地搜。 就是ecx+3ch(比较方式类似判断PE文件的有效性第一步思想一致)。 Dos Header+stub值不会太大,不可能超过4096byte。 看Image_Base值是否等于ecx即模块起始值。 如果是,就认为找到kernel32的Base值。2利用Kerner32基地址来获取API函数地址在参照了引出表结构之后,那么获得API函数地址的方法就不理解了。 引出表的结构定义如下:00HCharacteristics04HTimeDateStamp文件生成时间08HMajorVesion主版本号0AHMinerVesion次版本号0CHName指向DLL的名字10HBase开始的序号14HNumberOfFunctionAddressOfFunctions的项数18HNumberOfNamesAddressOfNames的项数1CHAddressOfFunctions指向函数地址的数组20HAddressOfNames指向函数名称的地址的数组24HAddressOfNameOrdinals指向输入序列号的数组只要理解好最后5项的具体含义,那么搜索API地址的方法就显而易见了。AddressOfFunctions指向一个数组,这个数组的每个成员就指向了一个API函数的地址,也就是说我们只要从这个数组里获得了一个API函数的地址,那么我们就可以使用相应的API函数了,但里面的API函数地址是按数组存放的,那么我们要使用一个指定的API函数,就必须知道该API函数在数组中的具体的位置,也就是一个索引号。上面说的这个索引号则需要表中的最后2项来获得,AddressOfNames 与AddressOfNameOrdinals指向2个数组,一个是函数名字的数组,一个是函数名称的数组,一个是函数名字所对应的索引号的数组,这2个数组是一一对应的,也就是说,如果第一个数组中的第M项是我们要查找的函数的名字,那么第二个数组中的第M项就是该函数的索引号。这样我们就可以通过在第一个数组中查找我们需要查找的函数的名字,如果查到,便记住该项目在数组中的位置,然后再到第二个数组中相同位置就可以获得该函数在AddressOfFunctions中的索引号了。解决以上问题后,我们就知道了如何利用引出表的结构来查找我们需要的函数地址了。但我们还得需要获得引出表的结构的地址,其实方法也比较简单,PE文件中可选映像头中60H有一个数据目录表DataDirectory,该目录表的第一个数据目录就存放了导出表结构的地址。 已知API函数名称利用Kernel32 Base来获取函数地址的方法定位到PE文件头。从PE文件头中的可选文件头中取出数据目录表的第一个数据目录,得到导出表的地址。从导出表的NumberOfNames字段得到以命名函数的总数,并以这个数字做微循环的次数来构造一个循环。从AddressOfNames字段指向的函数名称地址表的第一项开始,在循环中将每一项定义的函数名与要查找的函数名比较,如果没有任何一个函数名符合,说明文件中没有指定名称的函数。如果某一项定义的函数名与要查找的函数名符合,那么记住这个函数名在字符串地址表中的索引值(如x),然后在AddressOfNameOrdinals指向的数组中以同样的索引值x去找数组项中的值,假如该值为m。以m值作为索引值,在AddressOfFunctions字段指向的函数入口地址表中获取的RVA就是函数的入口地址,当函数被装入内存后,这个RVA值加上模块实际装入的基址(ImageBase),就得到了函数真正的入口地址。对于病毒来说,通常是通过API函数名称来查找API函数地址。3.2.5文件操作关于文件搜索1文件搜索函数搜索文件是病毒寻找目标文件的非常重要的功能。在Win32汇编中,通常采用三个API函数进行文件搜索。 FindFirstFile 该函数根据文件名查找文件。 FindNextFile 该函数根据调用FindFirstFile函数时指定的一个文件名查找下一个文件。 FindClose 该函数用来关闭由FindFirstFile函数创建的一个搜索句柄。2文件搜索算法文件搜索一般采用递归算法进行搜索,也可以采用非递归搜索方法,这里我们仅介绍递归的算法FindFile Proc 指定找到的目录为当前工作目录。 开始搜索文件(*.*)。 该目录搜索完毕?是则返回,否则继续。 找到文件还是目录?是目录则调用自身函数FindFile,否则继续。 是文件,如符合感染条件,则调用感染模块,否则继续。 搜索下一个文件(FindNextFile),转到继续。FindFile Endp内存映射文件内存映射文件提供了一组独立的函数,是应用程序能够通过内存指针像访问内存一样对磁盘上的文件进行访问。这组内存映射文件函数将磁盘上的文件的全部或者部分映射到进程虚拟地址空间的某个位置,以后对文件内容的访问就如同在该地址区域内直接对内存访问一样简单。这样,对文件中数据的操作便是直接对内存进行操作,大大地提高了访问的速度,这对于计算机病毒来说,对减少资源占有是非常重要的。1内存映射文件函数 CreateFileMapping该函数用来创建一个新的文件映射对象。 MapViewOfFile 该函数将一个文件映射对象映射到当前应用程序的地址空间。 UnMapViewOfFile 该函数在当前应用程序的内存地址空间解除对一个文件映射对象的映射。 CloseHandle 该函数用来关闭一个内核对象,其中包括文件、文件映射、进程、线程、安全和同步对象等。2内存映射文件方法在计算机病毒中,通常采用如下几个步骤: 调用CreateFile函数打开想要映射的HOST程序,返回文件句柄hFile。 调用CreateFileMapping函数生成一个建立基于HOST文件句柄hFile的内存映射对象,返回内存映射对象句柄hMap。 调用MapViewOfFile函数将整个文件(一般还要加上病毒体的大小)映射到内存中。得到指向映射到内存的第一个字节的指针(pMem)。 用刚才得到的指针pMem对整个HOST文件进行操作,对HOST程序进行病毒感染。 调用UnmapViewFile函数解除文件映射,传入参数是pMem。 调用CloseHandle来关闭内存映射文件,传入参数是hMap。 调用CloseHandle来关闭HOST文件,传入参数是hFile。感染PE文件1文件感染操作相关函数 CreateFile 该函数可打开和创建文件、管道、邮槽、通信服务、设备以及控制台。 CloseHandle 该函数用来关闭一个内核对象,其中包括文件、文件映射、进。 SetFilePointer 该函数在一个文件中设置当前的读写位置。 ReadFile 该函数用来从文件中读取数据。 WriteFile 该函数用来将数据写入文件。 SetEndOfFile 该函数针对一个打开的文件,将当前文件位置设为文件末尾。 GetFileSize 该函数得到指定文件的大小。 FlushFileBuffers 该函数针对指定的文件句柄,刷新内部文件缓冲区。2文件感染的基本步骤(添加病毒新节的方式) 判断目标文件开始的两个字节是否为“MZ”。 判断PE文件标记“PE”。 判断感染标记,如果已被感染过则跳出继续执行HOST程序,否则继续。 获得Directory(数据目录)的个数,(每个数据目录信息占8个字节)。 得到节表起始位置。(Directory的偏移地址+数据目录占用的字节数=节表起始位置)。得到目前最后节表的末尾偏移(紧接其后用于写入一个新的病毒节)节表起始位置+节的个数*(每个节表占用的字节数28H)=目前最后节表的末尾偏移。 开始写入节表。a) 写入节名(8字节)。b) 写入节的实际字节数(4字节)。c) 写入新节在内存中的开始偏移地址(4字节),同时可以计算出病毒入口位置上节在内存中的开始偏移地址+(上节大小/节对齐+1)节对齐=本节在内存中的开始偏移地址。d) 写入本节(即病毒节)在文件中对齐后的大小。e) 写入本节在文件中的开始位置。上节在文件中的开始位置+上节对齐后的大小=本节(即病毒)在文件中的开始位置。f) 修改映像文件头中的节表数目。g) 修改AddressOfEntryPoint(即程序入口点指向病毒入口位置),同时保存旧的AddressOfEntryPoint,以便返回HOST继续执行。h) 更新SizeOfImage(内存中整个PE映像尺寸=原SizeOfImage+病毒节经过内存节对齐后的大小)。i) 写入感染标记(后面例子中是放在PE头中)。j) 写入病毒代码到新添加的节中。k) 将当前文件位置设为文件末尾。PE病毒感染其他文件的方法还有很多,譬如PE病毒还可以将自己分散插入到每个节的空隙中,他的好处就是病毒不增长,但难度较大。3文件感染需要注意的细节为了提高自己的生存能力,病毒是不应该破坏HOST程序的,既然如此,病毒应该在病毒执行完毕后,立刻将控制权交给HOST程序。返回HOST程序相对来说比较简单,病毒在修改被感染文件代码开始执行位置(AddressOfEntryPoint)时,应该保存原来的值,这样,病毒在执行完病毒代码之后用一个跳转语句跳到这段代码处继续执行即可。注意,在这里,病毒先会做出一个“现在执行程序是否为病毒启动程序”的判断,如果不是启动程序,病毒才会返回HOST程序,否则继续执行程序其它部分。4 Windows PE文件病毒的研究及实现4.1病毒程序实现4.1.1病毒程序编写背景21世纪是信息的时代,信息成为一种重要的战略资源,信息科学成为最活跃学科领域之一,信息技术改变着人们的生活和工作方式,信息产业成为新的经济增长点。信息的安全保障能力成为一个国家综合国力的重要组成部分。随着计算机和互联网技术的快速发展和广泛应用,计算机网络系统的安全受到严重的挑战,来自计算机病毒和黑客的攻击及其其他方面的威胁越来越大。其中,计算机病毒更是计算机安全中很难根治的主要威胁之一。通过对计算机病毒的认识,研究以达到更加深刻地了解病毒,只有了解计算机病毒的原理,掌握计算机病毒的防治技术,正确认识计算机病毒,才可更加有效地对抗计算机病毒和减少计算机病毒带来的损失。4.1.2病毒程序基本功能介绍1传播性 实现对本机指定EXE文件的感染,本机被病毒感染的EXE程序在正常运行时会激活病毒并继续感染下一个需要感染的EXE程序,且在不满足发作条件的情况下可以正常运行,并无异样。 主机间的传播通过U盘来传播,在本机已经感染的情况下,如果有U盘已经插入,则会感染U盘,如果用户下次在另一台主机上使用U盘若警惕行不高,则极容易被感染病毒。2潜伏性 病毒在固定的一个时间段内发作,病毒文件也为系统文件并且隐藏,有一定的隐蔽性,病毒会寄生在HOST中,和系统目录下,只有在满足发作条件时才会影响用户使用。其他时候,程序都能正常使用。3破坏性 在主机感染了病毒程序后,任务管理器会被禁用、注册表无法打开。 记事本程序无法运行,每直接运行一次NOTEPAD.EXE都会激活一次病毒程序。 WinRAR被感染,每使用WinRAR都可能激活一次病毒。 病毒发作时会出现中病毒的提示框,并显示病毒的长度。 病毒发作时会自动关机。4.1.3病毒程序编写环境Windows XP 操作系统VMware Workstation虚拟机UltraEdit-32文本编辑器masm32v8编译器OllyDbg动态跟踪调试器4.1.4病毒程序简要流程框图框图将程序的5个模块的功能流程做了粗略的表达。如图1。4.1.5病毒程序主模块-JERRY.ASM主模块实现病毒的重定位,查找Kernel32基地址,调用SearchAPI搜索相应的API函数地址,文件操作,调用Modify_PE感染HOST文件,调用EffectU感染主机和U盘,调用Burst发作。流程参照图1。商业源代码,全套计算机毕业设计免费下载 更多全套设计联系QQ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论