一类常见病毒的分析与防治实现

2008-07-14 10:05余启港
电脑知识与技术 2008年18期

蔡 刚 余启港

摘要:通过对计算机病毒的特征与现状的调查,对移动存储设备中常见Autorun.inf类型病毒的运行机制进行研究,运用C++ Builder编程软件实现了对该类型病毒的监控与防治。该软件方便、高效、针对性强、占用资源小,并且一定的实用性与可扩展性。

关键词:病毒防治;移动存储设备;autorun.inf; C++ Builder

中图分类号:TP309文献标识码:A文章编号:1009-3044(2008)18-2pppp-0c

Analysis and Realization of Preventing a Regular Virus

CAI Gang,YU Qi-gang

(Computer Technology Institute,South-Central University For Nationalities,Wuhan 430074,China)

Abstract:This thesis realizes the supervision and prevention of the virus Autorun.inf via investigating its traits and current conditions,studying its operation mechanism occured in normal portable storage equipment and developing programme with C++ Builder software. The software is convenient,efficient, targeted ,taking up little space ,practical and extendible.

Key words:Virus prevention;Portable storage equipment;Autorun.inf;C++ Builder

1 引言

计算机病毒是一个程序,一段可执行码 ,对计算机的正常使用进行破坏,使得电脑无法正常使用甚至整个操作系统或者电脑硬盘损坏。就像生物病毒一样,计算机病毒有独特的复制能力。计算机病毒可以很快地蔓延,又常常难以根除。它们能把自身附着在各种类型的文件上。当文件被复制或从一个用户传送到另一个用户时,它们就随同文件一起蔓延开来。这种程序不是独立存在的,它隐蔽在其他可执行的程序之中,既有破坏性,又有传染性和潜伏性。轻则影响机器运行速度,使机器不能正常运行;重则使机器处于瘫痪,会给用户带来不可估量的损失。通常就把这种具有破坏作用的程序称为计算机病毒。对于一般的家用PC来说,感染病毒的途径一半来自网络,一半来自移动存储设备,比如光盘,U盘等。而对于存储设备传播的病毒,大部分都是通过autorun.inf文件触发。严格地讲autorun.inf文件并不是一个病毒,它只是各种病毒传播所采用的一种技术。病毒通过autorun.inf在存储设备启动时运行从而进行传播。本文将对此文件进行分析并编写软件以达到智能防治此类型病毒的目的。

2 autorun.inf类型文件运行机制

autorun.inf文件是从Windows95开始的,最初用在其安装盘里,实现自动安装,以后的各版本都保留了该文件并且部分内容也可用于其他存储设备。其结构有三个部分:[AutoRun](必选),[AutoRun.Alpha](可选),[DeviceInstall](可选)。在这里我们只讨论最常用的[AutoRun]。

[AutoRun]部分里通常包含许多命令,比如:DefaultIcon、Icon、Label、Open、ShellExecute、Shell关键字Command、Shell关键字、Shell等,我们需要注意的是Open与Shell关键字Command,当我们双击移动存储设备或右键选“关键字”选项进入设备时,系统会自动运行Open和Shell关键字Command后面所指向的命令行,自动运行的命令行,必须是.exe、.com、.bat文件。这样病毒得以运行。由此我们可以看出,只要找到autorun.inf文件并找出前面两个命令所指向的文件并且删除之则达到清除病毒的目的,软件实现就是基于这样的思想。

3 软件实现

3.1 功能函数

void __fastcall OnMessage(TMessage &msg)

/*处理移动存储设备插入消息*/

AnsiString __fastcall GetDriverName()

/*得到移动存储设备的盘符,并返回一个AnsiString值*/

TStringList* __fastcallEnumerateFiles(AnsiString DriverName)

/*枚举移动存储设备中的文件并存入TStringList型变量返回*/

void __fastcall FindVirus(AnsiString DriverName)

/*将设备中文件和autorun.inf中内容匹配,找出病毒文件并且列出在VirusFileListBox中*/

void __fastcall TForm1::KillVirus()

/*清除VirusFileListBox中选中的文件*/

3.2 代码实现

3.2.1 监听移动存储设备

如果移动存储设备变更,系统会触发WM_DEVICECHANCE消息,当存储设备安装完毕时此消息的WParam值为DBT_DEVICEARRIVAL(须包含头文件dbt.h),当存储设备卸载时此消息的WParam值为DBT_DEVICEREMOVECOMPLETE。因此,采用消息映射以及对应的消息函数OnMessage实现此功能。

在头文件中添加如下代码:

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,OnMessage)

END_MESSAGE_MAP(TForm)

消息处理函数代码如下:

void __fastcall TKillVirusForm::OnMessage(TMessage &msg){

AnsiString DriverName;

if (msg.WParam==DBT_DEVICEARRIVAL)

{ /*如果设备安装完成则进行相关事件*/

DriverName=GetDriverName();//获得盘符名

if (FileExists(DriverName+"autorun.inf"))

{/*如果存在autorun.inf文件则进行清除工作*/

FindVirus(DriverName);

}}

if (msg.WParam==DBT_DEVICEREMOVECOMPLETE)

OnDeviceRemoveComplete();//如果设备移除进行相关事件

}

3.2.2 获得移动存符设备盘符名

我们通过GetLogicalDrives()命令可以得到当前PC上所有逻辑驱动器的信息,它返回一个DWORD值。具体算法为:将各个盘符字母(大写)的ASCII码值减去65再存入数组X[i],那么返回的值就是∑2X[i]。因此我们可以根据移动存储设备安装前后的DWORD值之差得到此设备的盘符: