《《计算机病毒原理及防范技术》-王路群-电子教案 第7章 计算机病毒基本技巧》由会员分享,可在线阅读,更多相关《《计算机病毒原理及防范技术》-王路群-电子教案 第7章 计算机病毒基本技巧(39页珍藏版)》请在金锄头文库上搜索。
1、计算机病毒原理及防范技术,中国水利水电出版社,第1章 计算机病毒基本技巧,7.4 花指令和变形术,7.3 病毒的多态,7.2 病毒简单加密,7.1 病毒隐藏技巧,7.5 代码优化,7.6 异常处理,教学要求:,理解:病毒的代码优化和异常处理 掌握:病毒隐藏原理,病毒的多态、花指令和变形技术,7.1 病毒隐藏技巧,隐藏是病毒的天性,是病毒的一个最基本特征。任何病毒都希望在被感染的计算机中长期隐藏不被发现,因为病毒只有在不被发现的情况下,才能实施其破坏行为。为了达到这个目的,许多病毒使用了各种不同的技术来躲避反病毒软件的检测。 病毒的隐藏技巧,贯穿于3个模块(引导、感染、表现)之中,使病毒在运行过
2、程中直到其表现(破坏)发作以前都尽可能地不被人发觉。引导型病毒、文件型病毒、宏病毒以及Windows环境下的病毒采用了不同的技术达到这个目的。,7.1 病毒隐藏技巧 (续),引导型病毒的隐藏技巧 引导型病毒一般采用两种方法进行隐藏: 第一种方法是改变基本输入输出系统中断INT 13H(BIOS磁盘中断,利用它可以实现磁盘扇区的读写)的入口地址使其指向病毒代码,一旦有调用INT 13H读被感染扇区的请求时,引导型病毒将原来没有感染过的内容返回给调用程序。这样,任何DOS程序都无法觉察道病毒的存在,如果反病毒软件无法首先将内存中的病毒清除(也就是说首先恢复被替换的INT 13H中断服务程序),那么
3、要彻底清除这种病毒是非常困难的。,7.1 病毒隐藏技巧 (续),引导型病毒的隐藏技巧 另一种方法是专门针对杀毒软件的。随着反病毒技术地提高,一些杀毒软件采用直接读写磁盘扇区的方法而不是采用INT 13H中断方法读写磁盘扇区,这样能够解决引导型病毒采用第一种方式进行隐藏而造成的问题。为了针对杀毒软件采用的这种技术,引导型病毒在计算机系统启动任何程序的时候(包括反病毒程序),开始修改DOS执行程序的中断功能,将被病毒感染的扇区恢复成原样,这样即使反病毒软件采用直接读写磁盘扇区的方法看到的也是正常的磁盘扇区,当反病毒软件运行结束后再重新感染相应的磁盘扇区。,7.1 病毒隐藏技巧 (续),文件型病毒的
4、隐藏技巧 文件型病毒通过替换DOS或者基本输入输出系统(BIOS)的文件系统的相关调用,在打开文件的时候将文件的内容恢复成未被感染时的状态,在关闭文件的时候重新进行感染。 因为操作系统访问文件的方式、方法非常多,所以实现文件型病毒的完全隐藏是一件非常困难的事情,一套比较完整的隐藏技术应该包括对下面几个方面的处理,如图7.3所示。,7.1 病毒隐藏技巧 (续),文件型病毒的隐藏技巧,图7.3 文件型病毒使用的隐藏技术,7.1 病毒隐藏技巧 (续),宏病毒的隐藏技巧 由于宏病毒离不开它的运行环境(Office软件)和宏,所以宏病毒的隐藏技术和引导型病毒以及文件型病毒比起来要简单很多,只要在Word
5、/Excel中禁止菜单“文件模板”或者“工具宏”就可以隐藏病毒了,可以通过宏病毒代码删除菜单项以及宏病毒用自己的FileTemplates和ToolsMacro宏替代系统缺省的宏就可以了。,7.1 病毒隐藏技巧 (续),进程隐藏 实现进程或模块隐藏是一个成功病毒所必须具备的特征。 进程隐藏最常用的开源代码有RootKit,发现隐藏进程并杀死该隐藏进程可以参照瑞星的进程管理工具,也可以使用更专业的Icesword工具(Icesword工具可以同时杀死多个进程,这对多个相互守护的进程特别有效)。 还有一种比较流行的进程隐藏技术,就是“远程线程注射”(remotethread injection)
6、。通常情况下,各个进程的内存空间是不可以相互访问的,这也是为程序能够稳定运行打下基础,这个访问限制让所有进程之间互相独立,这样一来,任何一个非系统关键进程发生崩溃时都不会影响到其他内存空间里的进程执行,从而使NT架构的稳定性远远高于Win9x架构。,7.1 病毒隐藏技巧 (续),进程隐藏 但是在一些特定的场合里,必须让进程之间可以互相访问和管理,这就是“远程线程”技术的初衷,这个技术实现了进程之间的跨内存空间访问,其核心是产生一个特殊的线程,这个线程能够将一段执行代码连接到另一个进程所处的内存空间里,作为另一个进程的其中一个非核心线程来运行,从而达到交换数据的目的,这个连接的过程被称为“注射”
7、(injection)。 远程线程技术好比一棵寄生在大树上的蔓藤,一旦目标进程被注射,这段新生的线程就成为目标进程的一部分代码了,只要目标进程不被终止,原进程无论是否还在运行都不会再影响到执行结果了。,7.2 病毒简单加密,病毒的简单加密是指对病毒的某些主题代码采用固定的密钥进行加密,这样静态反汇编出来的代码就是经过加密处理过的,因此在某种程度上可以起到保护病毒程序的目的。 一个被简单加密的病毒一般有如下几个部分: 解密算法(解开被加密的代码,以便病毒执行)。 病毒主体代码(被加密的病毒代码)。 跳转(病毒解密完毕后,跳到解密代码部分执行解密语句)。,7.2 病毒简单加密(续),简单加密的加密
8、算法比较简单,密钥也比较固定。由于所有的病毒代码都是完全相同的,如果该病毒的特征代码被提取出来,同样是不能逃脱反病毒软件的查杀。,7.3 病毒的多态,所谓病毒的多态,就是指一个病毒的每个样本的代码都不相同,它表现为多种状态。采用多态技术的病毒由于病毒代码不固定,这样就很难提取出该病毒的特征码,所以只采用特征码查毒法的杀毒软件是很难对这种病毒进行查杀的。 多态病毒是改进了的加密病毒,由变化的解密头和加密的代码组成。多态病毒运行时,先执行的是解密代码,对加密代码解密,然后执行刚解密的代码,也就是实现传播的主体代码。,7.3 病毒的多态(续),简单加密病毒之所以代码固定,是因为它采用了相同的加密算法
9、和密钥。如果病毒在每次感染其他文件时,改变密钥对解密后的病毒代码进行加密,那么会得到不同的加密代码。这样,由于病毒每次感染时所取的密钥不相同,那么最后得到的加密后的病毒代码也会不同。 在多态技术中,由于要对解密后的代码用不同的密钥进行重新加密,那么在多态病毒中至少就需要另外一个加密部分。病毒密钥的生成,我们可以随机产生,也可以采用被感染计算机里面的某些特征。,7.3 病毒的多态(续),多态性的级别 根据病毒使用多态技术的复杂程度,多态病毒大致可以划分为6个级别: 半多态 病毒拥有一组解密算法,感染的时候从其中随机选择一种算法进行加密和感染。 具有不动点的多态 病毒有一条或几条语句是不变的(把这
10、些不变的语句叫做不动点),其他病毒指令都是可变的。,7.3 病毒的多态(续),多态性的级别 带有填充物的多态 解密代码中包含一些没有实际用途的代码来干扰分析者的视线。 算法固定的多态 解密代码所使用的算法是固定的,但是实现这个算法的指令和指令的次序是可变的。 算法可变的多态 使用了上面所有的技术,同时解密的算法也是可以部分或者全部改变的。 完全多态 算法多态,同时病毒体可以随机分布在感染文件的各个位置,但是在运行的时候能够进行拼装,并且可以正常工作。,7.3 病毒的多态(续),多态性的级别 对于前面3种多态病毒,使用病毒特征码或者改进后的病毒特征码是可以发现病毒的(所谓的改进后的特征码,就是包
11、括一些非比较字节的特征串),对于第4种多态病毒,由于代码的变化是有限的,所以通过增加多种情况的改进后的特征码,应该也可以处理。至于第5和第6种多态病毒,依靠传统的特征码技术是完全无能为力的。,7.3 病毒的多态(续),多态性的级别 一个真正意义的多态应该可以创建每次都不同的自解密代码和不同的加密代码。一个好的多态引擎应该做到: 创建不同的解密代码。 在真实的解密代码中创建垃圾指令。 可移动(可以包含在任意程序中)。 所有的多态机制都建立在随机过程上。 解密器大小可变。 尽量快且小。,7.3 病毒的多态(续),多态病毒的原理 最简单的多态病毒: VStart: I2 call start ;1
12、start: I2 pop ebx ;2 I3 sub ebx , offset start ;3 I3 mov ecx , VEnd EncryptStart ;4 I3 lea edi , offset EncryptStart+ebx ;5 DecryptLoop: I3 xor edi , byte ptr 00h ;6 DecryptKey = byte ptr $ - 1 ;7 I3 inc edi ;8 I2 loop DecryptLoop ;9 EncryptStart: call GetKBase call GetAPIz call InfectThread Ret2Hos
13、t: push HostEntryebx ret,7.3 病毒的多态(续),多态病毒的原理 这段代码的工作流程是: 获得重定位信息。 将加密代码的偏移保存在edi中,将加密代码的大小保存在ecx中。 循环解密每一个字节。 解密完成后,病毒主体开始执行,进行获得地址,判断发作,感染文件,返回宿主等病毒的常规工作。 必须注意的是:程序第一次运行时,EncryptStart开始的代码并没有被加密,此时key必须等于0,任何字节与0异或( XOR)后才不会改变。可是,当病毒复制自身的时候,写入其他文件内部的代码才是加密的,当然,写入的key值已不再是0,EncryptStart开始的代码也已经被加密,
14、当这个染毒文件执行时,解密代码才会真正发挥作用。,7.3 病毒的多态(续),多态病毒的原理 改变指令顺序 多态很重要的一个工作就是可以交换解密指令位置,仅这个特性就可以使特征字符串扫描失效。 上面的19可排列的指令具有如下规则: 指令 13 顺序不能改变。 指令 4可以在VStartDecryptLoop之间的任何地方。 指令 5 必须在指令3之后,指令6之前。 指令 6 9 顺序不能改变。,7.3 病毒的多态(续),多态病毒的原理 改变解密指令 改变指令是多态最重要的部分,多态应该可以如下变换指令: 把单条指令展开为复杂的指令集 把已知的指令集转换为单条指令 把指令变换为相同功能的指令,7.
15、3 病毒的多态(续),多态病毒的原理 随机数的生成 因为多态必须建立在随机过程之上,避免有规律可循,所以选择一个好的随机数算法是非常重要的事情。 垃圾代码的产生 选择垃圾代码的原则: 不能影响任何寄存器(当然,eip是一定要改变的)和标志位的状态。 不能修改程序中的任何数据。,7.3 病毒的多态(续),多态病毒的原理 多态复制自身时的特殊性 我们知道,普通病毒复制自身只要简单的调用WriteFile(offset VStart,VIRUS_SIZE)就可以了,而多态病毒的复制过程要复杂一些,它可以分为3个步骤: 生成并写入解密代码 生成并写入密钥 写入病毒加密部分,7.3 病毒的多态(续),多
16、态病毒的对抗 对付多态病毒的最好办法是某种形式的虚拟执行技术,也就是仿真出一个80x86的CPU,让解密代码自己解密完成之后,再使用通常的特征码识别法进行病毒检测。 但是针对这种仿真技术也出现了一些具有反仿真技术的病毒,比如说根据执行所需要的时间判断是否处于虚拟机的监视下,在监视下和非监视下表现出完全不同的行为。,7.3 病毒的多态(续),多态病毒的对抗 因此,衡量多态病毒的难度、复杂性和检测的困难程度可以从下面几个方面进行: 采用算法的复杂性,是否采用了非公开、非标准的80x86指令,是否使用了大量的寻址方法和多种类型的指令实现解密算法。 是否使用了反仿真(虚拟执行)技术。 是否采用了可变的加密解密算法。 解密代码