第七章新一代计算机病毒计算机病毒的发展从九十年代中期进入了快速发展,攻击目标以Windows为主,出现了双料双重,攻击杀毒软件的,具有黑客性质的病毒7.1变形多态病毒从1992年以来,出现了能在传播过程中自动修改病毒代码,改变加解密例程的变形多态病毒,给病毒的检测和清除带来新的问题。变形多态病毒一般有一个变异引擎,它是一种简单的机器代码生成器,它可以根据不同机器配置、所攻击的文件情况、传染次数等修改病毒程序体代码。在带毒载体被运行后,病毒程序首先被执行,掌握系统控制权,变异引擎被启动,会根据变异引擎的功能读取有关信息,遇到传染对象后生成变形病毒程序,把变形病毒体和变异引擎一起附加到传染目标上,完成一次传染。如果是具有对病毒程序体加密能力的病毒,则在被加载后先进行自我解密,根据变异引擎的功能读取有关信息,在把病毒程序附加到新的目标之前,采用一个互补的加密例程来加密病毒程序,然后把新产生的解密例程与加密的病毒程序体(包括变异引擎)一起附加到传染对象上。这类病毒每传染一个对象就变化一种样子,变形能力可达上千亿甚至无限,给病毒检测和清除带来一定困难。这类病毒有:NATAS/4744/4746病毒,HYY/3522(福州1号变形王)、变形大玩笑JOKE和CONNIE2-台湾2号变形王等。7.2Retro病毒在生物学中,Retro病毒(逆转录酶病毒)能破坏抑制细胞变异的酶,导致肿瘤产生,因此从某种程度上讲,一方面是酶要防止肿瘤产生,而另一方面则是要产生肿瘤,而其手段则是攻击它的攻击者。计算机中的Retro病毒的目标也是如此,它的任务就是寻找反病毒程序并试图删除一些关键文件,使得反病毒程序无法检测病毒。一些反病毒程序会包括一个数据文件,这个文件中存放病毒的特征标记。Retro病毒的攻击手段就是删除这种病毒定义文件,从而破坏了扫描程序检测病毒的能力。有些反病毒产品使用完整性检查方法来检测病毒。把完整性信息存放到数据库中,标识每个未感染文件的关键特征,然后把当前文件与存储在数据库中原来文件的信息核对以验证文件的完整性。Retro病毒就会寻找这个数据库并删除它。其作用机理是:当用户配置反病毒程序来创建、维护文件数据库时,该病毒被激活,当用户释放磁盘空间时即删除该数据库,而反病毒程序并不知道数据库被病毒删除。因此当用完整性检查技术检测病毒时,由于发现数据库不存在,就会根据当前文件产生新的数据库,而收录的则是已感染病毒的程序的完整性信息。此外还有一类病毒具有惰化反病毒软件的功能。这类病毒的作用就是阻止反病毒软件更新病毒数据库。MTX病毒在感染了系统之后,会监视其对互联网的访问,并阻塞对可能是对反病毒服务商网站的访问,从而阻止更新病毒数据库。如果原来系统中反病毒软件没有该病毒信息,那么由于无法更新反病毒软件,就不能清除该病毒。还有一类病毒能够取消Office所提供的防范措施。如,只要选择安全级别为中等,当文档带有宏,就会发出警告。而有一类病毒则能够使得此警告功能失效,即虽然设置的是中等安全级别,但当带有宏的文档被打开时却不会发出警告,而直接打开并激活宏(病毒)其原理是病毒会修改注册表Office对宏的访问限制及警告发出是通过注册表设置控制的。一旦病毒具有修改注册表功能,就可删除对宏访问的限制。Listi(Killisti)病毒就具有这样的功能。它能检查注册表的AccessVBOM键值,如果键值设置为1,表明没有限制宏的访问,病毒可以继续感染。如果限制了访问,则键值大于或小于1,此时该病毒将把键值修改为1,然后调用WordBasic.FileExit命令退出Word,这是因为AccessVBOM键值修改生效必须在重启Word之后。再打开带有宏的文档时,原来设定的安全级别就失效了。7.3“双料”、“双重”病毒所谓“双料”是指病毒既能象系统引导型病毒感染软硬盘引导区,又能象文件型病毒那样感染可执行文件。所谓“双重”病毒就是指即是DOS系统病毒,又是Windows系统病毒。3783(TPVO)病毒就是这类病毒的代表。3783病毒在进入内存后,病毒利用自身的反串功能,给检测病毒带来困难。该病毒对软硬盘引导区的感染方式类似于系统引导型病毒的传染方式。它对可执行文件的传染方式是,当目标文件头两个字节是4D5A时,则判断是DOS系统运行下的文件还是Windows系统下运行的文件?并根据不同文件结构实施传染,把病毒主体链接在文件尾部,使之增加3783个字节,该病毒名由此而来。3783病毒对网络系统破坏极大,会使网络系统工作不正常或瘫痪。在检测和清除病毒时,要清除引导区和文件中的病毒7.4PE病毒原理Win32PE病毒标志令病毒极度疯狂的DOS时代已经过去。病毒技术的精髓是Win32汇编Win32病毒同时也是所有病毒中数量极多,破坏性极大,技巧性最强的一类病毒。譬如FunLove、中国黑客等病毒都是属于这个范畴。7.4.1病毒的重定位1.为什么要重定位写正常程序的时候不用去关心变量(常量)的位置,源程序在编译的时候它的内存中位置计算好了。程序装入内存时,系统不会为它重定位。需要用到变量(常量)的时候直接用变量名访问(编译后就是通过偏移地址访问)就可以。病毒也要用到变量(常量),当病毒感染HOST程序后,由于依附到HOST程序中的位置不同,病毒随着HOST载入内存后,病毒中各变量(常量)在内存中的位置自然也会随着发生变化。需要重定位2.如何重定位call指令用来调用一个子程序或用来进行跳转,执行时,会先将返回地址(即紧接着call语句之后的那条语句在内存中的真正地址)压入堆栈,然后将IP置为call语句所指向的地址。子程序碰到ret命令后,就会将堆栈顶端的地址弹出来,并将该地址存放在IP中,主程序就可以继续执行calldelta;执行后,堆栈顶端为delta在内存中的真正地址delta:popebp;将delta在内存中的真正地址存放在ebp寄存器中……leaeax,[ebp+(offsetvar1-offsetdelta)];eax中存放着var1在内存中的真实地址pop语句执行后,ebp中放的是什么?病毒程序中标号delta处在内存中的真正地址。如果病毒程序中有变量var1,那么该变量实际在内存中的地址是ebp+(offsetvar1-offsetdelta),即参考量delta在内存中的地址+其它变量与参考量之间的距离=其它变量在内存中的真正地址。7.4.2.获取API函数地址1.为什么要获取API函数地址Win32PE病毒和普通Win32PE程序一样要调用API函数,普通的Win32PE程序里面有引入函数表,对应了代码段中所用到的API函数在动态连接库中的真实地址。调用API函数时就可由该引入函数表找到相应API函数的真正执行地址。Win32PE病毒只有一个代码段,不存在引入函数段。就无法直接调用相关API函数,需要先找出API函数在相应动态链接库中的地址。2.如何获取API函数地址要获得API函数地址,首先要获得Kernel32的基地址。介绍几种获得Kernel32基地址的方法:1)利用程序的返回地址,在其附近搜索Kernel32模块基地址当系统打开可执行文件时,会调用Kernel32.dll中的CreateProcess函数;CreateProcess函数在完成装载应用程序后,会先将返回地址压入到堆栈顶端,然后转向执行刚才装载的应用程序。当该应用程序结束后,会将堆栈顶端数据弹出放到IP中,继续执行。堆栈顶端保存的数据就是在Kernal32.dll中的返回地址。这个返回地址是在Kernal32.dll模块中。另外PE文件被装入内存时是按内存页对齐的,只要从返回地址按照页对齐的边界一页一页地往低地址搜索,就可以找到Kernel32.dll的文件头地址,即Kernel32模块的基地址。2)对相应操作系统分别给出固定的Kernel32模块的基地址对于不同的windows操作系统,Kernel32模块的地址是固定的,甚至API函数的大概位置都是固定的。Windows98为BFF70000,Windows2000为77E80000,WindowsXP为77E60000。在得到了Kernel32的模块地址后,就可以在该模块中搜索所要的API地址。对于给定的API,搜索其地址可以直接通过Kernel32.dll的引出表信息搜索,同样也可以先搜索出GetProcAddress和LoadLibrary两个API函数的地址,然后利用这两个API函数得到所需要的API函数地址。7.4.3.病毒如何感染其他文件PE病毒常见的感染其他文件的方法是在文件中添加一个新节,然后往该新节中添加病毒代码和病毒执行后的返回Host程序的代码,并修改文件头中代码开始执行位置(AddressOfEntryPoint)指向新添加的病毒节的代码入口,以便程序运行后先执行病毒代码。1)感染文件的基本步骤:1.判断目标文件开始的两个字节是否为“MZ”。2.判断PE文件标记“PE”。3.判断感染标记,如果已被感染过则跳出继续执行HOST程序,否则继续。4.获得Directory(数据目录)的个数,(每个数据目录信息占8个字节)。5.得到节表起始位置。(Directory的偏移地址+数据目录占用的字节数=节表起始位置)6.得到目前最后节表的末尾偏移(紧接其后用于写入一个新的病毒节)节表起始位置+节的个数*(每个节表占用的字节数28H)=目前最后节表的末尾偏移。7.开始写入节表a)写入节名(8字节)。b)写入节的实际字节数(4字节)。c)写入新节在内存中的开始偏移地址(4字节),同时计算出病毒入口位置上节在内存中的开始偏移地址+(上节大小/节对齐+1)×节对齐=本节在内存中的开始偏移地址。d)写入本节(即病毒节)在文件中对齐后的大小。e)写入本节在文件中的开始位置。上节在文件中的开始位置+上节对齐后的大小=本节(即病毒)在文件中的开始位置。f)修改映像文件头中的节表数目。g)修改AddressOfEntryPoint(即程序入口点指向病毒入口位置),同时保存旧的AddressOfEntryPoint,以便返回HOST继续执行。h)更新SizeOfImage(内存中整个PE映像尺寸=原SizeOfImage+病毒节经过内存节对齐后的大小)。i)写入感染标记。j)写入病毒代码到新添加的节中。ECX=病毒长度ESI=病毒代码位置(不一定等于病毒执行代码开始位置)EDI=病毒节写入位置k)将当前文件位置设为文件末尾。PE病毒感染其他文件的方法还可以将自己分散插入到每个节的空隙7.4.4病毒如何返回到Host程序为了提高生存能力,病毒不破坏HOST程序的,将控制权交给HOST程序。如何做?病毒在修改被感染文件代码开始执行位置(AddressOfEntryPoint)时,会保存原来的值,病毒在执行完病毒代码后用一个跳转语句跳到这段代码处继续执行。病毒先作一个“现在执行程序是否为病毒启动程序”的判断,如果不是启动程序,病毒才会返回HOST程序,否则继续执行程序其它部分。启动程序是没有病毒标志的写入到被感染程序中OldEIP和目前运行的HOST程序的OldEIP是否使用了同一个变量?它们之间有什么关系吗?思考!7.5CIH病毒该病毒在每月的26日将显示有关信息并删除当前目录下的文件。一种能破坏计算机主板的计算机病毒CIH病毒是感染WIN95和WIN98可执行文件的病毒。CIH病毒是迄今为止发现的破坏性极强的病毒之一,它发作时不仅破坏硬盘的引导区和分区表,而且破坏计算机系统FlashBIOS芯片中的系统程序,导致主板损坏。CIH病毒是发现的首例直接破坏计算机系统硬件的病毒。CIH病毒的作用机理是利用Win95/Win98系统的VxD虚拟设备功能接管系统控制权的。传染对象是Win95和Win