网络安全 频道

第一次亲密接触 浅析杀毒软件技术应用

病毒的分类



  1. 传统病毒:能够感染的程序。通过改变文件或者其他东西进行传播,通常有感染可执行文件的文件型病毒和感染引导扇区的引导型病毒;





  病毒与引擎的变迁

  简单特征码

  80年代末期,基于个人电脑病毒的诞生,随即就有了清除病毒的工具──反病毒软件。这一时期,病毒所使用的技术还比较简单,从而检测相对容易,最广泛使用的就是特征码匹配的方法。

  特征码是什么呢?比如说,“如果在第1034字节处是下面的内容:0xec , 0x99, 0x80,0x99,就表示是大麻病毒。”这就是特征码,一串表明病毒自身特征的十六进制的字串。特征码一般都选得很长,有时可达数十字节,一般也会选取多个,以保证正确判断。杀毒软件通过利用特征串,可以非常容易的查出病毒。

  广谱特征



  启发式扫描


  这种启发式扫描比起静态的特征码扫描要先进的多,可以达到一定的未知病毒处理能力,但还是会有不准确的时候。特别是因为无法确定一定是病毒,而不可能做未知病毒杀毒。

  行为判定

引擎技术对比

  简单总结一下各种引擎技术的优缺点:



解压缩与去壳



  利用特征码技术的静态杀毒引擎

  特征码的选取

  在进入程序的详细讲解之前,先来讲一下对于病毒程序的特征码通常是如何选取出来的,以及特征码的结构是什么样子的。








  关键数据结构

  首先介绍程序中的两个重要结构VSIGNATURE和VRECORD。一个VSIGNATURE是一个特征,很多个特征组成了一条病毒记录,也就是一个VRECORD。





}

  它表明这是一个简单文件特征,特征起始地址0,特征长度32,后面32个字节是具体特征值。与引擎类

  清楚了这两个结构,接下来我们看一下具体的扫描代码。特征串的匹配其实就是memcmp,没有什么特别的,关键讲解一下引擎、库与被扫描对象之间的基本关系和分工。

  引擎(CEngine)负责被扫描对象的遍历,病毒数据库对象(CVirusDB)负责在自己管理的库中搜索。对应到目前版本的代码上,引擎遍历目录,将找到的文件生成被扫描对象(CScanObj)交给当前病毒库对象的Search()方法。

  CEngine类中DFS()函数是负责文件系统深度优先搜索的函数,其中以下一段就是产生一个对象,然后传递给CVirusDB::Search()方法来查毒:


::iterator iter = m_listVRecords.begin();
dwSignCount; i++)

}

While循环是遍历本病毒库中所有的记录。在For循环中,根据指向VRECORD结构的指针pVRec中dwSignCount的内容可知特征码的数量。然后循环用pScanObj->Compare()函数比较每段特征码与文件中指定偏移处的内容是否一致,如果全部一致,则说明该文件是病毒。

0
相关文章