计算机病毒模拟程序.doc_第1页
计算机病毒模拟程序.doc_第2页
计算机病毒模拟程序.doc_第3页
计算机病毒模拟程序.doc_第4页
计算机病毒模拟程序.doc_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

摘 要 在计算机病毒技术与反病毒技术激烈斗争的今天,病毒技术的复杂多变,发展迅速给计算机用户同时也给反病毒技术带了巨大的挑战。本文详细剖析了时下较流行的windows 32位操作系统平台下最为常见的pe病毒机制,配合以代码实现的方式,从一个病毒编写者的角度展示病毒基本原理,并以此为契机从而做到更好的防范病毒。第一部分分别介绍了windows病毒的基本原理、分类,并着重介绍pe病毒基本原理,基本机制;第二部分则根据pe病毒原理用编写实际代码的方式实现一个感染正常exe文件(如winrar.exe)、关机并通过u盘传播等功能的病毒程序;第三部分则通过功能测试(白盒测试)、杀毒软件测试,总结并展望病毒技术;最后通过此次课题的研究成果,结合当今主流反病毒技术,总结windows pe病毒防范技术。关键字:windows病毒;pe病毒;反病毒技术;pe文件格式;pe病毒 abstract nowadays, 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.keywords windows virus: pe virus; anti-virus technology; pe format; implementation of virus program目 录第一章 病毒的发展史2第一节 计算机病毒的发展历史2第二节 计算机病毒的当前状况2第三节 计算机病毒的发展趋势3第二章 计算机病毒概述5第一节计算机病毒的定义5第二节 计算机病毒基本性质与本质5第三章 windows病毒8第一节 windows病毒分类8第二节 pe病毒原理9第四章 windows pe文件病毒的研究及实现22第一节 病毒程序实现22第二节 病毒程序测试33第三节 病毒程序总结分析40结 论42致 谢43参考文献4445绪 论随着计算机和互联网技术的快速发展,计算机正走进社会的各个领域,走进千家万户,计算机系统已经能够实现生活、管理、办公的自动化,成为人类社会不可或缺的一部分。然而,计算机系统并不安全,其不安的因素有计算机系统自身的、自然不可抗拒的,也有人为的。计算机病毒就是最不安全因素之一。计算机病毒是计算机技术和以计算机为核心的社会信息化进程发展到一定阶段的必然产物,是计算机犯罪的一种的新的衍化形式。自从第一例计算机病毒出现以来,随着计算机技术、网络技术的迅猛发展,计算机病毒也日益猖獗,成为了计算机网络安全、信息安全最大公害。各种计算机病毒的产生和蔓延,已经给计算机系统安全造成了巨大的威胁和损害,其造成的计算机资源的损失和破坏,不但会造成资源和财富的巨大浪费,而且有可能造成社会性的灾难,正因为如此,我们就应坚决地走到反病毒的行列中来。我们研究病毒,最终目的是为了消灭病毒。大多数计算机用户对病毒不了解才会造成病毒的横行,对于精通病毒原理的人来说,病毒是毫无攻击力的。我们要做到彻底地消灭病毒,那么就不能全依靠少数编写杀毒软件的人,而是要做到了解病毒基本原理,了解病毒只是为了认识病毒,消除对病毒的恐惧心理,最终达到能够防毒、清除病毒的目的。所以对于病毒基本原理的学习,对计算机病毒编写的学习是非常有意义的。windows pe病毒是所有病毒中数量极多、破坏性极大的、技巧性最强的一类病毒。譬如cih、funlove、中国黑客等。本文就以此类病毒为突破口,从基本原理到病毒代码的编写测试,完成一个基本的windows pe病毒模型,从而更加了解pe病毒,更好的防治病毒。本文第一部分介绍计算机基本知识;第二部分着重介绍计算机病毒中的windows病毒,从内核级学习pe文件格式,pe病毒原理;第三部分结合第二部分的准备知识,分别介绍每个代码模块功能及实现;第四部分则介绍了针对pe病毒的一些解决方案;最后一部分对计算机的防治做了展望。第一章 病毒的发展史 第一节 计算机病毒的发展历史 到了1987年,第一个电脑病毒c-brain终于诞生了。一般而言,业界都公认这是真正具备完整特征的电脑病毒始祖。这个病毒程序是由一对巴基斯坦兄弟:巴斯特(basit)和阿姆捷特(amjad)所写的,他们在当地经营一家贩卖个人电脑的商店,由于当地盗拷软件的风气非常盛行,因此他们的目的主要是为了防止他们的软件被任意盗拷。只要有人盗拷他们的软件,c-brain就会发作,将盗拷者的硬盘剩余空间给吃掉。这个病毒在当时并没有太大的杀伤力,但后来一些有心人士以c-brain为蓝图,制作出一些变形的病毒。而其他新的病毒创作,也纷纷出笼,不仅有个人创作,甚至出现不少创作集团(如nuke,phalcon/skism,vdv)。各类扫毒、防毒与杀毒软件以及专业公司也纷纷出现。一时间,各种病毒创作与反病毒程序,不断推陈出新,百家争鸣。 第二节 计算机病毒的当前状况一、计算机网络(互联网、局域网)成为计算机病毒的主要传播途径,使用计算机网络逐渐成为计算机病毒发作条件的共同点。计算机病毒最早只通过文件拷贝传播,当时最常见的传播媒介是软盘和盗版光碟。随着计算机网络的发展,目前计算机病毒可通过计算机网络利用多种方式(电子邮件、网页、即时通讯软件等)进行传播。计算机网络的发展有助于计算机病毒的传播速度大大提高,感染的范围也越来越广。可以说,网络化带来了计算机病毒传染的高效率。与以前计算机病毒给我们的印象相比,计算机病毒的主动性(主动扫描可以感染的计算机)、独立性(不再依赖宿主文件)更强了。二、计算机病毒变形的速度极快并向混合型、多样化发展计算机病毒向混合型、多样化发展的结果是一些病毒会更精巧,另一些病毒会更复杂,混合多种病毒特征,如红色代码病毒(code red)就是综合了文件型、蠕虫型病毒的特性,这种发展趋势会造成反病毒工作更加困难。2004年1月27日,一种新型蠕虫病毒在企业电子邮件系统中传播,导致邮件数量暴增,从而阻塞网络。不同反病毒厂商将其命名为novarg、mydoom、sco炸弹、诺威格、小邮差变种等,该病毒采用的是病毒和垃圾邮件相结合的少见战术,不知情用户的推波助澜使得这种病毒的传播速度似乎比近来其他几种病毒的传播速度要快。三、运行方式和传播方式的隐蔽性微软安全中心发布的漏洞安全公告中ms04-028所提及的gdi+漏洞,危害等级被定为“严重”。在被计算机病毒感染的计算机中,你可能只看到一些常见的正常进程如svchost、taskmgr等,其实它是计算机病毒进程。四、利用操作系统漏洞传播操作系统是联系计算机用户和计算机系统的桥梁,也是计算机系统的核心,目前应用最为广泛的是windows系列的操作系统。随着dos操作系统使用率的减少,感染dos操作系统的计算机病毒也将退出历史舞台;随着windows操作系统使用率的增加,针对windows操作系统的计算机病毒将成为主流。五、计算机病毒技术与黑客技术将日益融合严格来说,木马和后门程序并不是计算机病毒,因为它们不能自我复制和扩散。但随着计算机病毒技术与黑客技术的发展,病毒编写者最终将会把这两种技术进行了融合。六、物质利益将成为推动计算机病毒发展的最大动力从计算机病毒的发展史来看,对技术的兴趣和爱好是计算机病毒发展的源动力。但越来越多的迹象表明,物质利益将成为推动计算机病毒发展的最大动力。如今,不少银行都提供网上验证或密码钥匙,用户千万不要只图节省费用而冒失去巨大资金风险。买密码钥匙或数字证书是相当必要的。第三节 计算机病毒的发展趋势对所有脚本类病毒发展的展望:随着网络的飞速发展,网络蠕虫病毒开始流行,而vbs脚本蠕虫则更加突出,不仅数量多,而且威力大。由于利用脚本编写病毒比较简单,除了将继续流行目前的vbs脚本病毒外,将会逐渐出现更多的其它脚本类病毒,譬如php,js,perl病毒等。但是脚本并不是真正病毒技术爱好者编写病毒的最佳工具,并且脚本病毒解除起来比较容易、相对容易防范。脚本病毒仍将继续流行,但是能够具有像爱虫、新欢乐时光那样大影响的脚本蠕虫病毒只是少数。计算机病毒的发展趋势:一、高频度病毒疫情发作的频率高。造成较大影响的计算机病毒达到百余种之多。恶性病毒的比例大,病毒对计算机用户的危害增大;二、传播速度快,危害面广由于网络的特征决定了国内计算机病毒几乎与国外病毒疫情同步爆发,且迅速大面积流行。目前对用户安全威胁最大的是恶性网络蠕虫病毒三、病毒制作技术新与传统的计算机病毒不同的是,许多新病毒是利用当前最新的编程语言与编程技术实现,易于修改以产生新的变种,从而逃避反病毒软件的搜索。例如“爱虫”病毒是用vbscript语言编写的,只要通过windows下自带的编辑软件修改病毒代码中的一部分,就能轻而易举地制造病毒变种,以躲避反病毒软件的追击。四、病毒形式多样化病毒呈现多样化的趋势。病毒分析显示,虽然新病毒不断产生,但较早的病毒发作仍很普遍,并向卡通图片、icq、oicq等方面发展。 此外,新的病毒更善于伪装,如主题会在传播中改变,许多病毒会伪装成常用程序,或者将病毒代码写入文件内部长度而不发生变化,用来麻痹计算机用户。五、病毒生成工具以往计算机病毒都是编程高手制作的,编写病毒显示自己的技术。“库尔尼科娃”病毒的设计者只是修改下载的vbs蠕虫孵化器,“库尔尼科娃”病毒就诞生了。据报道,vbs蠕虫孵化器被人们下载了十五万次以上。由于这类工具在网络上可以很容易地获得,使得现在新病毒出现的频率超出以往任何时候。 第二章 计算机病毒概述 第一节计算机病毒的定义 计算机病毒(computer virus)是一种人为的制造的、能够进行自我复制的、具有对计算机资源破坏作用的一组程序或指令的集合。这是计算机病毒的广义定义。类似生物病毒,它能把自身附着在各种类型的文件上或寄生在存储媒介中,能对付计算机系统和网络进行各种破坏,同时有独特的复制能力和传染性,能够自我复制主动传染;另一方面,当文件被复制或在网络中从一个用户送到另一个用户时被动传染,他们就随同文件一起蔓延开来。在1994年2月18日公布的中华人民共和国计算机信息系统安全保护条例中,计算机病毒被定义为:“计算机病毒是指编制或者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够字我复制的一组计算机指令或者程序代码”。这一定义具有一定的法律性和权威性。是对计算机病毒的狭义定义 。第二节 计算机病毒基本性质与本质计算机病毒种类繁多,特征各异,其中主要的有:自我复制能力;很强的感染性;一定的潜伏性;特定的触发性;很大的破坏性。一、计算机病毒的可执行性(程序性)程序性是计算机病毒的基本特征,也是计算机病毒最基本的一种表现形式。程序性也就决定了计算机病毒的可防治性、可清除性。计算机病毒程序与其他合法程序一样,是一段可执行的程序,但他不是一个完整的程序,而是寄生在其他可执行程序上的一段程序,因此他享有一切可执行程序所能得到的权力。计算机的控制权是关键问题。反病毒技术就是要提前取得计算机系统的控制权,识别出计算机病毒的代码和行为,阻止起取得系统控制权,并及时将其清除。二、计算机病毒的传染性病毒一次源于生物学,传染也相应成了计算机病毒最基本的特性。计算机病毒的传染性是指病毒具有把自身复制到其他程序的能力。在生物界,病毒通过传染从一个生物体扩散到另一个生物体。在适当的条件下,他可得到大量的繁殖,并使被感染的生物体表现出病症甚至死亡。同样,计算机病毒也会通过各种渠道通过已被感染的计算机扩散到未被感染的计算机,在某些情况下造成被感染的计算机工作失常甚至瘫痪。是否具有传染性,是判断一个程序是否为计算机病毒的首要条件。传染性也决定了计算机病毒的可判断性。三、计算机病毒的非授权性计算机病毒未经授权而执行。正常的程序是由用户调用,再由系统分配资源,完成用户交给的任务,其目的对用户是可见的、透明的。而病毒隐藏在正常程序中,窃取正常程序的系统控制权,其目的对用户是未知的,是未经用户允许的。四、计算机病毒的隐蔽性计算机病毒通常附在正常程序中或磁盘较隐蔽的地方,也有个别的以隐含文件的形式出现,目的是不让用户发现他的存在。如果不经过代码分析,病毒程序与正常程序是不容易区分开来的,而一旦病毒发作表现出来,往往已经给计算机系统造成了不同程度破坏。正是由于隐蔽性,计算机病毒得以在用户没有察觉的情况下扩散并游离与世界上的百万台计算机中。计算机病毒的隐蔽性通常表现在以下两个方面:(一)传染的隐蔽性。大多数病毒的代码设计得非常精巧而又短小,一般只有几百字节到几k,而pc对文件的存取速度非常快,所以病毒会在转瞬之间便可将这些病毒程序附着在正常文件之上,一般不具有外部表象,不易被人发现。(二) 病毒程序存在的隐蔽性。病毒程序通常以隐蔽的方式存在,且被病毒感染的计算机在多数情况下仍能维持起部分功能,不回因为感染上病毒而使整台计算机不能使用。计算机病毒设计的精巧之处也在这里。五、计算机病毒的潜伏性一个编制精巧的计算机病毒程序,进入系统之后一般不会马上发作。潜伏性越好,其在系统中的存在时间就会越长,病毒的传染范围就会越大。潜伏性通常表现以下两个方面:(一) 病毒程序不用专门的检测程序是检查不出来的,一旦得到运行机会就繁殖、扩散,继续为害。(二) 计算机病毒中往往有一种触发机制,不满足触发条件时,计算机病毒除了传染外不做其他的破坏,只有当触发条件满足时,才会激活病毒的发作模块而出现中毒的症状。六、计算机病毒的可触发性计算机病毒因某个事件或数值的出现,诱使病毒实施感染或进行攻击的特性,称为可触发性。为了隐蔽自己,病毒必须潜伏,少做动作。如果完全不做动作,病毒既不能感染也不能进行破坏,失去杀伤力。病毒既要隐蔽又要维持杀伤力,就必须具有可触发性。病毒的触发机制是用来控制感染和破坏动作的频率的。病毒的触发机制越多,则传染性越强。七、计算机病毒的破坏性所有的计算机病毒都是一种可执行的程序,而这一可执行程序又必然要运行,因此,所有的计算机病毒都对计算机系统造成不同程度的影响,轻这降低计算机系统工作效率、占用系统资源,重者导致数据丢失、系统崩溃。计算机病毒的破坏性,决定了病毒的危害性。八、计算机病毒的寄生性病毒程序嵌入到宿主程序中,依赖与宿主程序的执行而生存,这就是计算机病毒的寄生性。病毒程序在侵入到宿主程序中后,一般对宿主程序进行一定的修改,宿主程序一旦执行,病毒程序就被激活,从而可以进行自我复制和繁衍。九、计算机病毒的诱惑欺骗性某些病毒常以某种特殊的表现方式,引诱、欺骗用户不自觉的触发、激活病毒,从而实施起感染、破坏功能。如情书变种病毒之一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”。 第三章 windows病毒第一节 windows病毒分类一、pe病毒win32可执行文件,如*.exe、*.dll、*.ocx等,都是pe格式文件。感染pe格式文件的win32病毒,简称pe病毒。在绝大多数病毒爱好者中,真正的病毒技术在pe病毒中才会得到真正的体现。pe病毒同时也是所有病毒中数量极多、破坏性极大、技巧性最强的一类病毒。二、脚本病毒脚本(script)病毒是以脚本程序语言(如vb script、javascript、php)编写而成的病毒。脚本病毒编写比较简单,并且编写的病毒具有传播快、破坏力大等特点。例如,爱虫病毒、新欢乐时光病毒等。就都是用vbs(vb script)编写的,被称做vbs脚本病毒。但脚本病毒必须透过microsoft的wsh(windows scripting host)才能够启动执行以及感染其他文件。三、宏病毒宏病毒是单独的一类病毒,因为它与传统的病毒有很大的不同,他不感染.exe、.com等可执行文件,而是将病毒代码以“宏”的形式潜伏在microsoft office文档中,当采用office软件打开这些染毒文件时,这些代码就会被执行并产生破坏作用。由于“宏”是使用vba(visual basic for application)这样的高级代码写的,因此其编写过程相对来说比较简单,而功能又十分强大。宏病毒的产生标志着制造病毒不再是专业程序员的专利,任何人只要掌握一些基本的“宏”编写技巧即可编写出破坏力极大的宏病毒。随着微软office软件在全世界的不断普及,宏病毒成为传播最广泛、危害最大的一类病毒。第二节 pe病毒原理一、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 n1、dos小程序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”之类信息的小程序。2、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文件)。(1) signature dd ?字串“50450000”标志着nt映像头的开始,也是pe文件中与windows有关内容的开始。他的位置是在dos程序头中的偏移3ch处的4个字节给出的。(2) 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对于学习病毒是需要重点关注的。(3) 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需要重点关注的。二、检验pe文件的有效性检验pe文件的有效性对于有效地感染文件起着非常大的作用,因为只有在清楚了需要被感染的病毒文件是有效的pe文件时,才可以感染并且达到效果。如何才能校验指定文件是否为一有效pe文件呢? 这个问题很难回答,完全取决于想要的精准程度。可以检验pe文件格式里的各个数据结构,或者仅校验一些关键数据结构。大多数情况下,没有必要校验文件里的每一个数据结构,只要一些关键数据结构有效,我们就认为是有效的pe文件了。(一)校验程序流程1、先检验文件头部第一个字的值是否等于 image_dos_signature (5a4dh,即mz),是则 dos mz header 有效。 2、os mz header 有效后,就可用e_lfanew(3ch处来)来定位 pe header 了。 3、header 的第一个字的值是否等于 image_nt_header (4550h,即pe)。如果前后两个值都匹配,那我们就认为该文件是一个有效的pe文件。(二)校验程序核心部分代码的实现如下:1、已经指向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 。2、位到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 .endif三、病毒重定位(一)为什么要重定位病毒首先第一步就需要重定位,那到底为什么要重定位呢?我们在写正常程序的时候根本不用去关心变量(常量)的位置,因为源程序在编译的时候它的内存中的位置都被计算好了。程序装入内存时,系统不会为它重定位。编程时我们需要用到变量(常量)的时候直接用变量名访问(编译后就是通过偏移地址访问)就行了。同时,病毒不可避免也要用到变量(常量),当病毒感染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)1、语句执行之后,堆栈顶端为relocate在内存中的真正地址。2、句将relocate在内存中的真正地址存放在ebp寄存器中。3、在内存中的真实地址。当pop语句执行完之后,ebp中放的是什么值呢?很明显是病毒程序中标号relocate在内存中的真正地址。如果病毒程序中有一个变量var,那么该变量实际在内存中的地址应该是ebp+(offset var-offset relocate),即参考量relocate在内存中的地址+其它变量与参考量之间的距离=其它变量在内存中的真正地址。有时候我们也采用(ebp-offset relocate)+offset var的形式进行变量var的重定位。还有一些其它重定位的方法,但是它们的基本原理都是一样的。四、获取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. (1)将堆栈顶端的数据赋给ecx。(2) 逐字节比较验证,也可以一页一页地搜。(3)就是ecx+3ch(比较方式类似判断pe文件的有效性第一步思想一致)。(4)dos header+stub值不会太大,不可能超过4096byte。(5)看image_base值是否等于ecx即模块起始值。(6)如果是,就认为找到kernel32的base值。2、利用kerner32基地址来获取api函数地址在参照了引出表结构之后,那么获得api函数地址的方法就不理解了。(1)引出表的结构定义如下: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,该目录表的第一个数据目录就存放了导出表结构的地址。(2)api函数名称利用kernel32 base来获取函数地址的方法定位到pe文件头。从pe文件头中的可选文件头中取出数据目录表的第一个数据目录,得到导出表的地址。从导出表的numberofnames字段得到以命名函数的总数,并以这个数字做微循环的次数来构造一个循环。从addressofnames字段指向的函数名称地址表的第一项开始,在循环中将每一项定义的函数名与要查找的函数名比较,如果没有任何一个函数名符合,说明文件中没有指定名称的函数。如果某一项定义的函数名与要查找的函数名符合,那么记住这个函数名在字符串地址表中的索引值(如x),然后在addressofnameordinals指向的数组中以同样的索引值x去找数组项中的值,假如该值为m。以m值作为索引值,在addressoffunctions字段指向的函数入口地址表中获取的rva就是函数的入口地址,当函数被装入内存后,这个rva值加上模块实际装入的基址(imagebase),就得到了函数真正的入口地址。对于病毒来说,通常是通过api函数名称来查找api函数地址。五、文件操作(一)件搜索1、件搜索函数搜索文件是病毒寻找目标文件的非常重要的功能。在win32汇编中,通常采用三个api函数进行文件搜索。(1)dfirstfile 该函数根据文件名查找文件。(2)dnextfile 该函数根据调用findfirstfile函数时指定的一个文件名查找下一个文件。(3)dclose 该函数用来关闭由findfirstfile函数创建的一个搜索句柄。2、件搜索算法文件搜索一般采用递归算法进行搜索,也可以采用非递归搜索方法,这里我们仅介绍递归的算法findfile proc(1)到的目录为当前工作目录。(2)文件(*.*)。(3)搜索完毕?是则返回,否则继续。(4)件还是目录?是目录则调用自身函数findfile,否则继续。(5)如符合感染条件,则调用感染模块,否则继续。(6)搜索下一个文件(findnextfile),转到继续。findfile endp(一) 内存映射文件内存映射文件提供了一组独立的函数,是应用程序能够通过内存指针像访问内存一样对磁盘上的文件进行访问。这组内存映射文件函数将磁盘上的文件的全部或者部分映射到进程虚拟地址空间的某个位置,以后对文件内容的访问就如同在该地址区域内直接对内存访问一样简单。这样,对文件中数据的操作便是直接对内存进行操作,大大地提高了访问的速度,这对于计算机病毒来说,对减少资源占有是非常重要的。1、内存映射文件函数(1)createfilemapping该函数用来创建一个新的文件映射对象。(2)mapviewoffile 该函数将一个文件映射对象映射到当前应用程序的地址空间。(3)unmapviewoffile 该函数在当前应用程序的内存地址空间解除对一个文件映射对象的映射。(4)closehandle 该函数用来关闭一个内核对象,其中包括文件、文件映射、进程、线程、安全和同步对象等。2、内存映射文件方法在计算机病毒中,通常采用如下几个步骤:(1)调用createfile函数打开想要映射的host程序,返回文件句柄hfile。(2)调用createfilemapping函数生成一个建立基于host文件句柄hfile的内存映射对象,返回内存映射对象句柄hmap。(3)调用mapviewoffile函数将整个文件(一般还要加上病毒体的大小)映射到内存中。得到指向映射到内存的第一个字节的指针(pmem)。(4)用刚才得到的指针pmem对整个host文件进行操作,对host程序进行病毒感染。(5)调用unmapviewfile函数解除文件映射,传入参数是pmem。(6)调用closehandle来关闭内存映射文件,传入参数是hmap。(7)调用closehandle来关闭host文件,传入参数是hfile。(二)感染pe文件1、文件感染操作相关函数(1)create

温馨提示

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

评论

0/150

提交评论