杀毒软件技术的探讨与实现论文_第1页
杀毒软件技术的探讨与实现论文_第2页
杀毒软件技术的探讨与实现论文_第3页
杀毒软件技术的探讨与实现论文_第4页
杀毒软件技术的探讨与实现论文_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

目录一概述 1(一)特征代码法 3(二)校验和法 4(三)行为监测法 5(四)软件模拟法 6二开发工具概述 6(一)汇编语言概述 6(二)汇编语言和高级语言的比较 7三系统设计思想 8四程序设计过程详解 9(一)主要实现功能 9(二)程序总体流程图 10(三)程序设计说明 101过程scan 112过程search 123过程clrscr 134过程sort_name 135过程print 13(四)软件操作说明 13五程序的运行和测试 16(一)程序实现的算法 16(二)程序功能的实现 17六程序开发总结析 17致谢 18参考文献 18杀毒软件技术的探讨与实现摘要:随着因特网的快速发展,计算机网络已经渗透到社会的各个领域,网上的计算机病毒和病毒技术也越来越泛滥。如何防治计算机病毒已经成为全球性的话题。本论文就是基于这个背景来设计和开发的。其主要是模拟杀毒软件对磁盘文件的扫描过程,由用户提供指定待扫描的磁盘分区或文件,然后模拟杀毒软件引擎对磁盘进行扫描,采用传统的基于特征码(病毒特征库)的静态扫描技术。本程序中的磁盘扫描匹配的核心部分用汇编语言实现,界面的设计用win32编程机制是实现。程序的主要特点是以尽可能简洁、高效的汇编代码完成模拟杀毒软件对磁盘的扫描过程。关键词:静态扫描技术;模拟杀毒;汇编语言;win32TheDiscussandImplementationofkillvirussoftware

Abstract:AsthefastdevelopmentofInternet,computervirushaspermeatedintovariousaspectsofsociety.Thecomputervirusintheinternetandvirustechniquebecomesmoreandmoreoverflow.Howtocontrolcomputervirushasbecomeaworldwidetheme.Thethesisdesignanddevelopasystembasedonthis.Themainpointeristosimulatetheprogressofkillvirussoftwarescanthedisk’sfile.First,theuserofferthediskpartitionandthefile,then,thesystemscanthedisksimulatesthekillvirusengine.Thesystemusedtraditionstaticscantechniquebasedonviruscharacterbase.Thesystemusedassemblelanguagetoimplementthecoreoftheprogram,thedesignofinterfaceisimplementedbasedonwin32.Thekeyfeatureofthesystemissimpleandhighefficiency.KeyWords:Staticscantechnique;Simulatesthekillvirusengine;Assemblelanguage;Win32PAGE18一概述 人类进入了信息社会创造了智能机器(电子计算机),同时也创造了机器(电子计算机)病毒,福祸同降。人类在信息社会更容易与机器(电子计算机)融为一个整体,可是,破坏这个整体的一个方面将是机器病毒(计算机病毒),人类同时在与生物病毒作斗争时又要与机器病毒作斗争,这是人类在方便自己时也在为难自己。

从一九八三年计算机病毒首次被确认以来,并没有引起人们的重视。直到一九八七年计算机病毒才开使受到世界范围内的普遍重视。我国于一九八九年在计算机界发现病毒。至今,全世界已发现近数万种病毒,并且还在高速度的增加。

由于计算机软件的脆弱性与互联网的开放性,我们将与病毒长久共存。而且,病毒主要朝着能更好的隐蔽自己并对抗反病毒手段的方向发展。同时,病毒已被人们利用其特有的性质与其他功能相结合进行有目的的活动。随着计算机及通信技术的飞速发展,计算机网络已经渗透到社会经济的各个领域,但自从1988年发生在美国的“蠕虫病毒”事件后计算机病毒的攻击事件不断出现。开始阶段病毒传播主要是靠非法的程序和数据拷贝,随着网络的普及,互联网成为计算机病毒最好的载体,据统计病毒通过网页、邮件、漏洞等网络手段进行传播的网络型病毒已经占据了发作病毒的主流,占所有病毒总数的68%。随着病毒技术与黑客技术的发展,混合型病毒越来越多,集合了蠕虫、后门等功能,危害更大。可以看到,计算机一旦感染病毒,降低工作效率,占用磁盘空间,影响网络传输速度,重要数据和信息的破坏、丢失,计算机系统崩溃,极大地影响计算机的使用效率。鉴于此,病毒的检测和预防技术在保护网络安全、节约系统资源、降低经济损失、节省用户的精力和时间方面起着突出的作用。病毒是一段程序,不同种类的病毒,它们的代码千差万别,任何人都不可能预测明天将会出现什么新病毒。但有一点可以肯定,只要出现了一项新的计算机技术,充分利用这项新技术编制的新病毒就一定离我们不远了。而由于软件种类极其丰富,且某些正常程序也使用了类似病毒的操作甚至借鉴了某些病毒的技术。所以,虽然有些人利用病毒某些共有的操作(如驻内存,改中断)这种共性,制作了声称可查所有病毒的程序,但这种方法对病毒进行检测势必会造成较多的误报情况,不够可靠,目前都只能作为辅助的手段配合使用,无法独立推广。实际上,计算机病毒学鼻祖早在80年代初期就已经提出了计算机病毒的模型,证明只要延用现行的计算机体系,计算机病毒就存在“不可判定性”。杀病毒必须先搜集到病毒样本,使其成为已知病毒,然后剖析病毒,再将病毒传染的过程准确地颠倒过来,使被感染的计算机恢复原状。因此可以看出,一方面计算机病毒是不可灭绝的,另一方面病毒也并不可怕,世界上没有杀不掉的病毒。常用的反病毒软件技术如下:特征码技术:基于对已知病毒分析、查解的反病毒技术。目前的大多数杀病毒软件采用的方法主要是特征码查毒方案与人工解毒并行,亦即在查病毒时采用特征码查毒,在杀病毒时采用人工编制解毒代码。特征码查毒方案实际上是人工查毒经验的简单表述,它再现了人工辨识病毒的一般方法,采用了“同一病毒或同类病毒的某一部分代码相同”的原理,也就是说,如果病毒及其变种、变形病毒具有同一性,则可以对这种同一性进行描述,并通过对程序体与描述结果(亦即“特征码”)进行比较来查找病毒。而并非所有病毒都可以描述其特征码,很多病毒都是难以描述甚至无法用特征码进行描述。使用特征码技术需要实现一些补充功能,例如近来的压缩包、压缩可执行文件自动查杀技术。但是,特征码查毒方案也具有极大的局限性。特征码的描述取决于人的主观因素,从长达数千字节的病毒体中撷取十余字节的病毒特征码,需要对病毒进行跟踪、反汇编以及其它分析,如果病毒本身具有反跟踪技术和变形、解码技术,那么跟踪和反汇编以获取特征码的情况将变得极其复杂。此外,要撷取一个病毒的特征码,必然要获取该病毒的样本,再由于对特征码的描述各个不同,特征码方法在国际上很难得到广域性支持。特征码查病毒主要的技术缺陷表现在较大的误查和误报上,而杀病毒技术又导致了反病毒软件的技术迟滞。虚拟机技术:启发式探测未知病毒的反病毒技术。虚拟机技术的主要作用是能够运行一定规则的描述语言。由于病毒的最终判定准则是其复制传染性,而这个标准是不易被使用和实现的,如果病毒已经传染了才判定是它是病毒,定会给病毒的清除带来麻烦。那么检查病毒用什么方法呢?客观地说,在各类病毒检查方法中,特征值方法是适用范围最宽、速度最快、最简单、最有效的方法。但由于其本身的缺陷问题,它只适用于已知病毒,对于未知病毒,如果能够让病毒在控制下先运行一段时间,让其自己还原,那么,问题就会相对明了。可以说,虚拟机是这种情况下的最佳选择。虚拟机在反病毒软件中应用范围广,并成为目前反病毒软件的一个趋势。一个比较完整的虚拟机,不仅能够识别新的未知病毒,而且能够清除未知病毒,我们会发现这个反病毒工具不再是一个程序,而成为可以和卡斯帕罗夫抗衡的IBM深蓝超级计算机。首先,虚拟机必须提供足够的虚拟,以完成或将近完成病毒的“虚拟传染”;其次,尽管根据病毒定义而确立的“传染”标准是明确的,但是,这个标准假如能够实施,它在判定病毒的标准上仍然会有问题;第三,假如上一步能够通过,那么,我们必须检测并确认所谓“感染”的文件确实感染的就是这个病毒或其变形。目前虚拟机的处理对象主要是文件型病毒。对于引导型病毒、word/excel宏病毒、木马程序在理论上都是可以通过虚拟机来处理的,但目前的实现水平仍相距甚远。就像病毒编码变形使得传统特征值方法失效一样,针对虚拟机的新病毒可以轻易使得虚拟机失效。虽然虚拟机也会在实践中不断得到发展。但是,pc的计算能力有限,反病毒软件的制造成本也有限,而病毒的发展可以说是无限的。让虚拟技术获得更加实际的功效,甚至要以此为基础来清除未知病毒,其难度相当大。经过我们一段时间的调查研究,资料搜集分析并结合目前所使用的病毒软件的状况,我们发现现有软件虽然具有查找功能,但是在速度和对未知病毒的检测上存在一定的缺陷。随着计算机技术的普及,计算机病毒数量和种类日益增多,早期的反病毒软件只是针对个别的计算机病毒,反病毒软件采用的基本检测原理是静态的特征码匹配技术,早期反病毒软件的程序与检测所需的数据是紧密偶合的,随着病毒数量的增多,反病毒软件逐渐演化为检测程序与特征码数据库相互独立的形式,依赖于特定数据集合上的一组用于计算机病毒检测和清除的程序序列被称为计算机病毒检测引擎,而这个特定的数据集合就是由反病毒专家建立的病毒特征码数据库,目前存在两种趋势:1)计算机病毒数量急剧增多,多数厂家的病毒特征码库超过3万条检测记录;2)软件系统规模变大,系统软件与众多的应用软件的文件数量巨增"这些都对反病毒软件的检测效率提出了“挑战提高病毒检测引擎的检测效率最常见的方法就是改良检测算法,使算法的时间复杂度与特征码库中记录数呈非线形关系”。现有的病毒检测、预防技术大多数是基于静态的特征匹配方式,有效且可靠性高,但是对加密、变形的新一代病毒无能为力;静态广谱特征扫描技术,可以检测变形病毒,但误报率高,且易造成文件和数据的破坏;实时监控和虚拟机技术能主动防毒,阻止计算机病毒进入系统内存或阻止计算机病毒对磁盘的操作,但仍没有脱离特征码扫描,使得查毒速度降低,驻留内存模块易产生误报,且不能及时地检测变种和未知病毒;针对病毒检测速度总是落后于病毒生成速度,通过查阅资料得知可变推理机技术,其优点是能检测变种和未知病毒,尤其针对现在较难查杀的具有蠕虫和黑客程序功能的病毒。对比一些病毒检测方法的优缺点如下:(一)特征代码法特征代码法被早期应用于SCAN、CPAV等著名病毒检测工具中。国外专家认为特征代码法是检测已知病毒的最简单、开销最小的方法。特征代码法的实现步骤如下:集已知病毒样本,病毒如果既感染COM文件,又感染EXE文件,对这种病毒要同时采集COM型病毒样本和EXE型病毒样本。在病毒样本中,抽取特征代码。依据如下原则:抽取的代码比较特殊,不大可能与普通正常程序代码吻合。抽取的代码要适当长度,一方面维持特征代码的唯一性,另一方面又不要有太大的空间与时间的开销。如果一种病毒的特征代码增长一个字节,要检测3000种病毒,增加的空间就是3000字节。在保持唯一性的前提下,尽量使特征代码长度短些,以减少空间与时间开销。在既感染COM文件又感染EXE文件的病毒样本中,要抽取两种样本共有的代码。将特征代码纳入病毒数据库。打开被检测文件,在文件中搜索,检查文件中是否含有病毒数据库中的病毒特征代码。如果发现病毒特征代码,由于特征代码与病毒一一对应,便可以断定,被查文件中患有何种病毒。采用病毒特征代码法的检测工具,面对不断出现的新病毒,必须不断更新版本,否则检测工具便会老化,逐渐失去实用价值。病毒特征代码法对从未见过的新病毒,自然无法知道其特征代码,因而无法去检测这些新病毒。特征代码法的优点是:检测准确快速、可识别病毒的名称、误报警率低、依据检测结果,可做解毒处理。其缺点是:不能检测未知病毒、搜集已知病毒的特征代码,费用开销大、在网络上效率低(在网络服务器上,因长时间检索会使整个网络性能变坏)。其特点:1)速度慢。随着病毒种类的增多,检索时间变长。如果检索5000种病毒,必须对5000个病毒特征代码逐一检查。如果病毒种数再增加,检病毒的时间开销就变得十分可观。此类工具检测的高速性,将变得日益困难。2)误报警率低。3)不能检查多形性病毒。特征代码法是不可能检测多态性病毒的。国外专家认为多态性病毒是病毒特征代码法的索命者。4)不能对付隐蔽性病毒。隐蔽性病毒如果先进驻内存,后运行病毒检测工具,隐蔽性病毒能先于检测工具,将被查文件中的病毒代码剥去,检测工具的确是在检查一个虚假的“好文件”,而不能报警,被隐蔽性病毒所蒙骗。(二)校验和法将正常文件的内容,计算其校验和,将该校验和写入文件中或写入别的文件中保存。在文件使用过程中,定期地或每次使用文件前,检查文件现在内容算出的校验和与原来保存的校验和是否一致,因而可以发现文件是否感染,这种方法叫校验和法,它既可发现已知病毒又可发现未知病毒。在SCAN和CPAV工具的后期版本中除了病毒特征代码法之外,还纳入校验和法,以提高其检测能力。这种方法既能发现已知病毒,也能发现未知病毒,但是,它不能识别病毒类,不能报出病毒名称。由于病毒感染并非文件内容改变的唯一的非他性原因,文件内容的改变有可能是正常程序引起的,所以校验和法常常误报警。而且此种方法也会影响文件的运行速度。病毒感染的确会引起文件内容变化,但是校验和法对文件内容的变化太敏感,又不能区分正常程序引起的变动,而频繁报警。用监视文件的校验和来检测病毒,不是最好的方法。这种方法遇到下述情况:已有软件版更新、变更口令、修改运行参数、校验和法都会误报警。校验和法对隐蔽性病毒无效。隐蔽性病毒进驻内存后,会自动剥去染毒程序中的病毒代码,使校验和法受骗,对一个有毒文件算出正常校验和。运用校验和法查病毒采用三种方式:1)在检测病毒工具中纳入校验和法,对被查的对象文件计算其正常状态的校验和,将校验和值写入被查文件中或检测工具中,而后进行比较。2)在应用程序中,放入校验和法自我检查功能,将文件正常状态的校验和写入文件本身中,每当应用程序启动时,比较现行校验和与原校验和值。实现应用程序的自检测。3)将校验和检查程序常驻内存,每当应用程序开始运行时,自动比较检查应用程序内部或别的文件中预先保存的校验和。校验和法的优点是:方法简单且能发现未知病毒、被查文件的细微变化也能发现。其缺点是:发布通行记录正常态的校验和、会误报警、不能识别病毒名称、不能对付隐蔽型病毒。(三)行为监测法利用病毒的特有行为特征性来监测病毒的方法,称为行为监测法。通过对病毒多年的观察、研究,有一些行为是病毒的共同行为,而且比较特殊。在正常程序中,这些行为比较罕见。当程序运行时,监视其行为,如果发现了病毒行为,立即报警。这些作为监测病毒的行为特征如下:1)占有INT13H所有的引导型病毒,都攻击Boot扇区或主引导扇区。系统启动时,当Boot扇区或主引导扇区获得执行权时,系统刚刚开工。一般引导型病毒都会占用INT13H功能,因为其他系统功能未设置好,无法利用。引导型病毒占据INT13H功能,在其中放置病毒所需的代码。2)改DOS系统为数据区的内存总量病毒常驻内存后,为了防止DOS系统将其覆盖,必须修改系统内存总量。3)对COM、EXE文件做写入动作病毒要感染,必须写COM、EXE文件。4)病毒程序与宿主程序的切换染毒程序运行中,先运行病毒,而后执行宿主程序。在两者切换时,有许多特征行为。行为监测法的长处:可发现未知病毒、可相当准确地预报未知的多数病毒。行为监测法的短处:可能误报警、不能识别病毒名称、实现时有一定难度。(四)软件模拟法多态性病毒每次感染都变化其病毒密码,对付这种病毒,特征代码法失效。因为多态性病毒代码实施密码化,而且每次所用密钥不同,把染毒的病毒代码相互比较,也无法找出相同的可能作为特征的稳定代码。虽然行为检测法可以检测多态性病毒,但是在检测出病毒后,因为不知病毒的种类,难于做消毒处理。结合我们目前的现有条件设备,并根据现有软件所使用的开发软件,我们采用了汇编语言和WIN32开发工具,设计开发了《模拟杀毒软件对磁盘进行扫描》,开发编写模拟病毒扫描程序,能对选择的磁盘文件进行扫描。动态显示扫描过程(文件路径、文件个数、找到的文件个数)。扫描结果存入文件(扫描过的文件个数、找到的文件列表)。显示结果文件内容。等几个小模块,下面我们将分四章详细介绍相关的情况,第二章介绍有关开发工具的情况;第三章将详细介绍本系统的总体设计思路;第四章详细介绍各功能模块的设计思路和设计方法及过程;第五章是对系统测试;第六章是对系统开发的总解析。二开发工具概述(一)汇编语言概述汇编语言(AssemblyLanguage)是面向机器的程序设计语言。汇编语言是计算机系统提供给用户的最快、最有效的语言,也是能对硬件直接编程的语言。因此,对空间和时间要求很高的程序,或需要直接控制硬件的程序,必须使用汇编语言进行程序设计。在汇编语合中,用助记符(Memoir)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。使用汇编语言编写的程序,机器能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编语言比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。汇编语言由于采用了助记符号来编写程序,比机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。汇编语言的特点是用符号代替了机器指令代码,而且助记符与指令代码一一对应,基本保留了机器语言的灵活性。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。汇编语言是面向具体机型的,它离不开具体计算机的指令系统,因此,对于不同型号的计算机,有着不同结构的汇编语言,而且,对于同一问题所编制的汇编语言程序在不同种类的计算机间是互不相通的。汇编语言中由于使用了助记符号,用汇编语言编制的程序输入计算机,计算机不能用机器语言编写的程序一样直接识别和执行,必须通过预先放入计算机的“汇编程序”的加工和翻译,才能变成能够被计算机识别和处理的二进制代码程序。用汇编语言等非机器语言书写好的符号程序称为源程序,运行时汇编程序要将源程序翻译成目标程序。目标程序是机器语言,它一经被安置在内存的预定位置上,就能被计算机的CPU处理和执行。汇编语言像机器指令一样,是硬件操的控制信息,因而仍然是面向机器的语言,使用起来还是比较繁琐时,通用性也差。但是,汇编语言用来编制系统软件和过程控制软件,其目标程序占用的内存空间少,运行速度快,有着高级语言不可替代的用途。(二)汇编语言和高级语言的比较汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的操作用命令的形式写出来。汇编程序通常由三部分组成:指令、伪指令和宏指令。汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作,例如移动、自增,因此汇编源程序一般比较冗长、复杂、容易出错,而且使用汇编语言编程需要有更多的计算机专业知识,但汇编语言的优点也是显而易见的,用汇编语言所能完成的操作不是一般高级语言所能实现的,而且源程序经汇编生成的可执行文件不仅比较小,而且执行速度很快。高级语言是目前绝大多数编程者的选择。和汇编语言相比,它不但将许多相关的机器指令合成为单条指令,并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,这样就大大简化了程序中的指令。同时,由于省略了很多细节,编程者也就不需要有太多的专业知识。高级语言主要是相对于汇编语言而言,它并不是特指某一种具体的语言,而是包括了很多编程语言,如目前流行的VB、VC、FoxPro、Delphi等,这些语言的语法、命令格式都各不相同。高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行,按转换方式可将它们分为两类:解释类:执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但这种方式比较灵活,可以动态地调整、修改应用程序。编译类:编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(*.OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。现在大多数的编程语言都是编译型的,例如VisualC++、VisualFoxPro、Delphi等。汇编语言与处理器密切相关。每种处理器都有自己的指令系统,相应的汇编语言各不相同。所以,汇编语言程序的通用性、可移植性较差。相对来说,高级语言与具体计算机无关,高级语言程序可以在多种计算机上编译后执行。汇编语言功能有限,又涉及寄存器、主存单元等硬件细节,所以编写程序比较繁琐,调试起来也比较困难。高级语言提供了强大的功能,采用类似自然语言的语法,所以容易被掌握和应用,它不必关心诸如标志、堆栈等琐碎问题。汇编语言本质上就是机器语言,它可以直接、有效地控制计算机硬件,因而容易产生运行速度快、指令序列短小的高效率目标程序。高级语言不易直接控制计算机的各种操作,编译程序产生的目标程序往往比较庞大、程序难以优化,所以运行速度较慢。

可见汇编语言的主要优点就是可以直接控制计算机硬件部件,可以编写在“时间”和“空间”两方面最有效的程序。这些优点使得汇编语言在程序设计中占有重要的位置,是不可被取代的。汇编语言的缺点也是明显的。它与处理器密切有关,要求程序员比较熟悉计算机硬件系统、考虑许多细节问题,导致编写程序繁琐,调试、维护、交流和移植困难。因此,有时可以采用高级语言和汇编语言混合编程的方法,互相取长补短,更好地解决实际问题。三系统设计思想由于模拟杀毒软件对磁盘文件的扫描过程,重点是杀毒软件的杀毒引擎。在模拟杀毒软件引擎对磁盘进行扫描过程中,主要采用传统的基于特征码(病毒特征库)的静态扫描技术,即在文件中寻找特定十六进制串,如果找到,就可判定文件感染了某种病毒,暂不采用启发式扫描等更先进更复杂的技术。而且,由于现代PC磁盘上文件格式多种多样,特别是各种压缩的音频、视频文件非常多,其中涉及多媒体中的数据编码和压缩解压缩算法,如果对各种文件格式都进行匹配扫描,会使程序的复杂度和规模急剧增大,鉴于此,在不失去对杀毒引擎扫描磁盘过程的模拟的大前提下,对非二进制文件只进行简单的基于文件名的查找,而对二进制文件则进行类似病毒的模式匹配。编写模拟病毒扫描程序,能对选择的磁盘文件进行扫描。动态显示扫描过程(文件路径、文件个数、找到的文件个数)。扫描结果存入文件(扫描过的文件个数、找到的文件列表)。显示结果文件内容。程序主要是利用DOS中断功能调用,对选定的磁盘分区进行扫描查找,如果查找到匹配文件且符合程序中的预置条件(即待查找的文件名为*.txt),则利用病毒库文件中的各个病毒对匹配文件进行查找(其中对文件的访问采用的代号式磁盘存取方式),如果文件中包含病毒,则删除文件,若不含病毒,不作处理;如果只是普通的文件或者磁盘分区扫描(即程序中的预置条件不符合),则打印输出文件的完整路径。在利用DOS中断功能调用对磁盘扫描或者对用户指定的文件进行查找时,最开始是从用户选择的磁盘分区根目录开始查找的,查找完根目录中的所有文件和文件夹后,要对根目录的第一个文件夹内容进行递归查找,然后进一步进入到根目录第一个文件夹中的第一个文件夹进行查找,直到根目录第一个文件夹的最内层文件,然后递归逐层返回,这样根目录的第一个文件夹查找完毕;然后是根目录中的下一个文件夹递归查找……直到根目录中的所有文件夹被查找一遍,则所选磁盘分区查找完毕,每查找到一个匹配文件就输出文件的完整路径。其实对选定磁盘分区进行扫描和对用户指定文件进行查找所采用的实现思想和DOS中断功能调用都是一样的,只是磁盘扫描时使用的是程序预置的通配符文件名*.*而文件查找时使用的是用户输入的文件名。也就是说磁盘扫描时由于使用的是通配符文件名所有的文件都是匹配的,所以选定分区上的所有文件和文件夹都将被扫描到且显示完整路径;而在文件查找中,使用的是用户输入的文件名,所以只有和输入的文件名匹配的文件及文件夹才会被认为匹配并显示路径。在整个程序中,使用通配符*代表任意多个字符(包括0个),通配符?代表任意一个字符。当用户指定的待查找的文件名为*.txt时(程序中假设病毒只存在于txt文件中,如此是为了免去对复杂的音视频文件的处理,因为此程序的目的就是简单模拟早期病毒扫描程序的病毒扫描过程),需对查找到的匹配文件用病毒库中的病毒进行匹配,已确定文件中有无病毒。采用文件代号式磁盘存取方式,打开待病毒扫描的文件,从文件中顺序读取指定个数的字符存于缓冲区中,然后对缓冲区中的字符串用病毒库中的病毒逐个进行匹配。由于实现的简单和时间仓促,没有考虑包含病毒的文件在被多次读取到缓冲区时,其中的病毒串被截断,即病毒串的一部分在前一次读取的缓冲区中,另一部分在当前读取的缓冲区中,又由于每次读取之前缓冲区都会被清零覆盖,造成本来存在病毒的文件被认为不包含病毒。为了克服此错误,可以采用两个循环式的缓冲区。四程序设计过程详解(一)主要实现功能编写模拟病毒扫描程序,对选择的磁盘文件进行扫描。(例如:A:B:C:D:E:……)并动态显示扫描过程(正在扫描的文件路径),在扫描完之后显示扫描到的文件夹(目录)个数、文件个数。如果指定了文件名(对此文件进行查找,可以用通配符*和?),则最后显示的结果为扫描到的文件夹(目录)个数、文件个数、找到的文件路径列表。(二)程序总体流程图图4-1程序总体流程(三)程序设计说明这个程序主要用到了int21h的4eh和4fh两个功能,在使用这一功能之前先要设置数据传输区(DTA)。设置DTA方法:ah=1AhDS:DX=DTA地址int21hDTA简介: DTA是一个43字节的结构体:FILEDTA LABEL BYTE;DB 21DUP(20H);保留为子目录搜索;这21个字节为AH=4FH,INT21H提供信息FILEATTRDB 0;文件属性FIELTIMEDW0;文件时间FILEDATEDW 0;文件日期LOWSIZE DW 0;文件大小:低字节HIGHSIZE DW 0;文件大小:高字节FILENAME DB 13DUP(20H);查到的匹配文件名,ASCIZ形式ah=4eh,int21h功能是查找第一个匹配文件,调用参数为:DS:DX=ASCIZ串地址(存的是欲查找的文件名,支持通配符*和?。故使用文件名为*.*可以实现对任何文件名的匹配,从而为实现磁盘扫描提供有力工具;如果使用文件名为*则仅可找到ASCIZ串所指路径下的文件夹。)CX=欲查找的文件的属性(本程序中CX=16h,以保证可找到任何属性的匹配文件)文件的属性字节为:AH=4FH,INT21H功能是查找下一个匹配文件,调用参数为:无须显式传递参数,但在调用该中断之前必须保证DTA中存放着原来调用4eh时留下的信息(前21字节)。基于以上这些知识,本程序的设计思想如下:表4-1设计表格位01234567属性只读隐藏系统文件卷标子目录存档文件未定义未定义总的思想是,先实现主要功能,再在此基础上逐步添枝加叶最终实现题目要求的功能。1过程scan该过程实现对用户所选的磁盘进行扫描。在最初的ASCIZ串(本程序中用file_name作为其首地址)中置形式为:驱动器号:\*.*。此后根据用户输入的欲扫描的驱动器号设置原先预置的ASCIZ串。在调用过程scan前已设定好DTA,先用DTA地址一直在BX中存放。算法描述如下:Step1:调用INT21H的4EH子功能,查找第一个匹配文件,其文件属性这一调用参数设置为16H(这样它与*.*的共同作用下就可以查到任何属性的任何文件名)。Step2:如果没有找到可匹配文件转Step3,否则转Step4。Step3:将ASCIZ串中最后一个‘\’改为其它值(本程序是将它改为空格),return(过程search结束)。Step4:保存查到的匹配文件的属性。看得到的文件名是否以‘.’开头(防止取得的文件夹名为‘.’或‘..’从而进入死循环),如果是跳转Step11,否则执行下一步。Step5:将新查找到文件名合并到现有的file_name中以形成该文件的绝对路径。Step6:利用保存的文件属性判断查到的匹配文件是否是文件夹,如果不是跳转Step10,否则执行下一步。Step7:在file_name末尾添加‘\*.*’,00h。Step8:文件夹计数器加一。Step9:保存现用DTA地址,设置一个新的DTA,递归调用过程scan来查找该文件夹中的文件。在过程返回后,利用刚才保存的地址将原先用的DTA恢复。跳转Step11。Step10:文件计数器加一,显示查找到的文件的完整路径。Step11:利用INT21H的4FH子功能查找下一个匹配文件。跳转Step2。2过程search过程实现的是在用户选择的磁盘对用户所输入的文件名进行查找。查找的文件名可含通配符*和?(*可以代表任意含0个多个字符,?可代表任一字符)。须注意的是:如果输入的文件名没有扩展名,则仅能找到与之匹配的文件夹。其余情况和windows操作系统的搜索功能一样,如:先输入d,再输入*.exe便可找到d盘中所有的exe文件。先输入d,再输入matlab.*则可以找到所有名为matlab的文件和文件夹。而先输入d,再输入matlab只能找到名为matlab的文件夹。先输入d,再输入m*.*,则可以找到所有以m开头的文件和文件夹。在调用过程search之前先利用过程sort_name(过程sort_name根据用户输入的磁盘名和文件名处理好file_name中的ASCIZ串。如用户输入的磁盘名为c,文件名为w?n*.*则调用过程sort_name后该串变为‘c:\w?n*.*’,00h)。算法描述如下:Step1:调用INT21H的4EH子功能,查找目前文件夹中第一个匹配文件,其文件属性这一调用参数设置为16H。Step2:如果没有找到匹配文件跳转Step8,否则执行下一步。Step3:找到的文件如果不是文件夹,跳转Step5,否则执行下一步。Step4:文件夹计数器加一,跳转Step6。Step5:文件计数器加一。Step6:整理好查到的文件或文件夹的绝对路径并显示。Step7:保存BX值(现用DTA地址),利用INT21H的4FH子功能查找下一个匹配文件,恢复BX值。跳转Step2。Step8:查找目前文件夹中的第一个文件夹。Step9:如果找到文件夹跳转Step11,否则执行下一步。 Step10:将ASCIZ串中最后一个‘\’改为其它值(本程序是将它改为空格),return(过程scan结束)。Step11:看得到的文件名是否以‘.’开头(防止取得的文件夹名为‘.’或‘..’从而进入死循环),如果是跳转Step13,否则执行下一步。Step12:保存现用DTA地址,设置一个新的DTA,递归调用过程search在新找到的文件夹中查找匹配的文件。在过程返回后,利用刚才保存的地址将原先用的DTA恢复。Step13:利用INT21H的4FH子功能查找下一个文件夹。跳转Step9。几个非主要过程和宏的功能说明如下:宏display:在屏幕上显示以所传参数msg为首地址的字符串。宏set_dta:设置以所传参数为首地址的43个字节为现行DTA。3过程clrscr清屏。4过程sort_name根据用户输入的磁盘名和文件名处理好file_name中的ASCIZ串。如用户输入的磁盘名为c,文件名为w?n*.*则静调用过程sort_name后该串变为‘c:\w?n*.*’,00h。(为过程search服务)5过程print将si(低字节),di(高字节)中的四字节的内容转换为10进制后在屏幕输出。(四)软件操作说明运行该程序后屏幕上显示如下信息: 图4-2程序主界面如果输入1,选择的是模拟病毒扫描功能,而后屏幕显示: 图4-3用户输入1后的界面 这时用户输入想要扫描的磁盘号,这里我输入D盘符,然后模拟病毒扫描(全屏观察结果效果较好)。扫描完之后显示扫过的文件和文件夹数目(若输入的磁盘号无效,程序不报错,最终显示的找到数目为0,下同)。图4-4显示扫描盘符后的文件名和文件夹个数如果输入2,选择的是在用户所选的磁盘中查找用户指定的文件。而后屏幕显示:图4-5用户输入2后的界面这时用户输入想要在哪个盘查找的磁盘名,如想要在c盘查找就输入c。这时屏幕又显示如下信息:图4-5用户输入需要查找C盘符界面这时用户输入想要查找的文件名。查找的文件名可含通配符*和?(*可以代表任意[含0个]多个字符,?可代表任一字符)。五程序的运行和测试(一)程序实现的算法当查找到一个.txt即文本文件后,用病毒库里面的各个病毒(上次我找到了一个病毒库文件,源代码的数据段中包含有二进制形式的病毒代码。因为我们只是模拟病毒扫描,采用的病毒库非常小,才几个病毒,各个病毒也很短,就几十字节长,可以说是原始社会的病毒了,和现今成熟的商业杀毒软件引擎不可同日而语,他们还要用到人工智能,模糊数学和网络安全等一系列复杂的机制。我们用的字符串模式匹配查毒的方式可能是很早的杀毒软件在dos下采用的方法了,逐个对文件内容进行模式匹配,直到匹配成功或者已经匹配到文件尾,匹配成功即认为该文本文件包含病毒而删除。病毒查找过程:查找到一个.txt文本文件后,采用int21h3dh号中断,文件代号式磁盘存取方式打开此文件,采用int21h3fh号中断,从打开的文件中读取固定个数字符(源代码中文100个)到缓冲区buffer中。然后用各个病毒逐个对缓冲区中的字符串进行模式匹配,匹配成功就置病毒查找到标志(virusfind)为真,删除此文件,结束对此文件的匹配查找;如果所有病毒都匹配不成功,则清空缓冲区并从文件中继续读取固定字符到缓冲区,然后继续匹配,直到匹配成功或者到达文件尾结束。在对缓冲区中字符串进行病毒模式匹配时,为了实现的简便起见,可以采用原始的子串模式匹配算法。即用i,j两个游标分别指向缓冲区和病毒串,如果当前所指字符匹配,则两游标都加1即前移一个字符,直到不匹配,重置指向病毒串的游标j为0,指向缓冲区的游标i在上次j为0时i值的基础上加1。如此,直到查找到病毒,病毒扫描过程结束,删除此文件;如果到达缓冲区末尾还未查找到病毒,则将缓冲区清零并继续从文件中顺序读取字符存放到缓冲区中,继续用病毒库中的病毒进行匹配。可能对整个文件都查找完也未发现病毒,说明此文件中不包含病毒,对此文件不需要作处理。原始的子串模式匹配算法虽然简单,但时间复杂度很高,效率非常低下,因为病毒扫描程序要求很高的执行效率,所以可以采用高效的子串模式匹配算法即著名的KMP算法。KMP算法是一种模式匹配的改进算法,此算法可以在O(n+m)的时间数量级上完成串的模式匹配操作。其改进在于:每当一趟匹配过程中出现字符比较不等时,不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。先看看最“朴素”的算法:///findatemplateinaIndex(char*S,char*T,intpos){inti=pos,j=1;while(i<=S[0]&&j<=T[0]){if(S[i]==T[j]){++i;++j;}\\如果相同,则继续向后比较else{i=i-j+2;j=1;}\\如果不同,就回溯,重新查找}if(j>T[0])returni-T[0];elsereturn0;}//Index用KMP算法比较对比

温馨提示

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

评论

0/150

提交评论