1. 传统病毒:能够感染的程序。通过改变文件或者其他东西进行传播,通常有感染可执行文件的文件型病毒和感染引导扇区的引导型病毒;
病毒与引擎的变迁
简单特征码
80年代末期,基于个人电脑病毒的诞生,随即就有了清除病毒的工具──反病毒软件。这一时期,病毒所使用的技术还比较简单,从而检测相对容易,最广泛使用的就是特征码匹配的方法。
特征码是什么呢?比如说,“如果在第1034字节处是下面的内容:0xec , 0x99, 0x80,0x99,就表示是大麻病毒。”这就是特征码,一串表明病毒自身特征的十六进制的字串。特征码一般都选得很长,有时可达数十字节,一般也会选取多个,以保证正确判断。杀毒软件通过利用特征串,可以非常容易的查出病毒。
广谱特征
这种启发式扫描比起静态的特征码扫描要先进的多,可以达到一定的未知病毒处理能力,但还是会有不准确的时候。特别是因为无法确定一定是病毒,而不可能做未知病毒杀毒。
简单总结一下各种引擎技术的优缺点:
|
|
|||
|
| |||
利用特征码技术的静态杀毒引擎
特征码的选取
在进入程序的详细讲解之前,先来讲一下对于病毒程序的特征码通常是如何选取出来的,以及特征码的结构是什么样子的。
关键数据结构
}
它表明这是一个简单文件特征,特征起始地址0,特征长度32,后面32个字节是具体特征值。与引擎类
清楚了这两个结构,接下来我们看一下具体的扫描代码。特征串的匹配其实就是memcmp,没有什么特别的,关键讲解一下引擎、库与被扫描对象之间的基本关系和分工。
引擎(CEngine)负责被扫描对象的遍历,病毒数据库对象(CVirusDB)负责在自己管理的库中搜索。对应到目前版本的代码上,引擎遍历目录,将找到的文件生成被扫描对象(CScanObj)交给当前病毒库对象的Search()方法。
CEngine类中DFS()函数是负责文件系统深度优先搜索的函数,其中以下一段就是产生一个对象,然后传递给CVirusDB::Search()方法来查毒:
}
While循环是遍历本病毒库中所有的记录。在For循环中,根据指向VRECORD结构的指针pVRec中dwSignCount的内容可知特征码的数量。然后循环用pScanObj->Compare()函数比较每段特征码与文件中指定偏移处的内容是否一致,如果全部一致,则说明该文件是病毒。