蔡 剛 余啟港
摘要:通過對(duì)計(jì)算機(jī)病毒的特征與現(xiàn)狀的調(diào)查,對(duì)移動(dòng)存儲(chǔ)設(shè)備中常見Autorun.inf類型病毒的運(yùn)行機(jī)制進(jìn)行研究,運(yùn)用C++ Builder編程軟件實(shí)現(xiàn)了對(duì)該類型病毒的監(jiān)控與防治。該軟件方便、高效、針對(duì)性強(qiáng)、占用資源小,并且一定的實(shí)用性與可擴(kuò)展性。
關(guān)鍵詞:病毒防治;移動(dòng)存儲(chǔ)設(shè)備;autorun.inf; C++ Builder
中圖分類號(hào):TP309文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):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 引言
計(jì)算機(jī)病毒是一個(gè)程序,一段可執(zhí)行碼 ,對(duì)計(jì)算機(jī)的正常使用進(jìn)行破壞,使得電腦無法正常使用甚至整個(gè)操作系統(tǒng)或者電腦硬盤損壞。就像生物病毒一樣,計(jì)算機(jī)病毒有獨(dú)特的復(fù)制能力。計(jì)算機(jī)病毒可以很快地蔓延,又常常難以根除。它們能把自身附著在各種類型的文件上。當(dāng)文件被復(fù)制或從一個(gè)用戶傳送到另一個(gè)用戶時(shí),它們就隨同文件一起蔓延開來。這種程序不是獨(dú)立存在的,它隱蔽在其他可執(zhí)行的程序之中,既有破壞性,又有傳染性和潛伏性。輕則影響機(jī)器運(yùn)行速度,使機(jī)器不能正常運(yùn)行;重則使機(jī)器處于癱瘓,會(huì)給用戶帶來不可估量的損失。通常就把這種具有破壞作用的程序稱為計(jì)算機(jī)病毒。對(duì)于一般的家用PC來說,感染病毒的途徑一半來自網(wǎng)絡(luò),一半來自移動(dòng)存儲(chǔ)設(shè)備,比如光盤,U盤等。而對(duì)于存儲(chǔ)設(shè)備傳播的病毒,大部分都是通過autorun.inf文件觸發(fā)。嚴(yán)格地講autorun.inf文件并不是一個(gè)病毒,它只是各種病毒傳播所采用的一種技術(shù)。病毒通過autorun.inf在存儲(chǔ)設(shè)備啟動(dòng)時(shí)運(yùn)行從而進(jìn)行傳播。本文將對(duì)此文件進(jìn)行分析并編寫軟件以達(dá)到智能防治此類型病毒的目的。
2 autorun.inf類型文件運(yùn)行機(jī)制
autorun.inf文件是從Windows95開始的,最初用在其安裝盤里,實(shí)現(xiàn)自動(dòng)安裝,以后的各版本都保留了該文件并且部分內(nèi)容也可用于其他存儲(chǔ)設(shè)備。其結(jié)構(gòu)有三個(gè)部分:[AutoRun](必選),[AutoRun.Alpha](可選),[DeviceInstall](可選)。在這里我們只討論最常用的[AutoRun]。
[AutoRun]部分里通常包含許多命令,比如:DefaultIcon、Icon、Label、Open、ShellExecute、Shell關(guān)鍵字Command、Shell關(guān)鍵字、Shell等,我們需要注意的是Open與Shell關(guān)鍵字Command,當(dāng)我們雙擊移動(dòng)存儲(chǔ)設(shè)備或右鍵選“關(guān)鍵字”選項(xiàng)進(jìn)入設(shè)備時(shí),系統(tǒng)會(huì)自動(dòng)運(yùn)行Open和Shell關(guān)鍵字Command后面所指向的命令行,自動(dòng)運(yùn)行的命令行,必須是.exe、.com、.bat文件。這樣病毒得以運(yùn)行。由此我們可以看出,只要找到autorun.inf文件并找出前面兩個(gè)命令所指向的文件并且刪除之則達(dá)到清除病毒的目的,軟件實(shí)現(xiàn)就是基于這樣的思想。
3 軟件實(shí)現(xiàn)
3.1 功能函數(shù)
void __fastcall OnMessage(TMessage &msg)
/*處理移動(dòng)存儲(chǔ)設(shè)備插入消息*/
AnsiString __fastcall GetDriverName()
/*得到移動(dòng)存儲(chǔ)設(shè)備的盤符,并返回一個(gè)AnsiString值*/
TStringList* __fastcallEnumerateFiles(AnsiString DriverName)
/*枚舉移動(dòng)存儲(chǔ)設(shè)備中的文件并存入TStringList型變量返回*/
void __fastcall FindVirus(AnsiString DriverName)
/*將設(shè)備中文件和autorun.inf中內(nèi)容匹配,找出病毒文件并且列出在VirusFileListBox中*/
void __fastcall TForm1::KillVirus()
/*清除VirusFileListBox中選中的文件*/
3.2 代碼實(shí)現(xiàn)
3.2.1 監(jiān)聽移動(dòng)存儲(chǔ)設(shè)備
如果移動(dòng)存儲(chǔ)設(shè)備變更,系統(tǒng)會(huì)觸發(fā)WM_DEVICECHANCE消息,當(dāng)存儲(chǔ)設(shè)備安裝完畢時(shí)此消息的WParam值為DBT_DEVICEARRIVAL(須包含頭文件dbt.h),當(dāng)存儲(chǔ)設(shè)備卸載時(shí)此消息的WParam值為DBT_DEVICEREMOVECOMPLETE。因此,采用消息映射以及對(duì)應(yīng)的消息函數(shù)OnMessage實(shí)現(xiàn)此功能。
在頭文件中添加如下代碼:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,OnMessage)
END_MESSAGE_MAP(TForm)
消息處理函數(shù)代碼如下:
void __fastcall TKillVirusForm::OnMessage(TMessage &msg){
AnsiString DriverName;
if (msg.WParam==DBT_DEVICEARRIVAL)
{ /*如果設(shè)備安裝完成則進(jìn)行相關(guān)事件*/
DriverName=GetDriverName();//獲得盤符名
if (FileExists(DriverName+"autorun.inf"))
{/*如果存在autorun.inf文件則進(jìn)行清除工作*/
FindVirus(DriverName);
}}
if (msg.WParam==DBT_DEVICEREMOVECOMPLETE)
OnDeviceRemoveComplete();//如果設(shè)備移除進(jìn)行相關(guān)事件
}
3.2.2 獲得移動(dòng)存符設(shè)備盤符名
我們通過GetLogicalDrives()命令可以得到當(dāng)前PC上所有邏輯驅(qū)動(dòng)器的信息,它返回一個(gè)DWORD值。具體算法為:將各個(gè)盤符字母(大寫)的ASCII碼值減去65再存入數(shù)組X[i],那么返回的值就是∑2X[i]。因此我們可以根據(jù)移動(dòng)存儲(chǔ)設(shè)備安裝前后的DWORD值之差得到此設(shè)備的盤符: