?

一類常見病毒的分析與防治實現

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值之差得到此設備的盤符:

91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合