计算机病毒的解析与防范.doc
本 科 毕 业 论 文计算机病毒的解析与防范指 导 老 师 : 学 生 姓 名 : 学 号 :36031022310005院 系 :网络教育学院专 业 :计算机科学与技术写 作 批 次 : 原 创 承 诺 书我承诺所呈交的毕业论文是本人在老师指导下进行的研究工作及取得的研究成果。据我查证,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果。若本论文及资料与以上承诺内容不符,本人愿意承担一切责任。 毕业论文作者签名:_ 日期: 年 月 日目 录 论文总页数33页摘要 IAbstract II导言III一、计算机病毒概述 1(一)计算机病毒的定义 1(二)计算机病毒的基本性质与本质 1二、Windows病毒 3(一)Windows病毒分类 31、PE病毒 32、脚本病毒 33、宏病毒 3(二) PE病毒原理 31、PE文件格式 32、检验PE文件的有效性 63、病毒重定位 64、获取API函数地址 75、文件操作 9三、Windows PE文件病毒的研究及实现 11(一)病毒程序实现111、病毒程序编写背景112、病毒程序基本功能介绍123、病毒程序编写环境124、病毒程序简要流程框图125、病毒程序主模块-JERRY.ASM126、病毒程序搜索API函数模块-SearchAPI.ASM137、病毒程序感染EXE文件模块-Modify_PE.ASM148、病毒程序感染及U盘传播模块-EffectU.ASM179、病毒程序发作模块-Burst.ASM18(二)病毒程序测试191、病毒程序测试环境192、病毒程序测试过程193、病毒程序测试结果21(三)病毒程序总结分析241、病毒传播能力分析242、病毒潜伏能力分析243、病毒破坏能力分析244、病毒程序自我总结255、病毒程序完善方向25四、主动防御简介 25(一)主动防御概论 25(二)主动防御组成与特点 251、主动防御的组成 252、主动防御的特点 25(三)主动防御核心技术 25 1、系统服务调度技术 25 2、应用程序防御体系AD(Application Defend) 26 3、注册表防御体系RD(Registry Defend) 27 4、文件防御体系FD(File Defend)28 5、挂接技术28 6、应用程序与内核层的通讯机制30注 释31参考文献32致 谢 词 33摘 要在计算机病毒技术与反病毒技术激烈斗争的今天,病毒技术的复杂多变,发展迅速给计算机用户同时也给反病毒技术带了巨大的挑战。本文详细剖析了时下较流行的Windows 32位操作系统平台下最为常见的PE病毒机制,配合以代码实现的方式,从一个病毒编写者的角度展示病毒基本原理,并以此为契机从而做到更好的防范病毒。第一部分分别介绍了Windows病毒的基本原理、分类,并着重介绍PE病毒基本原理,基本机制;第二部分则根据PE病毒原理用编写实际代码的方式实现一个感染正常EXE文件(如WinRAR.exe)、关机并通过U盘传播等功能的病毒程序;第三部分则通过功能测试(白盒测试)、杀毒软件测试,总结并展望病毒技术;最后通过此次课题的研究成果,结合当今主流反病毒技术,总结Windows PE病毒防范技术。关键字:Windows病毒;PE病毒;反病毒技术;PE文件格式;PE病毒实现 主动防御;实时监控;系统调用AbstractNowadays, computer virus technology is growing rapidly as fast as development speed of anti-virus technology.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 mechanism 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 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 technology through the research on this topic with mainstream anti-virus technology.Key Words:Windows virus; PE virus; anti-virus technology; PE format; implementation of virus program导 言随着计算机和互联网技术的快速发展,计算机正走进社会的各个领域,走进千家万户,计算机系统已经能够实现生活、管理、办公的自动化,成为人类社会不可或缺的一部分。然而,计算机系统并不安全,其不安的因素有计算机系统自身的、自然不可抗拒的,也有人为的。计算机病毒就是最不安全因素之一。计算机病毒是计算机技术和以计算机为核心的社会信息化进程发展到一定阶段的必然产物,是计算机犯罪的一种的新的衍化形式。自从第一例计算机病毒出现以来,随着计算机技术、网络技术的迅猛发展,计算机病毒也日益猖獗,成为了计算机网络安全、信息安全最大公害。各种计算机病毒的产生和蔓延,已经给计算机系统安全造成了巨大的威胁和损害,其造成的计算机资源的损失和破坏,不但会造成资源和财富的巨大浪费,而且有可能造成社会性的灾难,正因为如此,我们就应坚决地走到反病毒的行列中来。我们研究病毒,最终目的是为了消灭病毒。大多数计算机用户对病毒不了解才会造成病毒的横行,对于精通病毒原理的人来说,病毒是毫无攻击力的。我们要做到彻底地消灭病毒,那么就不能全依靠少数编写杀毒软件的人,而是要做到了解病毒基本原理,了解病毒只是为了认识病毒,消除对病毒的恐惧心理,最终达到能够防毒、清除病毒的目的。所以对于病毒基本原理的学习,对计算机病毒编写的学习是非常有意义的。Windows PE病毒是所有病毒中数量极多、破坏性极大的、技巧性最强的一类病毒。譬如CIH、FunLove、中国黑客等。本文就以此类病毒为突破口,从基本原理到病毒代码的编写测试,完成一个基本的Windows PE病毒模型,从而更加了解PE病毒,更好的防治病毒。本文第一部分介绍计算机基本知识;第二部分着重介绍计算机病毒中的Windows病毒,从内核级学习PE文件格式,PE病毒原理;第三部分结合第二部分的准备知识,分别介绍每个代码模块功能及实现;第四部分则介绍了针对PE病毒的一些解决方案;最后一部分对计算机的防治做了展望。计算机病毒的解析与防范一、计算机病毒概述(一)计算机病毒的定义计算机病毒(Computer Virus)是一种人为的制造的、能够进行自我复制的、具有对计算机资源破坏作用的一组程序或指令的集合。这是计算机病毒的广义定义。类似生物病毒,它能把自身附着在各种类型的文件上或寄生在存储媒介中,能对付计算机系统和网络进行各种破坏,同时有独特的复制能力和传染性,能够自我复制主动传染;另一方面,当文件被复制或在网络中从一个用户送到另一个用户时被动传染,他们就随同文件一起蔓延开来。在1994年2月18日公布的中华人民共和国计算机信息系统安全保护条例中,计算机病毒被定义为:“计算机病毒是指编制或者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够字我复制的一组计算机指令或者程序代码”。这一定义具有一定的法律性和权威性。是对计算机病毒的狭义定义。(二)计算机病毒的基本性质与本质计算机病毒种类繁多,特征各异,其中主要的有:自我复制能力;很强的感染性;一定的潜伏性;特定的触发性;很大的破坏性。1计算机病毒的可执行性(程序性)程序性是计算机病毒的基本特征,也是计算机病毒最基本的一种表现形式。程序性也就决定了计算机病毒的可防治性、可清除性。计算机病毒程序与其他合法程序一样,是一段可执行的程序,但他不是一个完整的程序,而是寄生在其他可执行程序上的一段程序,因此他享有一切可执行程序所能得到的权力。计算机的控制权是关键问题。反病毒技术就是要提前取得计算机系统的控制权,识别出计算机病毒的代码和行为,阻止起取得系统控制权,并及时将其清除。2计算机病毒的传染性病毒一次源于生物学,传染也相应成了计算机病毒最基本的特性。计算机病毒的传染性是指病毒具有把自身复制到其他程序的能力。在生物界,病毒通过传染从一个生物体扩散到另一个生物体。在适当的条件下,他可得到大量的繁殖,并使被感染的生物体表现出病症甚至死亡。同样,计算机病毒也会通过各种渠道通过已被感染的计算机扩散到未被感染的计算机,在某些情况下造成被感染的计算机工作失常甚至瘫痪。是否具有传染性,是判断一个程序是否为计算机病毒的首要条件。传染性也决定了计算机病毒的可判断性。3计算机病毒的非授权性计算机病毒未经授权而执行。正常的程序是由用户调用,再由系统分配资源,完成用户交给的任务,其目的对用户是可见的、透明的。而病毒隐藏在正常程序中,窃取正常程序的系统控制权,其目的对用户是未知的,是未经用户允许的。4计算机病毒的隐蔽性计算机病毒通常附在正常程序中或磁盘较隐蔽的地方,也有个别的以隐含文件的形式出现,目的是不让用户发现他的存在。如果不经过代码分析,病毒程序与正常程序是不容易区分开来的,而一旦病毒发作表现出来,往往已经给计算机系统造成了不同程度破坏。正是由于隐蔽性,计算机病毒得以在用户没有察觉的情况下扩散并游离与世界上的百万台计算机中。计算机病毒的隐蔽性通常表现在以下两个方面:(1)传染的隐蔽性。大多数病毒的代码设计得非常精巧而又短小,一般只有几百字节到几K,而PC对文件的存取速度非常快,所以病毒会在转瞬之间便可将这些病毒程序附着在正常文件之上,一般不具有外部表象,不易被人发现。(2)病毒程序存在的隐蔽性。病毒程序通常以隐蔽的方式存在,且被病毒感染的计算机在多数情况下仍能维持起部分功能,不回因为感染上病毒而使整台计算机不能使用。计算机病毒设计的精巧之处也在这里。5计算机病毒的潜伏性一个编制精巧的计算机病毒程序,进入系统之后一般不会马上发作。潜伏性越好,其在系统中的存在时间就会越长,病毒的传染范围就会越大。潜伏性通常表现以下两个方面:(1)病毒程序不用专门的检测程序是检查不出来的,一旦得到运行机会就繁殖、扩散,继续为害。(2)计算机病毒中往往有一种触发机制,不满足触发条件时,计算机病毒除了传染外不做其他的破坏,只有当触发条件满足时,才会激活病毒的发作模块而出现中毒的症状。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”。目前的大多数杀病毒软件采用的方法主要是特征码查毒方案与人工解毒并行,即在查病毒时采用特征码查毒,在杀病毒时采用人工编制解毒代码。而特征码技术是一种基于对已知病毒分析、查解的反病毒技术,而对特征码的描述取决于人的主观因素。此外,要撷取一个病毒的特征码,必然要获取该病毒的样本,同时由于各个地区,国家对特征码的描述各个不同,特征码方法在国际上很难得到广域性支持。此外,虚拟机技术也在得到广泛的应用,并逐渐成为反病毒技术的一个发展方向。一个比较完整的虚拟机,不仅能够识别新的未知病毒,而且能够清除未知病毒。但是虚拟机技术需要拥有一套自己的机器指令集或仿机器指令,为恶意软件提供虚拟的运行环境,并通过对恶意软件的跟踪,记录,制定一套行为判断标准来判断是否为恶意代码(或程序),但其标准是不易被实现与统一的,且其所需要的系统资源也是巨大的。因此,跳出传统技术路线,尽快研制以行为自动监控、行为自动分析、行为自动诊断为新思路的主动防御型产品,从根本上克服现有杀毒软件的重大缺陷。建立主动防御为主、结合现有反病毒技术的综合防范体系,实现反病毒技术的革命性飞跃和反病毒产业的升级,是全球反病毒领域共同面临的巨大挑战,具有极现实的信息安全急迫性(刘旭,2008)。 第二,国内外研究概况、水平和发展趋势。目前国内外的一些主流杀毒软件都提供的一些主动防御的功能,包括McAfee和赛门铁克在内的绝大多数产品提供的主动防御功能还处于概念阶段。很难做到对未知病毒能够自主识别、明确报出并能自动清除。大多只是对单一程序动作报警,而没有对程序动作进行关联分析。同时,还存在以下缺陷:(1) 高误警(误报)率,缺乏智能判断;(2) 产品适应能力差,操作复杂。仅适合一些具备一定技术水平的用户使用;(3) 业界评价主动防御产品无统一标准。因此,只有对病毒行为规律进行分析、归纳、总结,并结合反病毒专家判定病毒的经验,提炼成病毒识别规则知识库(刘旭,2008);模拟专家发现新病毒的机理,通过分布在操作系统的众多探针,动态监视所运行程序调用各种API的动作,将程序的一系列动作通过逻辑关系分析组成有意义的行为;再综合应用病毒识别规则知识,才能研发出了自动判定病毒的主动防御系统。这种主动防御技术必将成为未来解决病毒危害的发展趋势。第三,应用前景。以先进的动态“主动防御”为核心,以传统的以行为判断和静态的“病毒特征码查杀”为手段,就必定能够从容的应对未来复杂多变的恶意程序。二、Windows病毒(一)Windows病毒分类1、PE病毒Win32可执行文件,如*.exe、*.dll、*.ocx等,都是PE格式文件。感染PE格式文件的Win32病毒,简称PE病毒。在绝大多数病毒爱好者中,真正的病毒技术在PE病毒中才会得到真正的体现。PE病毒同时也是所有病毒中数量极多、破坏性极大、技巧性最强的一类病毒。2、脚本病毒脚本(Script)病毒是以脚本程序语言(如VB Script、JavaScript、PHP)编写而成的病毒。脚本病毒编写比较简单,并且编写的病毒具有传播快、破坏力大等特点。例如,爱虫病毒、新欢乐时光病毒等。就都是用VBS(VB Script)编写的,被称做VBS脚本病毒。但脚本病毒必须透过Microsoft的WSH(Windows Scripting Host)才能够启动执行以及感染其他文件。3、宏病毒宏病毒是单独的一类病毒,因为它与传统的病毒有很大的不同,他不感染.EXE、.COM等可执行文件,而是将病毒代码以“宏”的形式潜伏在Microsoft Office文档中,当采用Office软件打开这些染毒文件时,这些代码就会被执行并产生破坏作用。由于“宏”是使用VBA(Visual Basic For Application)这样的高级代码写的,因此其编写过程相对来说比较简单,而功能又十分强大。宏病毒的产生标志着制造病毒不再是专业程序员的专利,任何人只要掌握一些基本的“宏”编写技巧即可编写出破坏力极大的宏病毒。随着微软Office软件在全世界的不断普及,宏病毒成为传播最广泛、危害最大的一类病毒。(二) PE病毒原理1、 PE文件格式目前主流的操作系统是Windows操作系统,病毒要在Windows操作系统上进行传播和破坏,其病毒文件也必须遵循PE文件的格式结构,。目前流行的计算机病毒以蠕虫、木马等类型病毒为住,这一类的病毒文件也大都是PE格式的文件,因此,我们在这一节会详细介绍PE格式文件,这是分析病毒程序的基础。(1)什么是PE文件格式PE即Portable Executable,可移植、可执行,他是Win32可执行文件的标准格式。他的一些特性继承自UNIX的Coff(Common object file format)文件格式。Portable Executable就意味着此文件是跨Win32平台的,即使Windows运行在非Intel的CPU上,任何Win32平台的PE装载器都能识别和使用该文件格式。因而,研究学习PE文件格式,除了有助于了解病毒的传染原理之外,还给我们提供了洞悉Windows结构的良机。(2)PE文件格式详细剖析PE文件的构成如下:表1 PE文件格式PE文件结构的总体层次分布DOS MZ HeaderDOS StubPE HeaderSection TableSection 1Section 2Section nDOS小程序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”之类信息的小程序。NT映像头紧接着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 ENDS节表紧接着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需要重点关注的。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、病毒重定位(1)为什么要重定位病毒首先第一步就需要重定位,那到底为什么要重定位呢?我们在写正常程序的时候根本不用去关心变量(常量)的位置,因为源程序在编译的时候它的内存中的位置都被计算好了。程序装入内存时,系统不会为它重定位。编程时我们需要用到变量(常量)的时候直接用变量名访问(编译后就是通过偏移地址访问)就行了。同时,病毒不可避免也要用到变量(常量),当病毒感染HOST程序后,由于其依附到HOST程序中的位置各有不同,病毒随着HOST载入内存后,病毒中的各个变量(常量)在内存中的位置自然也会随着发生变化。假如病毒在编译后,其中一变量Var的地址(004010xxh)就已经以二进制代码的形式固定了,当病毒感染HOST程序以后(即病毒相关代码已经直接依附到HOST程序中),由于病毒体对变量Var的引用还是对内存地址004010xxh的引用(病毒的这段二进制代码并不会发生改变),而在HOST上的004010xxh的位置实际上已经不再存放变量Var了,如果这个时候再用004010xxh的位置来调用Var那么肯定是无法成功的。这样就造成了病毒对变量的引用不准确,势必导致病毒无法正常运行。既然如此,病毒就非常有必要对所有病毒代码中的变量进行重新定位。(2)如何重定位既然重定位是基本且非常重要的东西,那么重定位的具体方法就显得尤其重要了。本设计采用的是现在最普遍也是最有效的方法。我们先学习下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的重定位。还有一些其它重定位的方法,但是它们的基本原理都是一样的。4、获取API函数地址(1)为什么要获取API函数地址Win32 PE病毒和普通Win32 PE程序一样需要调用API函数,但是普通的Win32 PE程序里面有一个引入函数表,该函数表对应了代码段中所用到的API函数在动态连接库 (如Kernel32.dll,User32.dll)中的真实地址。这样,调用API函数时就可以通过该引入函数表找到相应API函数的真正执行地址。但是,对于Win32 PE病毒来说,他一般只有一个代码段,他并不存在引入函数段。既然如此,病毒就无法像普通PE程序那样直接调用相关API函数,而应该先找出这些API函数在相应动态链接库中的地址。(2)如何获取API函数地址获得Kernel32基地址如何获取API函数地址一直是病毒技术的一个非常重要的话题。要获得API函数地址,我们首先需要获得Kernel32.dll的基地址。为什么我们需要先获得它呢?因为一旦我们获得了Kernel32.dll的基地址,那么获得从Kernel32引出的函数就成为了可能,即使用户用到了其他的API(如从User32.dll中引