木马病毒防治技术研究及系统实现

木马病毒防治技术研究及系统实现

ID:75344493

大小:2.15 MB

页数:83页

时间:2024-02-04

上传者:笑似︶ㄣ無奈
木马病毒防治技术研究及系统实现_第1页
木马病毒防治技术研究及系统实现_第2页
木马病毒防治技术研究及系统实现_第3页
木马病毒防治技术研究及系统实现_第4页
木马病毒防治技术研究及系统实现_第5页
木马病毒防治技术研究及系统实现_第6页
木马病毒防治技术研究及系统实现_第7页
木马病毒防治技术研究及系统实现_第8页
木马病毒防治技术研究及系统实现_第9页
木马病毒防治技术研究及系统实现_第10页
资源描述:

《木马病毒防治技术研究及系统实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

木马病毒防治技术研究及系统实现中文摘要目前计算机病毒可以渗透到信息社会的各个领域,给计算机系统带来了巨大的破坏和潜在的威胁。为了确保信息的安全与畅通,提高计算机用户的木马病毒防范意识,因此,研究计算机病毒,尤其是木马病毒的防范措施已迫在眉睫。本文从计算机病毒及木马的起源及现状的分析开始着手,对上百种流行木马的常见攻击手段进行追踪分析,从中寻求其相似性。经过不断地实验和分析,总结并提炼出了木马病毒的攻击类型:修改系统注册表、修改文件打开关联、远程屏幕抓取、远程关机和重新启动、键盘与鼠标的控制、远程文件管理等。为了进一步揭示这些常用攻击类型的原理和危害性,本文利用WindowsAPI函数和MFC开发语言等工具实现了对这些手段的过程模拟,并在此基础上,完成了基于进程的木马查杀模块的开发实现。本文在木马误杀问题及常见的木马类病毒的通用防治方法等方面也进行了一些原理和技术上的分析和探讨。本文给出的查杀模块的木马病毒专杀工具,经过数家单位实践检验,取得了良好的效果,在遇到新的木马病毒时,可以在很多杀毒软件生产商病毒库升级以前,通过该工具进行有效的查杀,已经为相关单位节省了数万元的投入,取得了良好的经济效益和社会效益。本文提出的木马查杀设计思想在该领域是具有一定的指导意义,为计算机网络安全提供了一种全新的探索方法。关键词:木马病毒、攻击手段、API函数、代码演示I ResearchOnThePreventionSystemOfTrojanVirusAbstractPresently,computervirusesarepenetratingeveryareaofinformationcommunitiesandhaveimposedsubstantialthreatsandrisksonthecomputersystem.Toensuretheavailabilityandsecurityoftheinformationandraisethecomputerusers’awarenessofTrojanvirusprevention,intensiveresearchonpreventingthecomputerviruses,especiallyTrojanviruses,isimminent.ThispaperbeginswiththeanalysisoftheoriginandstatusoftheTrojanviruses,thentracksandanalyzeshundredsofpopularTrojancommonattackmeanstoseektheirsimilarity.Afterconstantlyexperimentsandanalysis,theauthorhasfinallysummarizedupsomeofthemostcommonattackmeans:revisedsystemregistry,modifydocumentsopenassociation,remotescreencapture,remoteshutdownandrestart,keyboardandmousecontrol,theremotefilemanagement.Inordertofurtherrevealtheprincipleanddangerofthesecommonlyusedattackmeans,theauthormakesuseofWindowsAPIfunctionandMFClanguagedevelopmenttoachievethesimulationofattackprocess.Onbasisofthis,theauthorhasfinisheddevelopingTrojandetectedmoduleswhichisworkinginprocess.ThispaperhasalsodiscussedtheproblemofTrojanwronglydetectedandcommonpreventionmethodsfortheTrojan-likevirusintheviewofsomeprinciplesandtechnicalanalysis.Theauthor’sTrojankillingtoolforTrojanvirusmodulehasalreadyappliedinseveralinstitutions,withgoodresults.FacingofthenewTrojanviruses,theTrojankillingtoolisabletoworkeffectivelybeforemanyantivirussoftwaremakerimproveshisproduct.Thishassavedafewmilliondollars,andhasbroughtgoodeconomicandsocialbenefits.ThedesignideaofdetectingTrojanwhichpresentsinthispaperhasaguidingsignificanceintheconcernedfield.Thispaperintroducesanewexplorationmethodforthecomputernetwork'ssecurity.Keyword:Trojanvirus,Attacktechnique,APIfunction,CodedemonstrationII 目录第一章计算机病毒的现状研究.......................................................................................1第二章木马病毒的起源及现状研究...............................................................................7第三章常见木马攻击方法研究及演示系统设计.........................................................123.1WIN32API函数与WINDOWS系统注册表基础.......................................................123.2修改系统注册表方法研究及演示系统设计...........................................................153.3修改文件打开关联方法研究及演示系统设计.......................................................243.4远程屏幕抓取方法研究及演示系统设计...............................................................273.5远程关机或重新启动方法研究及演示系统设计...................................................343.6控制键盘与鼠标方法研究及演示系统设计...........................................................373.7远程文件管理方法研究及演示系统设计...............................................................44第四章木马类病毒防治方法技术研究及模块实现.....................................................514.1防范木马攻击技术的研究.......................................................................................514.2清除木马病毒的方法研究.......................................................................................524.3基于进程检测的查杀木马模块的设计及实现.......................................................554.4常见误报情况分析研究............................................................................................62第五章结束语.................................................................................................................715.1本文工作总结...........................................................................................................715.2进一步工作展望.......................................................................................................72附录常见病毒、木马进程速查表.................................................................................73参考文献.............................................................................................................................75攻读硕士学位期间公开发表的论文.................................................................................77致谢...............................................................................................................................78 第一章计算机病毒的现状研究随着计算机在社会生活各个领域中的广泛运用,计算机病毒攻击与防范技术也在不断拓展。据报道,世界各国遭受计算机病毒感染和攻击的事件数以亿计,严重地干扰了正常的人类社会生活,给计算机网络和系统带来了巨大的潜在威胁和破坏。与此同时,病毒技术在战争领域也曾广泛的运用,在海湾战争、科索沃战争中,双方都曾利用计算机病毒向敌方发起攻击,破坏对方的计算机网络和武器控制系统,达到了一定的政治目的与军事目的。可以预见,随着计算机和网络运用的不断普及、深入,防范计算机病毒将越来越受到各国的高度重视。一、计算机病毒的类型及特点计算机病毒的分类方法有多种,但最为流行且科学的分类方法则是按病毒对计算机破坏的程度和传染方式来分。按前者分类,主要有良性病毒和恶性两大种,若按后者,即病毒在计算机中的传播方式来分有引导型病毒、文件型病毒及深入型三种。(1)良性病毒与生物学的良性病毒一样,计算机中的良性病毒是指那些只表现自己而不破坏系统数据的病毒。它多数是恶作剧者的产物,其目的不是为了对系统数据进行破坏,而是为了让使用这种被传染的计算机系统用户通过屏幕显示的表现形式,了解一下病毒程序编写者在计算机编程技术与技巧方面的超群才华,但这种病毒在一定程度上对系统也有破坏作用。通常来说,良性病毒在发作时,仅占用CPU的时间,进行与当前执行程序无关的事件来干扰系统工作。(2)恶性病毒恶性病毒的目的在于人为地破坏计算机系统的数据、删除文件或对硬盘进行格式化,甚至有些病毒既不删除计算机系统的数据,也不格式化硬盘,而只是对系统数据进行修改,这样的病毒所造成的危害具有较大破坏性,有的占用系统资源,有的可能删除执行文件,甚至在某种条件下使机器死锁。(3)引导扇型病毒开机启动时,在DOS的引导过程中被引入内存的病毒称之为引导病毒。它不以文-1- 件的形式存在磁盘上,没有文件名,不能用DIR命令显示,也不能用DEL命令删除,十分隐蔽。常见圆点病毒、大麻病毒、巴基斯坦智囊病毒及BRAIN病毒等均属这类。由于引导区是磁盘的一部分,它在开机启动时控制计算机系统。而引导区病毒则用它自身来代替磁盘上原来的引导区代码,并将病毒装入内存。一旦装入内存,病毒就向其它磁盘或文件扩散。这类病毒通常将整个病毒或病毒的一部分装入引导扇区,而把原引导记录和病毒的其它部分转移到磁盘的其它扇区保存起来,这类病毒在系统启动时便可获得控制权,进行传播和破坏活动。引导型病毒通常分为两部分:第一部分放在磁盘引导扇区中;另一部分和原引导记录放在磁盘上连续几个簇中,其位置一般放在第一部分中。这些簇在文件分配表FAT中做上坏簇的标记,使其不被覆盖而永久地驻留在磁盘中。引导型病毒也可能驻留在硬盘的主引导记录中,其原理和驻留在引导扇区的病毒基本相同。引导程序放在磁盘的引导扇区中。开机启动时,磁盘引导扇区的程序会读到内存中,如果是干净盘,得到控制权的引导程序把两个隐含文件和COMMAND.COM引入内存,启动完成。如果是染上病毒的盘,读到内存的是病毒程序的第一部分,它得到控制权后修改内存可用空间的大小,在内存高端辟出一块区域,并把第一部分移至该区,接着读入放在磁盘“坏簇”中的第二部分,并和第一部分拼起来,使病毒程序全部驻留在内存的高端,然后修改INT13H的中断向量或其它中断向量,使其指向高端的病毒程序,这时即可把原引导程序读到内存中,并把控制权交给它以完成系统的启动。由于修改了中断向量,病毒程序在计算机的运行中经常能得到CPU的控制权。各类引导型病毒引入存储过程大致相同。它们都要修改内存可用空间的大小,都植入内存的高端,并在内存高端为病毒传播留出工作空间,否则在运行其它程序时可能被覆盖;都要修改中断向量表,以便将来有机会占领CPU,否则即使在内存也如同冬眠一样,不能进行传播和破坏。带病毒系统盘启动后,病毒程序就安装到内存的高端,如仅此而已,只耗去部分内存空间,对系统没有什么影响,那么病毒是如何传播的呢?病毒是一段程序,必须占领CPU,运行时才能传播。由于在病毒装入内存时,中断向量表已被修改,其入口地址指向内存高端的病毒程序,因此读写盘或产生其它中断时首先运行的是病毒程序,造成了传播机会。传播前一般要先判断磁盘是否已感染过,若已感染,则不再感染,否则就搜索盘中连续几个未用簇,把第二部分和原引-2- 导记录写到这些簇中,把这几簇的位置和病毒标志记载在第一部分,在FAT表中给这几个簇置上坏簇标记,再把在内存高端的病毒程序第一部分写到磁盘的引导扇区,就完成了传播。由于中断向量表已被修改,因此读写盘或产生其它中断时,病毒程序占领了CPU,就可以发作。为了尽可能地扩散,一般在感染后一段时间内,病毒只悄悄地传播而不发作,不易察觉。只有在一定条件下才会发作,条件多半和时间有关,病毒常使用INT1AH中断读取计算机系统的时间,满足一定条件就会发作。(4)文件型病毒文件型病毒也常称之为外壳型病毒。这种病毒的载体是可执行文件,即文件扩展名为COM和EXE等的程序,它们存放在可执行文件的头部或尾部。将病毒的代码加载到运行程序的文件中,只要运行该程序,病毒就会被激活,同时又会传染给其它文件。这类病毒主要只传染可执行文件,并且当感染有该病毒的文件运行时,病毒即可得到控制权,进行传播和破坏活动。这类病毒的载体是可执行程序,只有用户键入该程序名,或用其它方法运行该程序,病毒方能引入内存,并占领CPU,运行病毒程序。一旦用户键入染上这种病毒的可执行文件名,该文件就会进入内存并运行,但首先执行的是藏在其中的病毒程序。病毒会在磁盘中寻找尚未染上此病毒的可执行文件,将自身植入其首部或尾部,修改文件的长度使病毒程序合法化,还修改该程序,使执行该文件前首先挂靠病毒程序,在病毒程序的出口处再跳向原程序开始处,该可执行文件就成为了新的病毒源。一旦病毒占领了CPU,运行后随时可以发动攻击。这种病毒依附在源程序等不可执行的文件中是没有意义的,其传染的目的是可执行文件,只有运行该可执行程序时病毒才能调入内存运行,因此文件型病毒激活的机会少。可执行程序分为应用类和系统类。应用类由用户编写,进入内存的机会少,而系统类由系统提供,如COMMAND.COM、FILE1.EXE、CCCC.EXE等,是常驻内存或经常引入内存的。为了有更多的“作案”机会,这种病毒常传染系统文件。此外如EDLIN.COM、PCTOOLS.EXE、DEBUG.COM、DISKCOPY.COM以及一些编译、汇-3- 编、链接程序,它们进入内存的机会较多,因此也被传染,诊治时首先要从这些文件入手。(5)深入型病毒深入型病毒也称之为混合型病毒,具有引导区病毒和文件型病毒两种特征,以两种方式进行传染。这种病毒它们既可以传染引导扇区又可以传染可执行文件,从而使它们的传播范围更广,也更难于被消除干净。这类病毒不仅感染引导记录,也感染磁盘文件。如果只将病毒从被感染的文件中清除掉,当系统重新启动时,病毒将从硬盘引导记录进入内存,这之后文件又会被感染;如果只将隐藏在引导记录里的病毒消除掉,当文件运行时,引导记录又会被重新感染。深入型病毒的传染过程与引导型病毒和文件型病毒的传染过程类似,只不过它既感染磁盘的引导扇区又感染磁盘文件。归纳起来,计算机病毒有以下特点:¾攻击隐蔽性强。病毒可以无声无息地感染计算机系统而不被察觉,待发现时,往往已造成严重后果。¾繁殖能力强。电脑一旦感染病毒,可以很快“发病”。目前的病毒还会产生很多变种。¾传染途径广。可通过软盘、光盘、有线和无线网络、硬件设备等多渠道自动侵入计算机中,并不断蔓延。¾潜伏期长。病毒可以长期潜伏在计算机系统而不发作,等到满足一定条件后,就自动激活进行破坏。¾破坏力强。计算机病毒一旦发作,轻则干扰系统的正常运行,重则破坏磁盘数据、删除文件,导致整个计算机系统的瘫痪。¾针对性强。计算机病毒的效能可以准确地加以设计,满足不同环境和时机的要求。二、计算机病毒的技术分析长期以来,人们设计计算机的目标主要是追求信息处理功能的提高和生产成本的降低,而对于安全问题则重视不够。计算机系统的各个组成部分,接口界面,各个层-4- 次的相互转换,都存在着不少漏洞和薄弱环节。硬件设备缺乏整体安全性考虑,软件方面也更易存在隐患和潜在威胁。对计算机系统的测试,目前尚缺乏自动化检测工具和系统软件的完整检验手段,计算机系统的脆弱性,为计算机病毒的产生和传播提供了可乘之机;全球万维网(WWW)使“地球村”逐步变成了现实,也为计算机病毒创造了实施的空间;新的计算机技术在电子系统中不断应用,为计算机病毒的实现提供了客观条件。国外专家认为,分布式数字处理、可重编程嵌入计算机、网络化通信、计算机标准化、软件标准化、标准的信息格式、标准的数据链路等都使得计算机病毒侵入成为可能。实施计算机病毒入侵的核心技术是解决病毒的有效注入,其攻击目标是对方的各种系统,以及从计算机主机到各式各样的传感器、网桥等,以使他们的计算机在关键时刻受到诱骗或崩溃,无法发挥作用。从国外技术研究现状来看,病毒注入方法主要有以下几种:1、无线电方式。主要是通过无线电把病毒码发射到对方电子系统中。此方式是计算机病毒注入的最佳方式,同时技术难度也最大。可能的途径有:①直接向对方电子系统的无线电接收器或设备发射,使接收器对其进行处理并把病毒传染到目标机上。②冒充合法无线传输数据。根据得到的或使用标准的无线电传输协议和数据格式,发射病毒码,使之能够混在合法传输信号中,进入接收器,进而进人信息网络。③寻找对方信息系统保护最差的地方进行病毒注放。通过对方未保护的数据链路,将病毒传染到被保护的链路或目标中。2、“固化”式方法。即把病毒事先存放在硬件和软件中,然后把此硬件和软件直接或间接交付给对方,使病毒直接传染给对方电子系统,在需要时将其激活,达到攻击目的。这种攻击方法十分隐蔽,即使芯片或组件被彻底检查,也很难保证其没有其他特殊功能。目前,我国很多计算机组件依赖进口,困此,很容易受到芯片的攻击。3、后门攻击方式。后门,是计算机安全系统中的一个小洞,由软件设计师或维护人发明,允许知道其存在的人绕过正常安全防护措施进入系统。攻击后门的形式有许多种,如控制电磁脉冲可将病毒注入目标系统。计算机入侵者就常通过后门进行攻击,如目前普遍使用的WINDOWS系统,就存在这样的后门。4、数据控制链侵入方式。随着因特网技术的广泛应用,使计算机病毒通过计算机系统的数据控制链侵入成为可能。使用远程修改技术,可以很容易地改变数据控制-5- 链的正常路径。除上述方式外,还可通过其他多种方式注入病毒。三、对计算机病毒攻击的防范的对策和方法1、建立有效的计算机病毒防护体系。有效的计算机病毒防护体系应包括多个防护层。一是访问控制层;二是病毒检测层;三是病毒遏制层;四是病毒清除层;五是系统恢复层;六是应急计划层。上述六层计算机防护体系,需要有效的硬件和软件技术的支持,如安全设计及规范操作。2、严把硬件安全关。国家的机密信息系统所用设备和系列产品,应建立自己的生产企业,实现计算机的国产化、系列化;对引进的计算机系统要在进行安全性检查后才能启用,以预防和限制计算机病毒伺机入侵。3、防止电磁辐射和电磁泄露。采取电磁屏蔽的方法,阻断电磁波辐射,这样,不仅可以达到防止计算机信息泄露的目的,而且可以防止“电磁辐射式”病毒的攻击。4、加强计算机应急反应分队建设。应成立自动化系统安全支援分队,以解决计算机防御性的有关问题。早在1994年,美国软件工程学院就成立了计算机应急反应分队。计算机病毒攻击与防御手段是不断发展的,要在计算机病毒对抗中保持领先地位,必须根据发展趋势,在关键技术环节上实施跟踪研究。实施跟踪研究应着重围绕以下方面进行:一是计算机病毒的数学模型。二是计算机病毒的注入方式,重点研究“固化”病毒的激发。三是计算机病毒的攻击方式,重点研究网络间无线传递数据的[14]标准化,以及它的安全脆弱性。四是研究对付计算机病毒的安全策略及防御技术。-6- 第二章木马病毒的起源及现状研究木马病毒和其他病毒一样都是一种人为的程序,都属于电脑病毒。大家都知道以前的电脑病毒的作用,其实完全就是为了搞破坏,破坏电脑里的资料数据,除了破坏之外其它无非就是有些病毒制造者为了达到某些目的而进行的威慑和敲诈勒索的作用,或是为了炫耀自己的技术。木马病毒则不一样,它的作用是赤裸裸的偷偷监视别人的所有操作和盗窃别人的各种密码和数据等重要信息,如盗窃系统管理员密码搞破坏;偷窃ADSL上网密码和游戏帐号密码用于牟利;更有甚者直接窃取股票帐号、网上银行帐户等机密信息达到盗窃别人财务的目的。所以木马病毒的危害性比其他电脑病毒更加大,更能够直接达到使用者的目的!这个现状就导致了许多别有用心的程序开发者大量的编写这类带有偷窃和监视别人电脑的侵入性程序,这就是目前网上大量木马病毒泛滥成灾的原因。鉴于木马病毒的这些巨大危害性和它与其他病毒的作用性质的不一样,所以木马病毒虽然属于病毒中的一类,但是要单独的从病毒类型中间剥离出来,独立地称之为“木马病毒”程序。“木马病毒”的称法是来源于《荷马史诗》的特洛伊战记。故事说的是希腊人围攻特洛伊城十年后仍不能得手,于是阿迦门农受雅典娜的启发:把士兵藏匿于巨大无比的木马中,然后佯作退兵。当特洛伊人将木马作为战利品拖入城内时,高大的木马正好卡在城门间,进退两难。夜晚木马内的士兵爬出来,与城外的部队里应外合而攻下了特洛伊城。而计算机世界的木马(trojan)是指隐藏在正常程序中的一段具有特殊功能的恶意代码,是具备破坏和删除文件、发送密码、记录键盘和攻击dos等特殊功能的后门程序。由此而得名“木马”。经过若干年的发展,木马病毒也经历了三代的历史。第一代木马:伪装型病毒这种病毒通过伪装成一个合法性程序诱骗用户上当。世界上第一个计算机木马是出现在1986年的pc-write木马。它伪装成共享软件pc-write的2.72版本,一旦用户信以为真运行该木马程序,那么他的下场就是硬盘被格式化。曾听说有一个人在机房上用basic作了一个登录界面木马程序,当你把你的用户id,密码输入一个和正常的登录界面一模一样的伪登录界面后,木马程序一面保存你的id和密码,一面提示你-7- 密码错误让你重新输入,当你第二次登录时,你已成了木马的牺牲品。此时的第一代木马还不具备传染特征。第二代木马:aids型木马继pc-write之后,1989年出现了aids木马。由于当时很少有人使用电子邮件,所以aids的作者就利用现实生活中的邮件进行散播:给其他人寄去一封封含有木马程序软盘的邮件。之所以叫这个名称是因为软盘中包含有aids和hiv疾病的药品,价格,预防措施等相关信息。软盘中的木马程序在运行后,虽然不会破坏数据,但是他将硬盘加密锁死,然后提示受感染用户花钱消灾。可以说第二代木马已具备了传播特征。第三代木马:网络传播型木马随着Internet的普及,这一代木马兼备伪装和传播两种特征并结合TCP/IP网络技术四处泛滥。同时它还有出现了新的特征:1、添加了“后门”功能。所谓后门就是一种可以为计算机系统秘密开启访问入口的程序。一旦被安装,这些程序就能够使攻击者绕过安全程序进入系统。该功能的目的就是收集系统中的重要信息,例如,财务报告、口令及信用卡号。此外,攻击者还可以利用后门控制系统,使之成为攻击其它计算机的帮凶。由于后门是隐藏在系统背后运行的,因此很难被检测到。它们不像病毒和蠕虫那样通过消耗内存而引起注意。2、添加了击键记录功能。从名称上就可以知道,该功能主要是记录用户所有的击键内容然后形成击键记录的日志文件发送给恶意用户。恶意用户可以从中找到用户名、口令以及信用卡号等用户信息。这一代木马中比较有名的如国外的BO2000和国内的冰河木马。它们有如下共同特点:基于网络的客户端/服务器应用程序。具有搜集信息、执行系统命令、重新设置机器、重新定向等功能。当木马程序攻击得手后,计算机就完全成为在黑客控制下的傀儡主机,黑客成了超级用户,用户的所有计算机操作不但没有任何秘密而言,而且黑客可以远程控制傀儡主机对别的主机发动攻击,这时候被俘获的傀儡主机成了黑客进行进一步攻击的挡箭牌和跳板。木马病毒为了达到隐蔽的效果,往往会以各种各样的方法藏身于电脑系统之中。下面介绍几种常见的木马病毒藏身方法。-8- 1、集成到程序中其实木马也是一种客户端/服务器程序,它为了不让用户能轻易地把它删除,就常常集成到程序里,一旦用户激活木马程序,那么木马文件和某一应用程序捆绑在一起,然后上传到服务端覆盖原文件,这样即使木马被删除了,只要运行捆绑了木马的应用程序,木马又会被安装上去了。绑定到某一应用程序中,如绑定到系统文件,那么每一次Windows系统启动均会启动木马。2、隐藏在配置文件中木马实在是太狡猾,知道用户们平时使用的是图形化界面的操作系统,对于那些已经不太重要的配置文件大多数是不闻不问了,这正好给木马提供了一个藏身之处。而且利用配置文件的特殊作用,木马很容易就能在大家的计算机中运行、发作,从而偷窥或者监视大家。不过,现在这种方式不是很隐蔽,容易被发现,所以在Autoexec.bat和Config.sys中加载木马程序的并不多见,但也不能因此而掉以轻心。3、潜伏在Win.ini中木马要想达到控制或者监视计算机的目的,必须要运行,然而没有人会傻到自己在自己的计算机中运行这个该死的木马。当然,木马也早有心理准备,知道人类是高智商的动物,不会帮助它工作的,因此它必须找一个既安全又能在系统启动时自动运行的地方,于是潜伏在Win.ini文件中是木马感觉比较惬意的地方。大家不妨打开Win.ini来看看,在它的[windows]字段中有启动命令“load=”和“run=”,在一般情况下“=”后面是空白的,如果后面跟有程序,比方说是这个样子:run=c:windowsfile.exeload=c:windowsfile.exe这时你就要小心了,这个file.exe很可能是木马。4、伪装在普通文件中这个方法出现的比较晚,不过现在很流行,对于不熟练的windows操作者,很容易上当。具体方法是把可执行文件伪装成图片或文本----在程序中把图标改成Windows的默认图片图标,再把文件名改为*.jpg.exe,由于Windows系统默认设置是“不显示已知的文件后缀名”,文件将会显示为*.jpg,不注意的人一点这个图标就中木马了。-9- 5、内置到注册表中上面的方法让木马着实舒服了一阵,既没有人能找到它,又能自动运行,真是快哉!然而好景不长,人类很快就把它的马脚揪了出来,并对它进行了严厉的惩罚!但是它还心有不甘,总结了失败教训后,认为上面的藏身之处很容易找,现在必须躲在不容易被人发现的地方,于是它想到了注册表!的确注册表由于比较复杂,木马常常喜欢藏在这里快活,赶快检查一下,有什么不熟悉的程序在其中,睁大眼睛仔细看清楚了,别放过木马:HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersion下所有以“run”开头的键值;HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersion下所有以“run”开头的键值;HKEY_USERS.DefaultSoftwareMicrosoftWindowsCurrentVersion下所有以“run”开头的键值。6、在System.ini中藏身木马真是无处不在呀!什么地方有空子,它就往哪里钻!这不,Windows安装目录下的System.ini也是木马喜欢隐蔽的地方。还是小心点,打开这个文件看看,它与正常文件有什么不同,在该文件的[boot]字段中,是不是有这样的内容,那就是shell=Explorer.exefile.exe,如果确实有这样的内容,那你就不幸了,因为这里的file.exe就是木马服务端程序!另外,在System.ini中的[386Enh]字段,要注意检查在此段内的“driver=路径程序名”,这里也有可能被木马所利用。再有,在System.ini中的[mic]、[drivers]、[drivers32]这三个字段,这些段也是起到加载驱动程序的作用,但也是增添[13]木马程序的好场所。7、隐形于启动组中有时木马并不在乎自己的行踪,它更注意的是能否自动加载到系统中,因为一旦木马加载到系统中,任你用什么方法你都无法将它赶跑,因此按照这个逻辑,启动组也是木马可以藏身的好地方,因为这里的确是自动加载运行的好场所。启动组对应的文件夹为:C:windowsstartmenuprogramsstartup,在注册表中的位置:HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerShellFold-ersStartup="C:windowsstartmenuprogramsstartup"。要经常检查启动组!-10- 8、隐蔽在Winstart.bat中按照上面的逻辑理论,凡是利于木马能自动加载的地方,木马都喜欢呆着。这不,Winstart.bat也是一个能自动被Windows加载运行的文件,它多数情况下为应用程序及Windows自动生成,在执行了Win.com并加载了多数驱动程序之后开始执行。由于Autoexec.bat的功能可以由Winstart.bat代替完成,因此木马完全可以像在Autoexec.bat中那样被加载运行,危险由此而来。9、捆绑在启动文件中即应用程序的启动配置文件,控制端利用这些文件能启动程序的特点,将制作好的带有木马启动命令的同名文件上传到服务端覆盖这同名文件,这样就可以达到启动[13]木马的目的了。10、设置在超级连接中木马的主人在网页上放置恶意代码,引诱用户点击,用户点击的结果不言而喻:[13]开门揖盗!不要随便点击网页上的链接,除非你了解它,信任它。-11- 第三章常见木马攻击方法研究及演示系统设计虽然市面上有很多种的木马程序,但是它们的核心攻击原理都是大同小异的,要想完成木马检测系统的设计,首先必须对木马攻击原理有足够的了解,正所谓“知己知彼,百战不殆”!木马程序一般都是由两个部分组成,服务(Server)端程序和客户(Client)端程序。其中服务端被安装在被控制的计算机上,客户端程序则被安装在控制计算机上,服务端程序和客户端程序建立起连接就可以实现对远程计算机的控制了。木马攻击系统的方法是通过客户端程序向服务端程序发送指令,服务端接收到控制指令后,根据指令内容在本地执行相关程序段,然后把执行的结果返回给客户端。在这一章里,我们将具体分析木马程序常用的几种攻击手段,这些手段包括修改文件打开关联、修改系统注册表、共享硬盘数据、远程屏幕抓取、远程关机或重新启动、键盘与鼠标的控制、远程文件管理等。结合对实例代码的综合分析,可以使得我们更加详尽、明了地掌握木马病毒程序的编制原理,以便对症下药,寻求有效实用的反木马方法。本章的每一个小节中将给出实现相关功能需要使用到的WIN32API函数,论文中所列出的代码均为相应主模块的部分程序,需要配合表单部分的设计代码方可在系统中达到运行的效果。3.1Win32API函数与Windows系统注册表基础3.1.1什么是Win32APIWin32是相对于Win16而言的,Win16是指以前的Windows3.x,因为它的结构是基于16位的处理器设计的;而Win32是指针对32位处理器所设计的Microsoft[1]Windows9X以及WindowsNT、Windows2000、WindowsXP、Windows2003。现在市面上64位的处理器也开始逐步成为主流,Win64也开始进入人们的视野,由于64位技术还没有普及,因此我们在这里还是讨论32位技术。API是ApplicationProgrammingInterface的简写,指应用程序与系统的接口。可以把它们看作是一个库,提供各种各样与操作系统服务有关的函数,例如,CreateFile()就是用来创建文件的API函数。在C的标准库中有个函数create()也提供了创建文件的服务,只是create()内部最后也会调用CreateFile()完成创建文-12- 件的操作。事实上,C标准库中所有与操作系统有关的函数,最后都会调用Win32API函数来完成工作。因此,可以把Win32API看成是最低级的服务。C语言的标准库包含了400多个函数,而Win32API可能超过1000个函数,并且数量还在不断增加,不但Microsoft推出新版的操作系统时会增加几个新的API函数,甚至只要推出补丁程序,竞争对手推出新的浏览器时,也会增加新的API函数,所以总数有多少,没人能说得清楚。虽然Windows95之后的操作系统的系统服务接口都是Win32API,但是两者并不完全相同,Windows95并没有完整地提供Win32API的所有功能。例如,安全功能就是最大的区别:WindowsNT、Windows2000、WindowsXP等是多用户操作系统,提供了相当强大的安全功能,只有得到授权的用户才能访问系统资源(例如文件、打印机等),而Windows95只是个人用的操作系统,不需要安全功能,因此也就不提供[1]Win32API中与安全有关的功能。3.1.2Windows系统注册表注册表是MicrosoftWindows9x、WindowsCE、WindowsNT和Windows2000中使用的中央分层数据库,用于存储为一个或多个用户、应用程序和硬件设备配置系统所必需的信息。注册表包含Windows在运行期间不断引用的信息,例如,每个用户的配置文件、计算机上安装的应用程序以及每个应用程序可以创建的文档类型、文件夹和应用程序图标的属性表设置、系统上存在哪些硬件以及正在使用哪些端口。注册表取代了Windows3.x和MS-DOS配置文件(例如,Autoexec.bat和Config.sys)中使用的绝大多数基于文本的.ini文件。虽然几个Windows操作系统都有注册表,但这些操作系统的注册表有一些区别。注册表数据存储在二进制文件中。注册表因为它复杂的结构和没有任何联系的CLSID键使得它可能看上去很神秘。不幸的是,微软并没有完全公开讲述关于注册表正确设置的支持信息,这样使得注册表看上去更不可琢磨。处理和编辑注册表如同“黑色艺术”一样,它在系统中的设置让用户感觉象在黑暗中摸索一样找不到感觉。这样,因为用户对这方面的缺乏了解使得注册表更多的出现故障。Windows注册表是帮助Windows控制硬件、软件、用户环境和Windows界面的一-13- 套数据文件,注册表包含在Windows目录下两个文件system.dat和user.dat里,还有它们的备份system.da0和user.da0。通过Windows目录下的regedit.exe程序可以存取注册表数据库。在以前,在windows的更早版本(在win95以前),这些功能是靠win.ini,system.ini和其他和应用程序有关联的.ini文件来实现的。在windows操作系统家族中,system.ini和win.ini这两个文件包含了操作系统所有的控制功能和应用程序的信息,system.ini管理计算机硬件而win.ini管理桌面和应用程序。所有驱动、字体、设置和参数会保存在.ini文件中,任何新程序都会被记录在.ini文件中。这些记录会在程序代码中被引用。因为受win.ini和system.ini文件大小的限制,程序员添加辅助的.INI文件以用来控制更多的应用程序。举例来说,微软的Excel有一个excel.ini文件,它包含着选项、设置、缺省参数和其他关系到Excel运行正常的信息。在system.ini和win.ini中只需要指出excel.ini的路径和文件名即可。注册表最初被设计为一个应用程序的数据文件相关参考文件,最后扩展成对于32位操作系统和应用程序包括了所有功能下的东东.注册表是一套控制操作系统外表和如何响应外来事件工作的文件。这些“事件”的范围从直接存取一个硬件设备到接口如何响应特定用户到应用程序如何运行等等。注册表因为它的目的和性质变的很复杂,它被设计为专门为32位应用程序工作,文件的大小被限制在大约40MB。3.1.3注册表的结构注册表是Windows程序员建造的一个复杂的信息数据库,它是多层次式的。在不同系统上注册表的基本结构相同。其中的复杂数据会在不同方式上结合,从而产生出一个绝对唯一的注册表。计算机配置和缺省用户设置的注册表数据在Winnt中被保存在下面这五个文件中:DEFAULT,SAM,SECURITY,SOFTWARE,SYSTEM,NTUSER.DAT。Win95中所有系统注册信息保存在windows目录下的SYSTEM.DAT文件里。所有硬件设置和软件信息也保存在这个文件。它要比NT注册表文件简单的多,因为这里并不需要更多的控制。Win95被设计为一个网络的客户或者单独工作的系统,所以用户控制或者安全级别和NT不一样。这使得Win95注册表工作比NT更容易,所以这个文件也比较小。Win95用户的注册数据一般被保存在windows目录下的user.dat里。如果你在-14- 控制面板|密码|用户配置文件中创建并使用多于一个用户的配置文件,每个用户就会有在WINDOWSProfilesusernameUSER.DAT下它自己的user.dat文件。在启动时,系统将记录你的登陆,从你目录中的配置文件(USER.DAT信息)将被装入,以用来保持你自己的桌面和图标。3.2修改系统注册表方法研究及演示系统设计修改系统注册表是木马程序最常用的攻击和入侵手段。在注册表中,我们也可以设置一些启动加载项目,编制木马程序的作者们当然也会充分地利用这个机会。因为他们知道注册表中表项内容繁多,非计算机高级专家是不可能熟悉其中的内容的,这样相对其他的方法来说则比较安全,更容易使人上当。事实上,只要是诸如“RunRun-RunOnceRunOnceExRunServicesRunServices-RunServicesOnce”等字样的一般都是木马程序加载的入口。例如HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunHKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunHKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServ-ice等,如图3-1所示。图3-1注册表图例3.2.1注册表跟键的基本知识Windows系统的注册表包含了Windows的系统配置、PC机的硬件配置、Win32应用程序和用户的其他设置信息。注册表是多层次的树状数据结构,具有六个分支(根键),每个分支又由许多的键和键值组成,而每个键则代表一个特定的配置项目。这-15- 六个根键分别是:⑴HKEY_CLASSES_ROOTHKEY_CLASSES_ROOT键是基层类别键,该键由多个子键组成,具体可分为两种:一种是已经注册的各类文件的扩展名,另一种是各种文件类型的有关信息。左栏中的子键就是各种已经注册的文件扩展名。注册表内己经登记的文件扩展名中,有系统默认和应用程序自定义的扩展名。应用程序只有把自定义的扩展名在注册表中登记,系统才能识别和关联使用有关的文档,但只有经过注册的扩展名,系统才能自动关联。⑵HKEY_CURRENT_USERHKEY_CURRENT_USER键包含本地工作站中存放的当前登录的用户信息,包括用户登录用户名和暂存的密码。用户登录系统时,其信息从HKEY_USERS中相应的项拷贝到HKEY_CURRENT_USER中。HKEY_CURRENT_USER下面有以下常用子关键字:AppEvents这个子键里面登记了已注册的各种应用事件。ControlPanel它里面涉及到控制面板设置有关的内容。KeyboardLayout关于键盘设置的信息。Printers有关打印机设置的信息。Software软件的有关信息。⑶HKEY_LOCAL_MACHINEHKEY_LOCAL_MACHINE根键是注册表的核心,计算机的各种硬件和软件的配置均存在于此。它包括以下八个部分:Config配置、Driver驱动程序、Enum即插即用、Hardware硬件、Network网络、Security安全、Software软件、System系统。每部分中又包括许多子键。该根键中存放本地计算机硬件数据,此根键下的子关键字包括在SYSTEM.DAT中,用来提供HKEY_LOCAL_MACHINE所需的信息,或者在远程计算机中可访问的一组键中。该根键中的许多子键与System.ini文件中设置项类似。⑷HKEY_USERSHKEY_USERS根键保存了存放在本地计算机口令列表中的用户标识和密码列表,即用户设置。每个用户的预配置信息都存储在HKEY_USERS根键中。HKEY_USERS是远程计算机中访问的根键之一。其内容取决于计算机是否激活了用户配置文件,若未激活用户配置文件,则可以看到称为.DEFAULT的单一子键,该子键包括和所有用户相关的各种设置,并且和Windows下的USER.DAT文件相配合。若激活了用户配置文件-16- 并且正确地执行了登录,则还有一个“用户名”的子键,该用户名为用户登录的名称。⑸HKEY_CURRENT_CONFIGHKEY_CURRENT_CONFIG键定义了计算机的当前配置情况,如显示器、打印机等可选外部设备及其设置信息,最后使用的文档列表和其他有关当前用户的安装的信息等。它实际上也是指向HKEY_LOCAL_MACHINEConfig结构中的某个分支的指针。⑹HKEY_DYN_DATAHKEY_DYN_DATA键定义了系统运行中的动态数据,即已发生的事件的有关信息。它不仅包含系统硬件的当前状态,也包含了那些需要更新和检索的数据。系统每次启动时都要创建此关键字。在WindowsNT中,这个根键取名为HKEY_PERFORMANCE_DATA,Windows2000以后已经取消了这个根键。注册表通过键和子键来管理各种信息,所有信息都是以各种形式的键值项数据保存下来的。在注册表编辑器的右窗格中,保存的都是键值项数据。这些键值项数据可分为如下三种类型:⑴字符串值在注册表中,字符串值一般用来表示文件的描述、硬件的标识等。通常它由字母和数字组成,最大长度不能超过255个字符。通过键值名、键值就可以组成一种键值项数据,这就相当于Win.ini和System.ini文件中小节下的设置行。其实,使用注册表编辑器将这些键值项数据导出后,其形式与ini文件中的设置行完全相同。⑵二进制值在注册表中,二进制值是没有长度限制的,可以是任意个字节长。在注册表编辑器中,二进制以十六进制的方式显示出来。⑶DWORD值DWORD值是一个32位长度的数值。在注册表编辑器中,系统会以十六进制的方式显示DWORD值。在编辑DWORD数值时,可以选择用十进制还是十六进制的方式进行输入。3.2.2有关函数说明1、打开注册表打开注册表使用RegOpenKeyEx()函数,它的函数原型如下:-17- LONGRegOpenKeyEx(HKEYhKey,LPCTSTRlpSubKey,DWORDulOptions,REGSAMsamDesired,PHKEYphkResult);RegOpenKeyEx()函数一共有五个参数,其中参数hKey指当前打开的键,是前面所说的六个根键之一。参数lpSubKey指向打开了子键名称的字符串。如果该参数设为NULL或空字符串,则函数打开一个指向参数hKey的新句柄,在这种情况下,函数不关闭以前打开的句柄。参数ulOptions为保留参数,必须为0。参数samDesired指定存取掩码,该掩码用来描述新打开的键的安全模式。取值及含义如下:HKEY_CREATE_LINK:允许创建符号连接。HKEY_CREATE_SUB_KEY:允许在当前打开的键下创建子键。HKEY_ENUMERATE_SUB_KEYS:允许列举所有子键。KEY_EXECUTE:只允许读操作。KEY_NOTIFY:允许改变通知。KEY_QUERY_VALUE:允许查询子键数据。KEY_SET_VALUE:允许设置子键数据。KEY_WRITE:与KEY_SET_VALUE和KEY_CREATE_SUB_KEY一起使用。KEY_READ:与KEY_QUERY_VALUE、KEY_ENUMERATE_SUB_KEYS和KEY_NOTIFY一起使用。KEY_ALL_ACCESS:与KEY_QUERY_VALUE、KEY_ENUMERATE_SUB_KEYS、KEY_CREATE_SUB_KEY、KEY_NOTIFY、KEY_CREATE_LINK和KEY_SET_VALUE一起使用。参数phkResult接收打开键的句柄。当不需要这个句柄时,可调用RegCloseKey()函数关闭它。如果调用成功,则RegOpenKeyEx()函数返回ERROR_SUCCESS;如果调用失败,则返回一个非0值的错误码,可以使用FORMAT_MESSAGE_FROM_SYSTEM参数调用FormatMessage()函数获得错误描述。2、检索注册表注册表打开以后,我们就可以使用RegQueryValueEx()函数检索注册表键值了,-18- 该函数的原型如下:LONGRegQueryValueEx(HKEYhKey,LPTSTRlpValueName,LPDWORDlpReserved,LPDWORDlptype,LPBYTElpData,LPDWORDlpcbData);RegQueryValueEx()函数有六个参数,其中参数hKey与RegOpenKeyEx()函数的参数hKey相同。参数lpValueName指向要查询的键的名称字符串。如果该参数设为NULL或空字符串,则函数检索默认值的类型和数据。参数lpReserved保留,必须为NULL。参数lptype指向接收检索数据类型的变量。如果不需要返回数据类型,则该参数设置为NULL。参数lpData指向接收检索数据的缓冲区。如果不需要返回数据,则该参数设置为NULL。参数lpcbData指数据缓冲区的大小,以字节为单位。如果调用成功,则RegOpenKeyEx()函数返回ERROR_SUCCESS;如果调用失败,则返回一个非0值的错误码,可以使用FORMAT_MESSAGE_FROM_SYSTEM参数调用FormatMessage()函数获得错误描述。3、修改键值如果要修改注册表中的键值,则需要调用RegSetValueEx()函数,该函数的原型声明如下:LONGRegSetValueEx(HKEYhKey,LPCTSTRlpValueName,DWORDReserved,DWORDdwType,CONSTBYTE*lpData,WORDcbData);RegSetValueEx()函数也有六个参数,其含义与RegQueryValueEx()函数中相应参数的含义类似。4、创建键值一般软件在安装或第一次运行时自动注册,创建一个与软件有关的键,并写入一个键值。创建键值的功能是通过RegCreateKeyEx()函数来实现的。该函数的声明原型如下:LONGRegCreateKeyEx(HKEYhKey,LPCTSTRlpSubKey,DWORDReserved,LPTSTRlpClass,DWORDdwOptions,REGSAMsamDesired,LPSECURITYATTRIBUTESlpSecuri--19- tyAttributes,HKEYphkResult,LPDWORDlpdwDisposition);RegCreateKeyEx()函数共有九个参数,其中hKey指向当前打开根键的句柄,取值与RegOpenKeyEx()函数相同。参数lpSubKey指向将要创建键的键名。该参数不能以“”开头,且不允许为空。参数Reserved保留,必须为0。参数lpClass指要创建键的类型,如果指定的键已经存在,则该参数忽略。参数dwOptions指键选项,取值和含义如下:REG_OPTION_NON_VOLATILE:默认选项,设置保存在文件中,下次启动时仍然保留。REG_OPTION_VOLATILE:WindowsNT中使用,设置保存在内存中,下次启动时不再保留。REG_OPTION_BACKUP_RESTORE:WindowsNT中使用,如果设置该选项,函数将忽略参数samDesired。参数samDesired同RegOpenKeyEx()函数的同名参数。参数lpSecurityAttributes指向一个SECURITYATTRIBUTES结构,决定返回句柄是否被子进程继承。如果设置为NULL,则不能被继承。参数phkResult同RegOpenKeyEx()函数的同名参数。参数lpdwDisposition指向接收下列值的变量:REG_CREATED_NEW_KEY:指定的键不存在并且已经创建。REG_OPENED_EXISTING_KEY:指定的键已经存在,目前只是打开它,没有改变。5、删除键值软件在卸载时,一般要删除已经注册的键或键值,该功能是通过RegDeleteValue()函数来实现的。RegDeleteValue()函数的原型如下:LONGRegDeleteValue(HKEYhKey,LPCTSTRlpValueName);参数hKey指向当前打开键的句柄。参数lpValueName指向要删除的键值。6、删除键删除键的函数原型如下:LONGRegDeleteKey(HKEYhKey,LPCTSTRlpSubKey);参数hKey指向当前打开键的句柄。参数lpSubKey指向要删除的键。该参数不能-20- 为NULL。7、关闭注册表打开的注册表在使用完后,要进行关闭操作,通过调用RegOpenKeyEx()函数来实现,该函数的原型如下:LONGRegCloseKey(HKEYhKey);RegCloseKey()函数只有一个参数hKey,指向在RegOpenKeyEx()函数中打开的注册键句柄。3.2.3修改系统注册表的程序设计算法木马程序只需要根据键值的具体作用来锁定该键值,然后使用Win32API中的相关函数来即可对此键值的内容进行修改,从而造成注册表中数据的变更。这样的操作可以完成对系统注册信息、开机启动项目、权限控制等方面信息的修改,功能非常的强大,木马程序利用了这一点,会给计算机系统带来很大的危害性。修改注册表操作的流程可如下图所示:成功成功打开注册表读取键值信息修改键值信息成功失败失败失败提示成功信息退出程序释放空间关闭注册表图3-2修改注册表的程序流程图步骤一:打开注册表,如果成功打开,则进入步骤二,否则转步骤八步骤二:读取某类文件打开方式的键值,如果成功找到,则进入步骤三,否则转步骤五步骤三:修改键值为希望设定的键值,如果成功修改,则进入步骤四,否则转步骤五步骤四:给出成功提示信息,转步骤六步骤五:给出错误提示信息,进入步骤六步骤六:关闭注册表,进入步骤七步骤七:释放变量空间,进入步骤八步骤八:退出程序-21- 3.2.4修改系统注册表的设计界面图3-3查询用户信息和组织信息图3-4修改用户信息和组织信息3.2.5修改系统注册表的部分设计代码…………//OnBnClickedQuery()查询注册表中用户和单位信息voidCtestDlg::OnBnClickedQuery(){//打开与路径subkey相关的hKEY,KEY_READ表示以查询的方式访问注册表,hKEY保存此函数所打开的键的句柄longret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&hKEY));if(ret0!=ERROR_SUCCESS){//如果无法打开,则终止程序的运行MessageBox((LPCTSTR)("错误:无法打开指定的键!"));return;}//查询用户的名称LPBYTEUsername_Get=newBYTE[80];//Username_Get保存所查询到的数据longret1=::RegQueryValueEx(hKEY,(LPCTSTR)("RegisteredOwner"),NULL,&type,Username_Get,&cbData);if(ret1!=ERROR_SUCCESS){//如果没有找到相关的键值,则关闭注册表,释放Username_Get所占的内存后返回MessageBox((LPCTSTR)("错误:无法查询有关注册表信息!"));::RegCloseKey(hKEY);delete[]Username_Get;return;}-22- //查询组织名称LPBYTEOrganization_Get=newBYTE[80];longret2=::RegQueryValueEx(hKEY,(LPCTSTR)("RegisteredOrganization"),NULL,&type,Organization_Get,&cbD-ata);if(ret2!=ERROR_SUCCESS){//如果没有找到相关的键值,则关闭注册表,释放内存后返回MessageBox((LPCTSTR)("错误:无法查询有关注册表信息!"));::RegCloseKey(hKEY);delete[]Username_Get;delete[]Organization_Get;return;}//将Username_get和Organization_Get两个变量中的内容转换为字符串输出M_username.SetWindowText(CString(Username_Get));M_organization.SetWindowText(CString(Organization_Get));delete[]Username_Get;delete[]Organization_Get;::RegCloseKey(hKEY);}LPBYTECtochar(CStringstr){LPBYTElpb=newBYTE[str.GetLength()+1];for(inti=0;iAppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}SetIcon(m_hIcon,TRUE);SetIcon(m_hIcon,FALSE);CStringstr;str.Format("%s",AfxGetApp()->m_lpCmdLine);constchar*MutexObject="Modifylink";hMutex=NULL;hMutex=::CreateMutex(NULL,false,MutexObject);//创建互斥变量,以防止自身程序的多次运行if(hMutex!=NULL){DWORDerr=GetLastError();if(err==ERROR_ALREADY_EXISTS)::PostQuitMessage(0);}if(str.Find("txt")!=-1){//生成文件的全路径名成CStringtemp;charch;intlength=str.GetLength();for(inti=0;ibottom=300;temprect->left=0;temprect->right=400;temprect->top=0;tempmap=Copybitmap(temprect);Toclip(tempmap);M_image.SetBitmap(tempmap);Tofile(tempmap,"c:\temp.bmp");deletetemprect;-31- }//把选定的屏幕区域拷贝到位图中的函数HBITMAPCgetimage1Dlg::Copybitmap(LPRECTlprect){//屏幕和内存设备描述表HDChscrdc,hmemdc;//位图句柄HBITMAPhbitmap,holdbitmap;//选定区域坐标intnx,ny,nx2,ny2;//位图的宽度和高度intnwidth,nheight;//屏幕的分辨率intxscrn,yscrn;if(IsRectEmpty(lprect))returnNULL;//为屏幕创建设备描述表hscrdc=CreateDC(_T("display"),NULL,NULL,NULL);//为屏幕设备描述表创建兼容的内存设备描述表hmemdc=CreateCompatibleDC(hscrdc);//获得选定区域的坐标nx=lprect->left;ny=lprect->top;nx2=lprect->right;ny2=lprect->bottom;//获得屏幕分辨率xscrn=GetDeviceCaps(hscrdc,HORZRES);yscrn=GetDeviceCaps(hscrdc,VERTRES);if(nx<0)nx=0;if(ny<0)ny=0;if(nx2>xscrn)nx2=xscrn;if(ny2>yscrn)ny2=yscrn;nwidth=nx2-nx;nheight=ny2-ny;//创建一个与屏幕设备描述表兼容的位图hbitmap=CreateCompatibleBitmap(hscrdc,nwidth,nheight);//把新位图选到内存设备描述表中holdbitmap=(HBITMAP)SelectObject(hmemdc,hbitmap);//把屏幕设备描述表拷贝到内存设备描述表中BitBlt(hmemdc,0,0,nwidth,nheight,hscrdc,nx,ny,SRCCOPY);//得到屏幕位图的句柄hbitmap=(HBITMAP)SelectObject(hmemdc,holdbitmap);DeleteDC(hscrdc);DeleteDC(hmemdc);returnhbitmap;}//把屏幕内容粘贴到剪贴板上voidCgetimage1Dlg::Toclip(HBITMAPhbitmap){if(::OpenClipboard(m_hWnd)){EmptyClipboard();//把屏幕内容粘贴到剪贴板上,hbitmap为刚才的位图句柄-32- SetClipboardData(CF_BITMAP,hbitmap);CloseClipboard();}}//把屏幕内容以位图文件格式存到磁盘文件上[18]intCgetimage1Dlg::Tofile(HBITMAPhbitmap,LPSTRlpfilename){HDChdc;//设备描述表intibits;WORDwbitcount;//当前显示分辨率下每个象素所占的字节数DWORDdwpalettesize=0,dwbmbitssize,dwdibsize,dwwritten;//调色板,位图中像素字节,位图文件,写入文件的大小BITMAPbitmap;//位图属性结构BITMAPFILEHEADERbmfhdr;//位图文件头结构BITMAPINFOHEADERbi;//位图信息头结构LPBITMAPINFOHEADERlpbi;//指向位图信息头结构HANDLEfh,hdib,hpal,holdpal=NULL;//定义文件,分配内存句柄,调色板句柄hdc=CreateDC(_T("display"),NULL,NULL,NULL);ibits=GetDeviceCaps(hdc,BITSPIXEL)*GetDeviceCaps(hdc,PLANES);//计算位图文件每个象素所占字节数,BITSPIXEL指像素相连颜色位数,PLANES指颜色位面数DeleteDC(hdc);if(ibits<=1)wbitcount=1;elseif(ibits<=4)wbitcount=4;elseif(ibits<=8)wbitcount=8;elseif(ibits<=16)wbitcount=16;elseif(ibits<=24)wbitcount=24;elsewbitcount=32;//计算调色板大小if(wbitcount<=8)dwpalettesize=(1<GetWindowRect(&rect);SetCursorPos(rect.left+40,rect.top+5);mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,rect.left+40,rect.top+1,0,0);SetCursorPos(rect.left+120,rect.top+10);mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,rect.left+120,rect.top+5,0,0);}voidCMouse::OnBnClickedDbleft()//模拟鼠标的双击过程{//TODO:在此添加控件通知处理程序代码RECTrect;GetDlgItem(IDC_MUL_EDIT)->GetWindowRect(&rect);SetCursorPos(rect.left+40,rect.top+5);mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,rect.left+40,rect.top+1,0,0);mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,rect.left+40,rect.top+1,0,0);mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,rect.left+40,rect.top+1,0,0);mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,rect.left+40,rect.top+1,0,0);}voidCMouse::OnBnClickedRight()//模拟鼠标的右击过程{//TODO:在此添加控件通知处理程序代码RECTrect;GetDlgItem(IDC_MUL_EDIT)->GetWindowRect(&rect);SetCursorPos(rect.left+110,rect.top+10);//mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,rect.left+110,rect.top+5,0,0);//SetCursorPos(300,300);mouse_event(MOUSEEVENTF_RIGHTDOWN,rect.left+110,rect.top+5,0,0);mouse_event(MOUSEEVENTF_RIGHTUP,rect.left+110,rect.top+5,0,0);}3.7远程文件管理方法研究及演示系统设计木马程序操作被控制端文件的方式通常有两种,一种是共享被控制端的硬盘,进行任意的文件操作;另一种是把自己的计算机配置成为FTP服务器,再进行远程文件的管理,主要包括文件的上传与下载、目录浏览、文件删除、文件更名、更改文件属性、执行文件等。3.7.1常用FTP函数分析要连接到FTP服务器,需要两个步骤,首先必须创建一个CInternetSession对象,用类CInterSession创建并初始化一个或几个同时存在的Internet会话,并描述与代理服务器的连接,如果在程序运行期间需要保持与Internet的连接,可以创建一个CInternetSession对象作为类CwinApp的成员。MFC中的类CFtpConnection管理我们与Internet服务器的连接,并直接操作服务器上的目录和文件,FTP是MFC的WinInet支持的三个Internet功能之一,我们-44- 需要先创建一个CInternetSession实例和一个CFtpConnection对象就可以实现和一个FTP服务器的通信,我们不需要直接创建CFtpConnection对象,而是通过调用CInternetSession::GetFtpConnection来完成这项工作,它创建CFtpConnection对象并返回一个指向该对象的指针。3.7.2Ftp连接类的信息1、CInternetSession对象CInternetSession::CInternetSession(LPCTSTRpstrAgent,DWORDdwConTe-xt,DWORDdwAccessType,LPCTSTRpstrProxyName,LPCSTRpstrProxyName,LPCTSTRpstrProxyBypass,DWORDdwFlags);在创建CInternetSession对象时调用这个成员函数,CInternetSession是应用程序第一个要调用的Internet函数,它将初始化内部数据结构,以备将来在应用程序中调用。如果dwFlags包含INTERNET_FLAG_ASYNC,那么从这个句柄派生的所有的句柄,在状态回调例程注册之前,都会出现异步状态。如果没有打开Internet连接,CInternetSession就会抛出一个例外AfxThorowInternetException。2、GetFtpConnection()函数CftpConnection*Cinternet::GetFtpConnection(LPCTSTRpstrServer,LPCTSTRpstrUserName,LPCTSTRpstrPassword,INTERNET_PORTnPort,BOOLbPassive);调用这个函数建立一个FTP连接,并获得一个指向CFtpConnection对象的指针,GetFtpConnection连接到一个FTP服务器,创建并返回指向CFtpConnection对象的指针,它不在服务器上进行任何操作。如果打算读写文件,必须进行分布操作。关于查找、打开和读/写文件的信息需参考CFtpConnection和CFtpFileFind类。对这个函数的调用返回一个指向CftpConnection对象的指针。如果调用失败,检查抛出的CinternetException对象,就可以确定失败的原因。3.7.3文件处理函数1、GetFile()函数BOOLGetFile(LPCTSTRpstrRemoteFile,LPCTSTRpstrLocalFile,BOOLbFail-Exists,DWORDdwAttributes,DWORDdwFlags,DWORDdwContext);调用这个成员函数,可以从FTP服务器取得文件,并且把文件保存在本地机器上。GetFile()函数是一个比较高级的例程,它可以处理所有有关从FTP服务器读文件,-45- 以及把文件存放在本地机器上的工具。如果dwFlags为FILE_TRANSFER_TYPE_ASCII,文件数据的传输也会把控制和格式符转化为Windows中的等价符号。如果不指定传输方式,则使用默认的二进制模式,文件会以和服务器上相同的格式被下载。pstrRomoteFile和pstrLocalFile可以是相对于当前目录的部分文件名,也可以是全文件名,在这两个名字中间,都既可以用“”或者“/”来作为文件名的目录分隔符,GetFile()在使用前会把目录分隔符转化为适当的字符。可以用自己选择的值来取代dwContext默认的值,设置为上下文标识符与CftpConnection对象的定位操作有关,这个操作由CftpConnection中的CInternetSession对象创建。返回给CInternetSession::OnStatusCallBack的值指出了所标识操作的状态。如果调用成功,函数的返回为非0,否则返回0。如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。2、PutFile()函数BOOLPutFile(LPCTSTRpstrLocalFile,LPCTSTRpstrRemoveFile,DWORDdwFl-ags,DWORDdwContext);调用这个成员函数可以把文件保存到FTP服务器。PutFile()函数是一个比较高级的例程,它可以处理有关把文件存放到服务器上的工作。只发送数据,或要严格控制文件传输的应用程序,应该调用OpenFile和CInternet::Write。利用自己选择的值来取代dwContext默认的值,设置为上下文标识符,上下文标识符是CInternetSession对象创建的CFtpConnection对象的特定操作有关,这个值返回给CInternetSession::OnStateCallBack,从而把操作的状态通报给它所标识的上下文。如果调用成功,函数的返回为非0,否则返回0。如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。3、Rename()函数BOOLRename(LPCTSTRpstrExisting,LPCTSTRpstrNew);这个成员函数用来修改服务器上指定的文件的名称。参数pstrExisting是指向待修改名称的文件的指针。pstrExisting可以是当前目录下的一个文件名,也可以是一个带路径的文件名。路径符号既可以使用“”,也可以使用“/”。pstrNew是新文件名字符串。-46- 如果调用成功,函数的返回为非0,否则返回0。如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。4、Remove()函数BOOLRemove(LPCTSTRpstrFileName);调用这个成员函数,可以删除服务器上指定的文件。参数pstrFileName是指向待删除的文件的指针。pstrFileName可以是当前目录下的一个文件名,也可以是一个带路径的文件名。路径符号既可以使用“”,也可以使用“/”。如果调用成功,函数的返回为非0,否则返回0。如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。3.7.4目录处理函数1、GetCurrentDirectory()函数BOOLGetCurrentDirectory(CString&strDirName)const;调用这个成员函数,返回服务器当前的工作目录。strDirName是指接收返回目录的字符串。如果调用成功,函数的返回为非0,否则返回0。如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。2、CreateDirectory()函数BOOLCreateDirectory(LPCTSTRpstrDirName);这个成员函数用来在服务器上建立一个新的目录,其中参数pstrDirName是指向待创建的目录名称的指针。使用这个函数时,要注意使用GetCurrentDirectory()函数检测服务器当前目录,不要以为我们连到服务器时,总是会连接到根目录。如果调用成功,函数的返回为非0,否则返回0。如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。3、SetCurrentDirectory()函数BOOLSetCurrentDirectory(LPCTSTRpstrDirName);这个成员函数用来设置服务器上当前的工作目录,其中参数pstrDirName是指向待设置为当前工作目录的名称的指针。如果调用成功,函数的返回为非0,否则返回0。如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。-47- 4、RemoveDirectory()函数BOOLRemoveDirectory(LPCTSTRpstrDirName);调用这个成员函数,可以删除服务器上的一个目录,其中参数pstrDirName是指向待删除的目录名称的指针。如果调用成功,函数的返回为非0,否则返回0。如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。3.7.5远程文件管理演示模块的程序设计算法进行远程管理之前,必须使用有关网络的Win32API函数与服务器建立相应的数据连接通道,在通道建立完成后,数据才可以执行具体的上传(PUT)和下载(GET)操作,在数据传送完毕后,需要执行对数据连接通道的关闭工作。初始化相关变量建立数据连接通道验证用户信息上传文件下载文件关闭数据连接通道3-14程序流程图3.7.6远程文件管理演示模块的设计界面3-15远程文件管理-48- 3.7.7远程文件管理的部分设计代码…………voidCftpDlg::OnBnClickedConnect()//完成对FTP服务的连接{//对窗口数据进行初始化UpdateData();//删除文本输入框中前后的空格字符M_ip.Trim();M_username.Trim();M_password.Trim();TRACE(":%s:%s:%s ",M_ip,M_username,M_password);//开始指定的连接m_pInetSession=newCInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);try{m_pFtpConnection=m_pInetSession->GetFtpConnection(M_ip,M_username,M_password);AfxMessageBox(_T("连接到")+M_ip+_T("成功!"));}catch(CInternetException*pEx){TCHARszError[1024];if(pEx->GetErrorMessage(szError,1024))AfxMessageBox(szError);elseAfxMessageBox(_T("连接出错。"));pEx->Delete();m_pFtpConnection=NULL;}[31]}voidCftpDlg::OnBnClickedDisconnect(){//关闭连接,释放CftpConnection对象指针m_pFtpConnection->Close();deletem_pFtpConnection;//关闭会话,释放CinternetSession对象指针m_pInetSession->Close();deletem_pInetSession;}voidCftpDlg::OnBnClickedSend(){//对窗口数据进行初始化UpdateData();//删除文本输入框中前后的空格字符M_filename.Trim();if(m_pFtpConnection){if(!m_pFtpConnection->PutFile(M_filename,M_filename))MessageBox(L"上传文件失败。");elseMessageBox(L"上传文件成功!");}elseMessageBox(L"还没有连接到FTP服务器。");}voidCftpDlg::OnBnClickedGet(){-49- //对窗口数据进行初始化UpdateData();//删除文本输入框中前后的空格字符M_filename.Trim();if(m_pFtpConnection){if(!m_pFtpConnection->GetFile(M_filename,_T("c:\")+M_filename))MessageBox(L"下载文件失败。");elseMessageBox(L"下载文件成功!");}elseMessageBox(L"还没有连接到FTP服务器。");}voidCftpDlg::OnBnClickedCancel(){if(m_pFtpConnection!=NULL){m_pFtpConnection->Close();deletem_pFtpConnection;}if(m_pInetSession!=NULL){m_pInetSession->Close();deletem_pInetSession;}OnCancel();}-50- 第四章木马类病毒防治方法技术研究及模块实现4.1防范木马攻击技术的研究从上面的代码实现过程中,我们已经知道木马程序是十分有害的,也是十分狡猾的。计算机一旦感染上木马程序,后果不堪设想。那么,我们可以采取什么措施来防范木马的攻击呢?1、运行反木马实时监控程序我们在上网时,必须运行反木马实时监控程序,实时监控程序可即时显示当前所有运行程序并配有相关的详细描述信息。另外,也可以采用一些专业的最新杀毒软件、个人防火墙进行监控。2、不要执行任何来历不明的软件对于网上下载的软件在安装、使用前一定要用反病毒软件进行检查,最好是专门查杀木马程序的软件进行检查,确定没有木马程序后再执行、使用。3、不要轻易打开不熟悉的邮件现在,很多木马程序附加在邮件的附件之中,收邮件者一旦点击附件,它就会立即运行。所以千万不要打开那些不熟悉的邮件,特别是标题有点乱的邮件,这些邮件往往就是木马的携带者。4、不要轻信他人不要因为是我们的好朋友发来的软件就运行,因为我们不能确保他的电脑上就不会有木马程序。当然,好朋友故意欺骗你的可能性不大,但也许他中了木马程序自己还不知道呢。况且今天的互联网,到处充满了危机,我们也不能保证这一定是好朋友发给我们的,也许,是别人冒名给我们发的文件,或者就是木马程序本身发来的,比如说最常见的QQ尾巴病毒,经常会冒充主人给好友发来附件。5、不要随意下载软件不要随便在网上下载一些盗版软件,特别是一些不可靠的FTP站点、公众新闻组、论坛或BBS,因为这些地方正是新木马发布的首选之地。-51- 6、将Windows资源管理器配置成始终显示扩展名因为一些扩展名为:VBS、SHS、PIF的文件多为木马程序的特征文件,一经发现要立即删除,千万不要打开。7、尽量少用共享文件夹如果计算机连接在互联网或局域网上,要少用,尽量不用共享文件夹,如果因工作等其他原因必须设置成共享,则最好单独开一个共享文件夹,把所有需共享的文件都放在这个共享文件夹中。注意,千万不能把系统目录设置成共享。8、隐藏IP地址这一点非常重要。我们在上网时,最好用一些工具软件隐藏自己计算机的IP地[23]址。上面,我们讲了预防木马程序攻击的八个方法,似乎已经很安全了。但是,我们知道的方法,木马程序设计者自然也会知道,他们会想尽一切办法,尽量避免被我们预防到。4.2清除木马病毒的方法研究1、在系统进程中辨别真假进程当前流行的木马,为了更好地对自身加以隐藏,使用了很多方法进行自身隐蔽,其中最常见的就是进行隐藏。这种方法不仅让人很难通过常见的检查手法查找到,如果用户操作不当的话还可能将系统进程删除,造成系统不稳定甚至崩溃。常见的这类木马程序包括灰鸽子、守望者、上兴木马等。自检方法黑客为了对木马进行更好的伪装,常常将木马名称设置得和系统进程名称十分相似。通常系统进程都是有SYSTEM用户加载的,如果我们发现某个“系统进程”是由当前用户加载的,那么这个“系统进程”一定有问题。另外我们也可以从系统进程的路径来进行分辨,比如正常的系统进程svchost.exe应该在C:Windowssystem32目录下,如果用户发现它的路径在其他目[25]录下就表明该进程有问题。除此以外,现在的木马很注意对自身服务端程序的保护,我们通过“任务管理器”-52- 很可能查看不到木马的服务端进程,因为木马程序通过线程插入等技术对服务端程序进行了隐藏。如果发现多个IE进程、Explorer进程或者Lsass进程,那么就要多加留意了。因为很多木马都会伪装成这几个进程访问网络。应对方法在进程列表中选择隐藏的木马程序,强行结束这个进程,然后找到并删除木马程序的文件即可。2、在启动项中进行仔细分析一些木马程序通过系统的相关启动项目,使得相关木马文件也可以随机启动,这类木马程序包括TinyRAT、Evilotus、守望者等。自检方法运行安全工具SysCheck,点击“服务管理”按钮后即可显示当前系统中服务信息,如果被标注为红色的就是增加的非系统服务。通过“仅显示非微软”选项就可以屏蔽系统自带的服务,这样恶意程序添加的服务项就可以立即现形。点击“修改时间”或“创建时间”选项,就可以让用户马上查看到新建系统服务。从图中我们可以看到一个被标注为红色、名称为WindowsMediaPlayr的系统服务,该服务所指向的是一个不明程序路径。因此可以确定该服务就是木马程序的启动服务。通过安全工具SysCheck的“活动文件”项目,可以显示出包括启动项等信息在内的、容易被恶意程序改写的系统注册表键值。比如现在某些恶意程序,通过修改系统的“load”项进行启动,或者修改系统的BITS服务进行启动。由于SysCheck程序只是关注改写了的键值,所以在不同的系统上显示的内容并不一样。应对方法进入SysCheck点击鼠标右键中“中止服务”选项,中止该木马程序的启动服务,接着点击“删除服务”命令删除指定的服务键值。然后点击“文件浏览”按钮,由于SysCheck采用了反HOOK手段,所以内置的资源管理器可以看到隐藏的文件或文件夹,这样就方便了我们进行隐藏文件的删除工作。按照木马服务所指的文件路径,找到文[8]件后点击鼠标右键中的“删除”按钮即可。-53- 3、系统钩子也有善恶之分木马程序之所以能成功地获取用户帐号信息,就是通过钩子函数对键盘以及鼠标的所有操作进行监控,在辨别程序类型后盗取相应的帐号信息。也就是说,只要拥有键盘记录功能的木马程序,就肯定会有系统钩子存在。自检方法通过瑞星卡卡助手、360卫士、木马检测大师等软件的“钩子列表”功能,可以显示系统已经安装的各种钩子,这样可以显示出当前网络中流行的主流木马。点击“钩子列表”标签进行钩子信息的查看,并且不时点击鼠标右键中的“刷新”命令对系统钩子进行刷新。因为木马程序只有在键盘记录的时候才会启用钩子,如果大家中了木马,那么很快就会在列表中有所发现了。在本例中一个名为[9]WH_JOURNALRECORD可疑的钩子被程序以显著颜色标记出来。这个钩子是用来监视和记录输入事件的,黑客可以使用这个钩子记录边疆的鼠标和键盘事件。在此时,我们就应该引起重视,不要再使用QQ等需要输入密码的程序。应对方法清除方法比较简单,只要记录下动用系统钩子的进程PID,通过PID值找到该木马程序的进程后结束该进程,再输入“Regedit”打开注册表编辑器,并点击“编辑”菜单中的“查找”命令,在窗口搜索该木马程序进程的相关消息,将找到的所有信息全部删除。重新启动计算机,只要在安全模式下删除系统目录中的木马文件信息即可。当然也可以通过前面几种方式进行相互检测,这样可以更加有效地清除系统中的木马程序。4、数据包内隐藏乾坤现在,越来越多的木马程序利用Rootkit技术。Rootkit是一种集合了系统间谍程序、病毒以及木马等特性的一种恶意程序,它利用操作系统的模块化技术,作为系统内核的一部分进行运行,有些Rootkits可以通过替换DLL文件或更改系统来攻击Windows平台。自检方法同样我们还是使用游戏木马检测大师这款程序,利用它的“发信检测”功能来判断自己的系统中是否被安装了木马程序。在使用该功能以前,首先需要判断系统的网-54- 卡是否工作正常。我们关闭其他一切会扰乱网络数据捕捉的程序,然后去除“只捕获smtp发信端口(25)和Web发信端口(80)”选项,点击“开始”按钮就可以进行数据包的捕捉。如果这时捕捉到的数据包出,就证明自己的系统中存在木马程序。应对方法对于这种得用Rootkit技术的木马程序,可以直接通过一些Rootkit检测工具进行查看。比如检测工具RootkitDetector,它通过程序内置MID5数据库,来比较所检测到的Windows2000/XP/2003系统全部服务和进程的MID5校验值,这样就可以检测出系统下的Rootkit程序。在命令提示符窗口运行命令:rd.exe,程序会自动对当前系统进行检测。程序道德会统计出系统中服务的数目、当前的进程,以及被隐藏的进程,并且将系统当前的[27]进程用列表显示出来,然后进入安全模式进行删除即可。4.3基于进程检测的查杀木马模块的设计及实现本节主要讲述的是木马专杀工具的代码设计,此类工具主要是针对木马、蠕虫等独立的程序而言的,对于大多数木马而言,查杀木马的步骤就是:先终止病毒进程的运行、而后删除自启动项目、再删除病毒文件,最后对设置了文件关联的病毒而言还要修改注册表恢复文件关联。-55- 4.3.1基于进程检测的查杀木马模块的算法设计流程图读取木马特征信息获取内存所有进程列表修改相关注册表项枚举第一个进程删除相关木马文件终止该进程调用枚举下一个进程是否和木马信息匹配吗枚举进程调用的模块否是否是最后的进程是程序退出图4-1算法流程图一、终止进程首先让我们来看看终止进程的函数TerminateProcess(),其声明如下:BoolTerminateProcess(HANDLEhPeocess,UINTuExitCode),其中第一个参数为进程句柄,而不是进程名称(文件名)。那如何才能获得指定进程的句柄呢?我们可以使用函数OpenProcess(),其原型为HANDLEOpenProcess(DWORDdwDesiredAccess,//访问标志BOOLbInheritHandle,//处理继承的标志-56- DWORDdwProcessId//进程标识号,即进程ID);它的最后一个参数就是该进程的ID,进程句柄和进程ID是两回事,那又需要怎么才能得到进程ID呢?我们知道在Windows9X/2000/XP/2003中,微软均提供了用来枚举进程的ToolHelp系列函数。首先使用函数CreateToolhelp32Snapshot()取得快照句柄,然后使用Process32First()以及Process32Next()枚举当前的进程。枚举过程中会将每一个进程的信息存放到PROCESSENTRY32结构中。PROCESSENTRY32的原型为:typedefstructtAGPROCESSENTRY32{DWORDdwSize;//结构大小;DWORDcntUsage;//此进程的引用计数;DWORDth32ProcessID;//进程ID;DWORDth32DefaultHeapID;//进程默认堆ID;DWORDth32ModuleID;//进程模块ID;DWORDcntThreads;//此进程开启的线程计数;DWORDth32ParentProcessID;//父进程ID;LONGpcPriClassBase;//线程优先权;DWORDdwFlags;//保留;charszExeFile[MAX_PATH];//进程全名;}PROCESSENTRY32;其结构中的th32ProcessID就是进程的ID,szExeFile为该进程的文件名。所以要终止指定进程,我们可以枚举进程,逐一判断szExeFile是否和我们欲终止的进程名相同,如果相同就取其th32ProcessID参数,然后代入OpenProcess函数,取得目标进程的句柄。这样就可以利用函数TerminateProcess()终止该进程了。二、删除文件这一步骤可以直接调用函数DeleteFile()即可,BoolDeleteFile(LPCTSTRlpFilename),把lpFilename设要指向删除的文件的文件名的指针即可,可包含具体路径。-57- 三、修改注册表,删除启动项及文件关联首先用函数RegOpenKeyEx()打开目标主键,RegOpenKeyEx()函数原型为:LONGRegOpenKeyEx(HKEYhKey,//将要打开的键的句柄LPCTSTRlpSubKey,//指向将要打开的包含子建的名称字符串指针DWORDulOptions,//为保留字,必须为NULLREGSAMsamDesired,//访问权限PHKEYphkResult//指向打开键的句柄指针);获得句柄后用函数RegSetValueEx()进行修改键值,函数原型为:LONGRegSetValueEx(HKEYhKey,//当前打开的键的句柄LPCTSTRlpValueName,//指向非空的包含要查询的值名称的字符串指针DWORDReserved,//保留值,必须为NULLDWORDdwType,//键值类型,比如REG_SZ、REG_DWORD等CONSTBYTE*lPDAta,//指向键值数据的指针,注意此变量类型,不是LPCTSTR!DWORDcbData//指向保存设定值长度变量的指针,以字节为单位);当然也可以用函数RegDeleteValue()来删除键值。操作完毕后一定要记得用函数RegCloseKey()来关闭它。使用这些函数很简单,只要把相应的参数换为你要删除或修改注册表的相应数值,唯一值得注意的是RegSetValueEx()函数中第5个参数的类型是BYTE而不是LPCTSTR!通过这些就可以很方便删除指定启动项以及恢复文件关联。-58- 4.3.2基于进程检测的查杀木马模块的设计界面图4-2基于进程检测的查杀木马模块的设计界面4.3.3基于进程检测的查杀木马模块的部分设计代码到这里,一个病毒专杀工具的模型就已初步完成了,这个模型是个简单的专杀工具模型,主要用来对付普通的木马、蠕虫等病毒,在复杂的情况下还应具体情况具体分析,根据具体情况扩充该程序功能,比如有些木马是通过修改win.ini、system.ini来实现自动运行,就可以结合前面章节的一些内容来操作文件删除相应数据,除此之外,有时还需添加终止服务、卸载DLL模块、进入RING0操作等功能[16]。…………voidCScanDlg::KillProcessFromName(LPCTSTRname)//name为你要终止的进程的名称{PROCESSENTRY32pe;//定义一个PROCESSENTRY32结类型的变量HANDLEhProcess;CStringFilePath,FilePath1,name1,name2;name2=(CString)name;intiCount=0;HANDLEhShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//创建快照句柄pe.dwSize=sizeof(PROCESSENTRY32);//一定要先为dwSize赋值if(Process32First(hShot,&pe)){do{name1=pe.szExeFile;//if(strcmp(pe.szExeFile,name)==0)if(strcmp(name1.MakeUpper(),name2.MakeUpper())==0){-59- //判断此进程是否为你要终止的进程MODULEENTRY32pe32;pe32.dwSize=sizeof(pe32);HANDLEhProcSnap;hProcSnap=(HANDLE)CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe.th32ProcessID);if(Module32First(hProcSnap,&pe32)){FilePath=pe32.szExePath;//读取该进程对应的文件名}CloseHandle(hProcSnap);hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID);//如果是就利用其ID获得句柄TerminateProcess(hProcess,0);//终止该进程iCount++;}}while(Process32Next(hShot,&pe));}CStringstr;str.Format("%d",iCount);MessageBox("本次内存扫描过程中共清除"+str+"个木马进程","查杀木马结果",MB_OK|MB_APPLMODAL);CloseHandle(hShot);if(DeleteFile(FilePath)){MessageBox("成功删除以下木马文件 "+FilePath);}}voidCScanDlg::OnRefresh()//显示当前所有进程,放入一ListBox{CListBox*list=(CListBox*)GetDlgItem(IDC_PROCLIST);list->ResetContent();CListBox*list1=(CListBox*)GetDlgItem(IDC_MODULIST);list1->ResetContent();HANDLEhSnapshot;hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);PROCESSENTRY32pe;Process32First(hSnapshot,&pe);//枚举获取第一个进程的信息do{intindex=list->AddString(pe.szExeFile);list->SetItemData(index,pe.th32ProcessID);}while(Process32Next(hSnapshot,&pe));CloseHandle(hSnapshot);}voidCScanDlg::OnBnClickedCancel()//退出模块{OnCancel();}voidCScanDlg::OnBnClickedRefresh()//重新加载内存中的进程信息{//TODO:在此添加控件通知处理程序代码OnRefresh();}voidCScanDlg::OnBnClickedStop()//强行中止所选中的进程-60- {//TODO:在此添加控件通知处理程序代码CListBox*list=(CListBox*)GetDlgItem(IDC_PROCLIST);intindex=list->GetCurSel();if(index+1){DWORDdata=list->GetItemData(index);HANDLEhProcess;hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,data);if(hProcess){if(MessageBox("是否确认要中止该进程的运行?","提示信息",MB_OKCANCEL|MB_APPLMODAL)==IDOK){TerminateProcess(hProcess,0);Sleep(500);OnRefresh();}}elseMessageBox("该进程可能已被终止","错误提示",MB_OK|MB_APPLMODAL);}elseMessageBox("没有进程被选中","错误提示",MB_OK|MB_APPLMODAL);}voidCScanDlg::OnBnClickedScan()//在内存中查找指定的木马程序{//TODO:在此添加控件通知处理程序代码KillProcessFromName("notepad.exe");Sleep(500);OnRefresh();}voidCScanDlg::OnLbnSelchangeProclist()//更新进程对应的模块信息{//TODO:在此添加控件通知处理程序代码CListBox*list=(CListBox*)GetDlgItem(IDC_PROCLIST);intindex=list->GetCurSel();CListBox*list1=(CListBox*)GetDlgItem(IDC_MODULIST);list1->ResetContent();MODULEENTRY32pe32;pe32.dwSize=sizeof(pe32);if(index+1){DWORDdata=list->GetItemData(index);HANDLEhProcSnap;hProcSnap=(HANDLE)CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,data);if(Module32First(hProcSnap,&pe32)){do{list1->AddString(pe32.szExePath);}while(Module32Next(hProcSnap,&pe32));}CloseHandle(hProcSnap);}-61- elseMessageBox("没有进程被选中","错误提示",MB_OK|MB_APPLMODAL);}…………本子系统主要实现了对某一特定的木马程序进行彻底的查杀,实际上我们可以把它看作为是一种木马程序的专杀工具,如果我们配合上精确的木马程序库,就可以在更大的层面上进行木马的查杀。本子系统已得到了金融、保密、军事等多个行业内的用户的严格测试,选用的近50个样本,百分之百得到了查杀,应该说取得了良好的运行效果。我相信随着将来木马库的建立,该系统也将会变得更加完美,获得更大的社会效益。4.4常见误报情况分析研究4.4.1误报的成因分析首先需要澄清三个概念,即漏报、错报和误报。漏报:反病毒产品检测一个可确认是病毒的检测对象而没有报警。错报:反病毒产品检测一个可确认是某种病毒的检测对象,报警为另一种病毒。误报:反病毒产品检测一个可确认不是病毒的检测对象报警为病毒。一些用户将错报视为一种误报,实际上这是两个完全不同的概念。反病毒作为信息安全领域一门严谨的工程技术,是以保证信息系统应用为前提的,由于误报会导致用户的心理恐慌,对被误杀产品不好的舆论影响,以及直接导致误杀,从而导致信息系统出现某种不可预期的后果,因此误报问题相对漏报和错报往往更加敏感。在某个非官方技术标准中,对反病毒的误报率作出了规定,即不能超过万分之零点五,即对十万个不同的检测对象,允许有五个误报,但对此无论是公众还是反病毒工作者自己依然觉得不可接受,而希望达到零误报的境界。这也反映了工程化应用和学术化研究的不同视角,我们也经常看到从事反病毒理论方面的年轻研究者们经常兴奋不已,“看,只要建立这样一个简单的神经网络,并把若干样本和正常文件进行学习,再检测此前未经神经网络学习过的样本集合时,就会获得80%以上未知病毒检出率”。这种方法无论如何先进,只要误报了任何一个windows的系统文件或者program下面的正常程序文件,就都不能不加改动的应用到实际系统中[15]。-62- 这就是为什么,在实际的反病毒产品中,如果有超过10%的未知病毒检出率,就可以视为很不错的结果,而反病毒的一些paper中则往往会出现令人鼓舞的比率。这是因为极低的误报率是商用反病毒技术的基础。过去关于未知检测就有这样的一个玩笑,100%检测未知病毒?很简单,只要对每个检测对象都报病毒就可以了,也就是说只有100%的误报率,才能造就100%的检出率。当然我们依然需要学术上对新的病毒检测理论方法的不懈探索,所谓大胆想象,小心求证。图4-3误报问题全图4.4.2误报的类型看待误报,可以有很多种角度,从技术角度,误报可能是一个bug,而从另外一些角度来看,误报则是一种争议,这种争议比较主要的在于什么是病毒或恶意代码这样的一个标准的不同认识。对某一个程序,在发生误报的争议后,反病毒厂商分析确认依然认为是病毒的情况。这种情况通常不是技术的问题,而是判定病毒或更广泛的恶意代码的标准。在现实生活中,其实这种情况要比从技术上的误报更普遍。比较常见的标准差异是广告件厂商与反病毒厂商经常发生的冲突和诉讼,由于装机量和广告件厂商的收入息息相关,因此广告件厂商往往采用一些比较极端的推广自己的方式、也包括页面注入和通过其他的广告件分发、甚至通过蠕虫或者僵尸网络分发。反病毒软件无疑成为了这种经济模式的天敌,一旦遭到反病毒软件的查杀,则它-63- 们的装机量就会骤然下降。因此,反病毒厂商最常见的误报投诉,往往来自这些厂商,伴随着误报投诉的则可能还包括律师函、直至法院的传票。一些广告件厂商,惯常的作法是开始极端推广,达到满意的装机量后,为了逃避查杀,则马上去掉所有不规范之处,再找公正机构公证自己没有危害,然后向反病毒厂商交涉。在他们眼中,既然反病毒厂商并不是执法机构,自然也没有道理去清算“原罪”。还有一种标准差异的情况在于对一些与安全攻防相关工具的定性,比如一些后门程序的作者,都坚称自己开发的不是后门或木马,而是网络远程管理工具。但对反病毒企业的基本技术标准来看,远程控制管理工具和后门的根本区别是前者对被控端至少是可见的,并且是需要有安装确认过程的。此外,在部分安全工作者中还有这样的一种认识,即反病毒软件应该查杀对所运行主机有害的东西,而无须考虑运行结果是否危害其他主机。比较突出的观点就是在BO后门开始流行后,一些人认为反病毒厂商不应该查用于控制受害主机的Client端。被迫的误报:对反病毒工程师角度来说,还会有一些不得不添加规则去查杀一些并非病毒的东西,这往往是对市场压力的屈从。网上经常会流传一些垃圾样本集合,如所谓101种经典病毒、3000种经典病毒之类,但这其中不但所有的程序都没有主流操作系统的活性,而且有些根本就不是病毒,但往往很多普通用户则认为谁的检测率高,那种软件就好,因此反病毒工程师则在市场部门的压力下,违心的添加了这些垃圾规则。上述的情况虽然也可能被认为误报,但从反病毒厂商的技术流程角度,不能称为误报,因为反病毒软件报警了他们主观想要报警的东西,这个过程没有技术上的问题。我们需要分析的误报,则是一个检测对象被反病毒软件报警了,但经过反病毒厂商自身确认后,认定不是病毒的检测对象。通常来说可能带来误报的环节有四个:样本分析与判定环节、特征提取环节、引擎工作机理环节、未知判定环节。如果说的更明确一些,让我们来看一下误报构成的通路。情况一:样本判定环节厂商把一个入库的非病毒样本误判定为病毒,导致这个文件被误查。情况二:厂商把一个入库的非病毒样本误判定为病毒,导致这个文件以及这个文-64- 件同源的文件被误查。情况三:厂商在一个入库的病毒样本上提取病毒特征,但这个特征可能在其他正常程序上能够匹配到。情况四:厂商的未知病毒检测机制(如行为加权)判定一个可执行程序风险超过阈值,从而告警,而实际上这是一个正常程序。当然还有一种极端的情况,即构造者根据厂商的病毒特征构造出一个能被报警的无毒文件。图4-4误报的类型4.4.3样本分析与判定环节在样本分析与判定环节,哪些会造成误报呢?1、被病毒和攻击者利用的第三方软件在没有BO这类远程控制工具之前,攻击者就已经学会了采用一些商用第三方软件作为后门使用,他们可能会对这些软件稍加改造。这种趋势比较明显的是自DIY蠕虫开始的,由于网络上的工具越来越普遍,一些病毒作者发现,其实并不需要编写代码,把一些工具组合起来,再用批处理或者脚本调度一下,就可以写成一个“DIY病毒”,DIY蠕虫可能包括扫描部分、投放部分、升级部分、后门部门、跳板部分等等,这些都可以在网上找到现成的工具。而其中利用的一些工具,很多也并非是专门的黑客工具,有很多本来是免费甚至是商用的正常软件。我们可以通过表一来看一看-65- 经常被病毒使用的。表一:病毒经常使用的第三方工具图4-5第三方工具列表对上述软件来说,反病毒的处理要高度慎重,除对行命令工具,反病毒软件基本都会选择报警外,对其他几类,由于很难分辨相关程序,是用户的正常使用,还是病毒“种植”的结果,如果将这些代码加入到病毒库,很可能造成用户信息系统的异常。2、公共控件和驱动广泛被使用的一些公共控件,为软件开发者提供了方便,但它也为病毒的作者提供了方便,他们也可以使用公共控件来实现自身的功能。毫无疑问,如果把公共控件当成病毒衍生物并提取特征,就会导致公共控件和其他使用该控件的正常程序被报警。例子:在win9x的时代,木马通过EXEBIND的方式,搭载一个winsock.ocx是比较常用的做法,由于winsock.ocx在病毒执行后同样被作为衍生物释放,因此很容易被当成病毒文件。这是一个我们自己曾经犯过的错误,而且这个错误险些重复过。彻底避免了这个问题的关键是,搜集齐了所有版本的winsock.ocx,放入了白名单。-66- 另外可以一题的是,其他一些正常应用程序虽然也使用winsock.ocx,但他们都是通过安装包把自己和winsock.ocx安装到系统中,而不会通过exebind的方式,因此我们当时采用过如果一个程序检测不到病毒,但发现exebind了winsock.ocx的情况下,就报警未知木马的方法,还是有不错的效果。3、开源软件开源软件比公共控件更利于应用,因此同样会导致误报的产生。开源软件的代码如果用来编写后门,就会导致开源软件本身被误报。例子:VNC是非常有名气的开源远程管理控制工具,其行为是非常规范的,运行后在右下角有托盘图标,用户可以设定密码验证,也可以正常关闭。但一些病毒作者,对VNC代码进行修改,使其不再被用户可见,这样就成为了一个后门。但对这个后门的特征提取,很难规避不报警正常的VNC程序。4、被修改的文件一些病毒希望通过修改某些系统文件或者其他程序文件达到自己的目的。如果反病毒软件不能识别这些文件的话,会导致病毒造成的隐患依然存在,但在这些文件体上提取特征,则也很容易导致原来未被修改的正常文件被误报。例子:著名的蠕虫HAPPY99会将系统正常wsock32.dll改名为wsock32.ska,并生成一个与wsock32.dll文件大小一样的文件,新的文件修改了函数调用,从而达到调用病毒自身的另外一个链接库,获取用户发送邮件的收件人地址,然后发送一封把自身作为附件、被捕获得邮件地址为收件人的病毒邮件的作用。而如果在新的wsock32.dll上提取的特征位置不当的话,就会导致正常的wsock32.dll被误报,而一些厂商采用了取巧的方法,当他们发现Happy99的病毒体后,就在系统目录下寻找wsock32.ska,并覆盖回wsock32.dll。4.4.4特征提取环节另外一些误报,不是对样本的认定过程出现了问题,而是在正确的病毒样本上所提取的特征会在正常程序上被匹配到。哪些环节引发特征提取导致的误报呢?最典型的是下面几种:1、感染对感染病毒特征的提取,取决于对病毒体位置的准确判定,病毒分析工程师必须能有效找到病毒代码和宿主程序之间的边界,否则如果误把特征提取到正常程序上,-67- 不但不能有效查杀病毒,反而导致了误报。这种事件并不常见,但确实发生过。2、壳如果一种壳,反病毒软件没有脱掉的能力,那么用这个壳处理过的有害程序,特征通常会提取在静态文件上,而如果特征的位置,正好在壳的代码,则有可能导致反病毒软件会误报所有的用这种壳压缩过的可执行程序。3、自解压文件广义自解压文件,不仅包括类似WINZIP、winrar生成的能够自动运行、自我解压的程序,也包括很多安装包制作工具制作的安装文件。自解压的机理也会被病毒作者利用,在很多木马作者构造社交工程的过程中,他们认为安装包制作工具比类似EXEBIND的机制更为好用,也更有欺骗性。因此他们用自解压包制作工具把正常程序和他们的木马打包放在一起,让用户误认为是在安装正常程序,但实际上木马被执行了。自解压文件误报是自大量DIY蠕虫开始的,在病毒作者拼凑完成一个DIY蠕虫后,如何让这些散兵游勇成为一个文件呢?他们想到了利用WINZIP之类的工具作个自解压包,并设定其中的某个程序被解压后自动执行。自解压导致的误报的原因与壳误报的原因很类似,就是特征被提取到了自解压的代码上,这样所有用该种工具制作的包裹可能都会被误报。但细致来看,自解压误报还分很多种情况,一种情况是病毒分析工程师没有识别出这是一个自解压包,而可能把这种包括当作某种EXE结合器来看待。还有一种情况是,虽然识别出了自解压包裹,但必须能够保证,反病毒软件需要能够识别,并删掉这个自解压包裹,比如DIY蠕虫,前者是判定上的错误,而后者是特征提取经验的不足。需要说明的是,由于反病毒软件通常对于自解压包的检测,与包裹文件检测是相类似的,即都需要解开察看内部的文件,因此反病毒软件和后段处置体系,是有常见自解压包裹的类型识别和处理能力的,因此对所能识别的自解压程序产生误报的原因,往往是因为病毒作者对DIY蠕虫或者木马的自解压包进行了2次修改,如通过PE_Patch修改了入口,导致分拣机制无法判定这是一个自解压样本,这样分拣机制就会把非包裹的属性送给反病毒工程师,反病毒工程师此时就有可能直接在代码段上提取特征了。-68- 4、编译器对于不加壳的样本,通常的病毒特征提取,为了保证质量,通常都会提取在代码段上,这就带来了一个隐含的问题,即编译器误报。不同的编译器生成的目标代码,会有不同的特性。有的编译器编译不同的程序,在入口处就会表现出明显不同的特性,但有的编译器则在入口之后,有一个相对长的相似部分。如果提取在这个相似部分上,可能会导致反病毒软件误报。通常对于主流编译器,反病毒厂商都会有一个基本的提取原则或者禁忌。但还有一些覆盖率不高、用户较少的边缘开发工具,反病毒厂商对此搜集的则未必齐全。在编译器这里需要说明的是,有时误报源于壳与编译器的组合,如果一种壳不能脱掉的话,对于壳的特征提取往往会有一些经验方法,但那些编译结果代码相似段较长的编译器编译出来的不同程序,用壳压缩过之后,可能还会出现大量的相似部分。如果提取在这个位置上依然会产生误报。4.4.5引擎机理环节有时特征提取本身并没有问题,但由于引擎的机理问题,也会导致误报。哈希碰撞:很多反病毒软件的特征库中并不存储特征码,而是用特征码的某种数学描述,比如CRC、MD5等等,这种方法的好处是显而易见的,首先他把病毒库变长的数据结构,变成一种等长结构,有利于优化和减少空间占用,同时也降低了病毒特征被抄袭的风险。但显然一个CRC32值的内容涵盖力,不如一个128字节的特征码。如果正好有一段其他的代码与病毒特征的CRC32值相同,则会导致误报。格式识别与预处理:早期病毒误报的重要原因,是反病毒引擎的格式识别与预处理机制,不够完备,比如一个病毒只感染DOS可执行程序,那么对该病毒特征的匹配应该只针对同类型的文件进行。如果用来匹配一些图片、音乐文件,很难保证其中不会有特征碰撞,早期令人惊诧的“JPG病毒、BMP病毒”实际上并不是今天大家比较了解的格式化溢出,而是反病毒软件的误报[17]。脚本:脚本带来的误报是屡见不鲜的,因为脚本不象二进制机制有严谨的结构。因此病毒脚本和正常脚本和网页之间的往往不容易划清边界。大家比较典型的就是看到一些关于批处理命令和注册表编辑的教程经常被反病毒软件误报。-69- 图4-6分析检测流程图4.4.6未知检测环节未知检测机理的误报与前面的环节都是不同的,前面的环节是由一个从样本出发、到特征提取、到病毒库升级的链条过程产生的,而未知检测则完全是依靠反病毒软件自带的经验模型在客户端智能判定程序的有害性。未知检测的机理,很多文章都判定过,就是加权判定法,通过程序的行为或者一些静态特性设置标志,每个标志有不同的权值,通过根据程序标志取值的累加,就可以形成程序的风险值,如果超过了阈值,就会报警。这个机理说起来简单,但操作起来则是一个复杂的体系。其中重要原因之一就是因为未知病毒检测机制的误报指标与已知病毒检测技术的误报指标是完全相同的,而未知检测由于没有样本确认和提取过程,从而变得十分尴尬。例子:某硬盘保护程序曾被我们的VCS抓毒精灵机制误报,误报的原因很简单,就是他确实和太多的病毒行为标志重合了。确实这些系统底层的保护程序,往往难以回避一些与病毒相近的特性。-70- 第五章结束语5.1本文工作总结本文所做的工作如下:利用MFC实现了木马病毒对系统注册表进行修改的案例模拟,该实例代码通过对注册表中用户基本信息的修改来模拟木马病毒发作时的实际操控行为。利用MFC实现了木马病毒对文件打开方式关联进行修改的案例模拟,很多木马病毒通过此方法来达到隐蔽运行自身代码的目的,该实例代码真实再现了病毒的发作情形。利用MFC实现了木马病毒对被控制端进行远程屏幕抓取的案例模拟,木马作者为了达到自身不可告人的目的,通过远程的方式来监视被控制端的所有行为,该实例代码模拟了木马病毒的发作行为。利用MFC实现了木马病毒对被控制端进行远程关机或重启的案例模拟,木马往往被植入对方电脑以后需要重新启动以后方可实现其所有的功能,通过此实例代码可以看出其作者是如何来实施对远程计算机进行相关操作的。利用MFC实现了木马病毒对被控端计算机的键盘、鼠标进行监控的案例模拟,在对被控端进行屏幕监视的时候,可能会由于网络不畅等原因导致部分内容未能监控到,因此木马作者又想到利用木马来对用户的键盘和鼠标的击键内容和顺序进行监控,这样就能做到没有遗漏,该实例就是完成了此过程的模拟。利用MFC实现了木马病毒对远程文件进行管理的案例模拟,木马作者往往会使用各种方法来达到欺骗用户运行木马程序的目的,但有时候也会利用操作系统本身的漏洞来实施将木马程序植入用户计算机,该实例就是完成了木马病毒实施该行为的模拟。本次开发过程在完成了上述木马病毒常用攻击行为的代码模拟的基础之上,将其整合在整套模拟系统之中,并完成已知病毒名称的专杀工具的实现。最后还对反病毒业界的常见的误报现象在技术层面上作了一次透彻的分析,这也是反病毒生产厂商以及后来者需要在自己的软件开发过程中需要注意的内容。-71- 5.2进一步工作展望本文虽然实现了对木马病毒常用的攻击方法的代码模拟,但还是存在着以下几点不足之处:1、木马病毒的攻击手段层出不穷,按照本人现有的知识面来看,还不可能全部列出来,并且其攻击手段也会在与反木马软件的斗争过程中不断地花样翻新,产生许多原来没有的新手段,而原有的一些攻击手段也会在慢慢地被淘汰。反木马将是一个长期的过程,也将是本文继续研究的一个动力和方向。2、木马病毒种类众多,病毒特征码内容也比较复杂,基于准确的特征码库和高效的杀毒引擎而建立的反木马软件才是最理想的,但我们知道需要对木马样本不断地经过分析、验证等过程的反复,才能得到比较准确的特征码,即使是世界知名的杀毒软件厂商同样会存在误杀、漏杀的情况出现。因此建立准确的特征码库是所有反木马软件研制者所必须面对的问题。3、由于本科阶段专业是水文地质与工程地质,而非计算机相关专业的原因,纯属于半路出家,出于对计算机的爱好才使得自己跨入了计算机这一行业。底子比较薄,使得作者对MFC及木马病毒的研究深度还达不到一定得水准,加之时间比较仓促,因此本文总体上来看在基本达到预期目的,但以后还需要在杀毒引擎的改进方面继续进行深入研究。-72- 附录常见病毒、木马进程速查表Absr.exe→Backdoor.AutoupderMmc.exe→尼姆达病毒Aplica32.exe→将死者病毒Mprdll.exe→BlaAvconsol.exe→将死者病毒Msabel32.exe→CainandAbelAvp.exe→将死者病毒Msblast.exe→冲击波病毒Avp32.exe→将死者病毒Mschv.exe→ControlAvpcc.exe→将死者病毒Msgsrv36.exe→ComaAvpm.exe→将死者病毒Msgsvc.exe→火凤凰Avserve.exe→震荡波病毒Msgsvr16.exe→AcidShiverBbeagle.exe→恶鹰蠕虫病毒Msie5.exe→CanassonBrainspy.exe→BrainSpyvBetaMsstart.exe→Backdoor.livupCfiadmin.exe→将死者病毒Mstesk.exe→Doly1.1-1.5Cfiaudit.exe→将死者病毒Netip.exe→Spirit2000BetaCfinet32.exe→将死者病毒Netspy.exe→网络精灵Checkdll.exe→网络公牛Notpa.exe→BackdoorCmctl32.exe→BackConstructionOdbc.exe→TelecommandoCommand.exe→AOLTrojanPcfwallicon.exe→将死者病毒Diagcfg.exe→广外女生Pcx.exe→XplorerDkbdll.exe→DerSpaeherPw32.exe→将死者病毒Dllclient.exe→BoboRecycle-Bin.exe→s**tHeapDvldr32.exe→口令病毒Regscan.exe→波特后门变种Esafe.exe→将死者病毒Tftp.exe→尼姆达病毒Expiorer.exe→AcidBatteryThing.exe→ThingFeweb.exe→将死者病毒User.exe→SchwindlerFlcss.exe→Funlove病毒Vp32.exe→将死者病毒Frw.exe→将死者病毒Vpcc.exe→将死者病毒Icload95.exe→将死者病毒Vpm.exe→将死者病毒Icloadnt.exe→将死者病毒Vsecomr.exe→将死者病毒Icmon.exe→将死者病毒Server.exe→Revenger,WinCrash,YATIcsupp95.exe→将死者病毒Service.exe→TrinooIexplore.exe→恶邮差病毒Setup.exe→密码病毒或XanaduRpcsrv.exe→恶邮差病毒Sockets.exe→VampireRundll.exe→SCKISS爱情森林Something.exe→BladeRunner-73- Rundll32.exe→狩猎者病毒Spfw.exe→瑞波变种PXRunouce.exe→中国黑客病毒Svchost.exe(线程105)→蓝色代码Scanrew.exe→传奇终结者Sysedit32.exe→SCKISS爱情森林Scvhost.exe→安哥病毒Sy***plor.exe→wCratServer1.2.exe→Spirit20001.2fixedSy***plr.exe→冰河Intel.exe→传奇叛逆Syshelp.exe→恶邮差病毒Internet.exe→传奇幽灵Sysprot.exe→SatansBackDoorInternet.exe→网络神偷Sysrunt.exe→RipperKernel16.exe→TransmissionScountSystem.exe→s**tHeapKernel32.exe→坏透了或冰河System32.exe→DeepThroat1.0Kiss.exe→传奇天使Systray.exe→DeepThroat2.0-3.1Krn132.exe→求职信病毒Syswindow.exe→TrojanCowLibupdate.exe→BioNetTask_Bar.exe→WebExLoad.exe→尼姆达病毒Taskbar→密码病毒FrethemLockdown2000.exe→将死者病毒Taskmon.exe→诺维格蠕虫病毒Taskmon32→传奇黑眼睛Tds2-98.exe→将死者病毒Tds2-Nt.exe→将死者病毒Temp$01.exe→SnidTempinetb00st.exe→TheUnexplainedTempserver.exe→DeltaSourceVshwin32.exe→将死者病毒Vsstart.exe→将死者病毒Vw32.exe→将死者病毒Windown.exe→Spirit20001.2Windows.exe→黑洞2000Winfunctions.exe→DarkShadowWingate.exe→恶邮差病毒Wink????.exe→求职信病毒Winl0g0n.exe→笑哈哈病毒Winmgm32.exe→巨无霸病毒Winmsg32.exe→XtcpWinprot.exe→ChupachbraWinprotecte.exe→StealthWinrpc.exe→恶邮差病毒Winrpcsrv.exe→恶邮差病毒Winserv.exe→SoftwarstWubsys.exe→传奇猎手Winupdate.exe→Sckiss爱情森林Winver.exe→Sckiss爱情森林Winvnc.exe→恶邮差病毒Winzip.exe→ShadowPhyreWqk.exe→求职信病毒Wscan.exe→AttackFTPXx.Tmp.exe→尼姆达病毒Zcn32.exe→AmbushZonealarm.exe→将死者病毒-74- 参考文献[1]林俊杰.新一代VisualC++2005程序设计[M].北京:清华大学出版社,2006,P10[2]胡哲源.掌握VisualC++-MFC程序设计与剖析[M].北京:清华大学出版社,2001,P195-262[3]GeorgeShepherd,ScotWingo.MFCInternals:InsidetheMicrosoftFoundationClassArchitecture[M].北京:中国电力出版社,2003[4]侯捷.深入浅出MFC(第二版)[M].武汉:华中科技大学出版社,2001[5]姚领田.精通MFC程序设计[M].北京:人民邮电出版社,2006[6]JeffProsise.MFCWindows程序设计(第2版)[M].北京:清华大学出版社,2001[7]程胜利等.计算机病毒及其防治技术[M].北京:清华大学出版社,2004[8]曹国钧.计算机病毒防治、检测与清除[M].成都:电子科技大学出版社,1997,P107-109[9]袁忠良.计算机病毒防治实用技术[M].北京:清华大学出版社,1998,P130-140[10]左志刚.跟我学网络病毒防治[M].北京:机械工业出版社,2002[11]张友生、米安然.计算机病毒与木马程序设计剖析[M].北京:电子工业出版社,2003[12]五月.木马病毒清除的通用解法[EB/OL].http://soft.yesky.com/security/128/2552628.shtml#pls,2006-8-31[13]无名.病毒木马入侵招数大曝光[EB/OL].http://db.kingsoft.com/special/le-akspecial/virus-tricks/index.shtml,2003-7-12[14]天马.浅析计算机病毒及防范的措施[EB/OL].http://hi.baidu.com/dallar001/blog/item/5bb399029929500e4bfb51af.html,2007-6-12[15]JosefPieprzyk,ThomasHardjono,JenniferSeberry.FundamentalsofCom-puterSecurity[M].北京:中国水利水电出版社,2006,P173-175[16]MarkAllenWeiss.DataStructuresandAlgorithmAnalysisinC++(ThirdEdition)[M].北京:人民邮电出版社,2007,P333-359-75- [17]JosefPieprzyk,ThomasHardjono,JenniferSeberry.FundamentalsofCom-puterSecurity[M].北京:中国水利水电出版社,2006,P214-216[18]胡哲源.掌握VisualC++-MFC程序设计与剖析[M].北京:清华大学出版社,2001,P307-324[19]林俊杰.新一代VisualC++2005程序设计[M].北京:清华大学出版社,2006,P337-357[20]网冠科技.VisualC++6.0MFC时尚编程百例[M].北京:机械工业出版社,2004[21]本书编写组.VisualC++6.0MFC类库参考手册[M].北京:人民邮电出版社,2002[22]MitnickK.DSimonW.L.TheArtOfIntrusion[M].北京:清华大学出版社,2007[23]邓吉.黑客攻防实战入门(第2版)[M].北京:电子工业出版社,2007,P175-191[24]PeterSzor.TheArtofComputerVirusResearchandDefense[M].北京:机械工业出版社,2007[25]傅建明彭国军等.计算机病毒分析与对抗[M].武汉:武汉大学出版社,2004,P222-241[26]程秉辉霍克(Hawke.J).木马防护全攻略[M].北京:科学技术出版社,2005[27]林东和.防范木马入侵不求人[M].北京:人民邮电出版社,2002,P277-297[28]小陆.怎样测试代码中难测试的部分[EB/OL].http://dev.csdn.net/author/lan-e_cn/a2e22d929ec440f7a5443a37e3bf94de.html,2006-5-18[29]wangchinaking.VC中实现程序在启动时隐藏[EB/OL].http://dev.csdn.net/dev-elop/article/84/84754.shtm[30]jm.一个简单的windows位图文件类的实现[EB/OL].http://dev.csdn.net/auth-or/hitjinming/5b39c759eff246af923b78d38420ebb9.html,2006-4-20[31]jm.一个简单的使用wininet的http/ftp文件下载程序[EB/OL].http://dev.cs-dn.net/author/hitjinming/56766bc47e3e445da0f268f6c41d5e48.html,2006-4-20[32]宋宝华.深入浅出Win32多线程程序设计[EB/OL].http://dev.csdn.net/devel-op/article/83/83443.shtm,2005-12-14[33]注册表_百度百科[DB/OL].http://baike.baidu.com/view/979.htm-76- 攻读硕士学位期间公开发表的论文《MIS系统图像采集的VFP实现浅析》《科技信息》2006.10-77- 致谢在本论文结束之际,我要衷心感谢在论文完成的过程中给予我关心和支持的人们。首先向我的导师徐汀荣教授致以最衷心的感谢!本文是在徐教授的指导下完成的,从论文的选题、研究方案的确定直到论文的书写和审阅,始终得到了徐教授的关心、指正和鼓励。在我的毕业设计研究过程中,徐教授总是在百忙之中给予我严谨的指导和谆谆的教诲,同时,他渊博的学识、忘我的工作热情、平易近人的作风和严谨的治学态度都深深地影响了我,令我受益匪浅。感谢计算机学院的各位老师在学习上给我的帮助。还要特别感谢我的妻子、家人以及所有关心我的亲人和朋友。最后特别感谢在百忙之中抽出宝贵时间审阅论文的各位老师!-78-

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭