在Windows環(huán)境下,由于病毒必須獲得CPU的控制權(quán),因此很多病毒都需要在Windows啟動(dòng)后,自動(dòng)地運(yùn)行起來。另一方面,越來越多的病毒采用了高級語言的形式,象宏病毒,采用的是VB語言,本身不能直接由CPU來執(zhí)行,必須由相關(guān)程序解釋執(zhí)行,因此它們必須在操作系統(tǒng)正常啟動(dòng)后,才能加載自身,進(jìn)行病毒傳播。因此說,很多病毒必須在Windows啟動(dòng)后自動(dòng)地運(yùn)行起來,并且是依賴于Windows的自動(dòng)啟動(dòng)程序的功能。這是這些病毒的一個(gè)特點(diǎn),也是一大弱點(diǎn)。我們可以根據(jù)這個(gè)特點(diǎn),分析Windows啟動(dòng)時(shí)有那些程序自動(dòng)運(yùn)行,通過檢查這些程序來防范病毒的侵襲。
(1)注冊表項(xiàng)HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices
該項(xiàng)下存放了Windows NT/2000/XP的服務(wù)程序。下面的每一個(gè)子項(xiàng)對應(yīng)于一個(gè)服務(wù):
ImagePath值項(xiàng)存放了該服務(wù)的程序文件路徑。這些服務(wù)都有一個(gè)Start值項(xiàng)。值為0,表示由核心裝載器裝載;值為1,表示由I/O子系統(tǒng)裝載。Start值為0和1的,都是非常低級和關(guān)鍵的Windows服務(wù),它們必須正常啟動(dòng),Windows NT/2000/XP才能繼續(xù)啟動(dòng)。通常病毒不會(huì)將自己放在這里面,因?yàn)檫@時(shí)候WindowsNT/2000/XP只裝載了核心部分,只有最基本的功能。Start值為2,表示自動(dòng)啟動(dòng),值為3,表示手工啟動(dòng),值為4,表示禁止啟動(dòng)。這三類服務(wù),可以在"控制面板"→"管理工具"→"服務(wù)"中查看到。
我們需要檢查的是,那些Start值為2的服務(wù),其對應(yīng)的程序文件(ImagePath值項(xiàng)定義)是否可疑。
(2)注冊表項(xiàng)HKEY_LOCAL_MACHINESYSTEMCurrentControlSet ControlSession Manager
該項(xiàng)下存放了會(huì)話管理器(Smss.exe)的信息。在Windows NT/2000/XP的內(nèi)核啟動(dòng)階段,需要啟動(dòng)該項(xiàng)下定義的幾個(gè)程序。在REG_MULTI_SZ類型的值項(xiàng)BootExecute中,定義了會(huì)話管理器裝載服務(wù)前需要運(yùn)行的程序。默認(rèn)值為AutoCheck autochk *和Dfsinit。該默認(rèn)值表示運(yùn)行磁盤檢查程序,以及啟動(dòng)DFS文件系統(tǒng)的初始化程序。
我們需要檢查的是,值項(xiàng)BootExecute存放的是否是默認(rèn)的執(zhí)行文件,是否還定義了其他的執(zhí)行程序。
(3)注冊表項(xiàng)HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrent VersionWinlogonUserinit
該值項(xiàng)類型為字符串值,定義了用戶注冊進(jìn)入時(shí)執(zhí)行的初始化程序。在用戶注冊時(shí),注冊管理程序(Winlogon)啟動(dòng)該初始化程序,默認(rèn)值是Userinit.exe。該程序首先運(yùn)行注冊腳本,建立網(wǎng)絡(luò)連接,然后啟動(dòng)用戶界面程序(Explorer.exe)。用戶可以替換該初始化程序?yàn)樽约旱某跏蓟绦?當(dāng)然,病毒也可以做到)。一般地,用戶自己的初始化程序可以在處理完自己需要進(jìn)行的工作后,再調(diào)用Userinit.exe程序即可。
我們需要檢查的是,Userinit值項(xiàng)的值是否是Userinit.exe。同時(shí)檢查WinntSystem32下的Userinit.exe文件的大小和時(shí)間是否是正常的。
(4)注冊表項(xiàng)HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrent VersionWinlogonShell
該值項(xiàng)類型為字符串值,定義了用戶界面程序,默認(rèn)值為Explorer.exe。正常情況下,注冊管理程序(Winlogon)啟動(dòng)Userinit定義的初始化程序,該初始化程序會(huì)啟動(dòng)用戶界面程序,因此不需要運(yùn)行Shell值項(xiàng)定義的程序。如果注冊管理程序沒有能成功啟動(dòng)Userinit定義的初始化程序,則注冊管理程序會(huì)過來啟動(dòng)該Shell值項(xiàng)定義的用戶界面程序。
我們需要檢查的是, Shell值項(xiàng)的值是否是Explorer.exe。
(5)注冊表項(xiàng)HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrent VersionWinlogonSystem(適用于Windows NT)
該值項(xiàng)類型為字符串值,該值項(xiàng)中存放了安全管理器程序,默認(rèn)值為Lsass.exe。安全管理器就是Windows NT啟動(dòng)時(shí),或者屏幕保護(hù)后,要求輸入用戶和密碼的畫面。用戶可以替換該安全管理器程序。
我們需要檢查的是System值項(xiàng)的值是否是Lsass.exe。
(6)注冊表項(xiàng)HKEY_CURRENT_USERSOFTWAREMicrosoftWindows CurrentVersionPoliciesExplorerRun
在該項(xiàng)下可以有若干個(gè)字符串類型的值項(xiàng),每個(gè)值項(xiàng)的名稱從1開始,值為程序或者文檔的名稱。在用戶注冊進(jìn)入Windows時(shí),該項(xiàng)下定義的程序?qū)⒈粏?dòng)起來。例如該項(xiàng)下有兩個(gè)值項(xiàng),第一個(gè)是1,值為Notepad.exe,第二個(gè)是2,值為C: eadme.doc,則在用戶注冊進(jìn)入Windows 2000時(shí),系統(tǒng)會(huì)首先運(yùn)行起Notepad.exe程序,然后會(huì)使用DOC的關(guān)聯(lián)程序打開C: eadme.doc文檔。
我們需要檢查的是,如果定義了自動(dòng)啟動(dòng)程序,則查找該程序是哪個(gè)軟件對應(yīng)的,是否為可疑程序。默認(rèn)情況下,該注冊表項(xiàng)下應(yīng)該為空。
(7)注冊表項(xiàng)HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion PoliciesExplorerRun
該項(xiàng)與HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersion PoliciesExplorerRun的作用一樣,不同之處在于,由于它位于HKEY_LOCAL_MACHINE下,所以它將應(yīng)用于所有的用戶。在啟動(dòng)順序上,系統(tǒng)首先啟動(dòng)HKEY_LOCAL_MACHINE下的Run中的程序,再去啟動(dòng)HKEY_CURRENT_USER下Run中的程序。
(8)注冊表項(xiàng)HKEY_CURRENT_USERSoftwareMicrosoftWindows CurrentVersion下的Run、RunOnce、RunEx和RunOnceEx子項(xiàng)(適用于Windows 9x/Me/NT/2000/XP)
由于是位于HKEY_CURRENT_USER下,因此該項(xiàng)只適用于當(dāng)前這個(gè)用戶,不適用于其他的用戶。在用戶注冊進(jìn)入Windows系統(tǒng)時(shí),自動(dòng)地運(yùn)行該項(xiàng)下定義的程序或文檔。其中Run子項(xiàng)中定義了每次系統(tǒng)啟動(dòng)時(shí)都需要運(yùn)行的程序,值項(xiàng)類型是字符串值,值項(xiàng)的名稱是該運(yùn)行程序的說明,值項(xiàng)的值是程序的名稱;RunOnce子項(xiàng)中定義了只運(yùn)行一次的程序,在該項(xiàng)下的值項(xiàng)中定義的程序運(yùn)行起來后,該項(xiàng)下的值項(xiàng)就會(huì)被刪除掉,這通常用于程序的安裝過程;RunEx和RunOnceEx的作用和Run、RunOnce是一樣的,是Run、RunOnce的擴(kuò)充形式。
(9)注冊表項(xiàng)HKEY_LOCAL_MACHINESoftwareMicrosoft WindowsCurrentVersion下的Run、RunOnce、RunEx和RunOnceEx子項(xiàng)(適用于Windows 9x/Me/NT/2000/XP)
該項(xiàng)和HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersion下的Run、RunOnce、RunEx和RunOnceEx作用一樣,不同之處在于,由于它位于HKEY_LOCAL_ MACHINE下,所以它將應(yīng)用于所有的用戶。在啟動(dòng)順序上,系統(tǒng)首先啟動(dòng)HKEY_LOCAL_MACHINE下定義的啟動(dòng)項(xiàng)目,再去啟動(dòng)HKEY_CURRENT_USER下定義的啟動(dòng)項(xiàng)目。
我們需要檢查的是,對于默認(rèn)情況以外定義的程序,需要檢查其對應(yīng)的軟件。很多軟件將自動(dòng)啟動(dòng)程序放在注冊表中的這個(gè)位置。例如Norton Antivirus防毒軟件,就會(huì)在注冊表項(xiàng)HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows CurrentVersionRun下新建一個(gè)值項(xiàng)NPS Event Checker,值為C:PROGRA~1Navnt npscheck.exe。
下表中列出了默認(rèn)情況下,Windows系統(tǒng)中Run下的自動(dòng)運(yùn)行項(xiàng)目。
(10)檢查非注冊表部分
首先檢查啟動(dòng)文件和磁盤引導(dǎo)扇區(qū)。對于Windows 9x/Me,啟動(dòng)文件是啟動(dòng)盤目錄下的IO.sys和Command.com文件。同時(shí),還包括Autoexec.bat文件中定義的程序文件,以及Config.sys文件中裝載的程序文件。對于Windows NT/2000/XP,啟動(dòng)文件是啟動(dòng)盤目錄下的Ntldr,Ntdetect.com、Ntbootdd.sys(如果boot.ini文件使用SCSI語法)、Bootsect.dos(如果使用了多重啟動(dòng),對應(yīng)于啟動(dòng)到DOS環(huán)境),以及Winnt目錄下的Ntoskrnl.exe(核心程序文件)和Hal.dll(硬件抽象層)。
其次,對于Windows 9x,還需要檢查Win.ini文件和System.ini文件。Win.ini文件中的"run="和"load="行,定義了Windows 9x啟動(dòng)時(shí)需要裝載的程序。
最后,需要檢查"開始"菜單中"程序"中的"啟動(dòng)"程序組,"啟動(dòng)"程序組中存放了Windows正常啟動(dòng)起來后,需要啟動(dòng)的程序。
8.禁止舊版本的"自動(dòng)運(yùn)行"程序列表(適用范圍:Windows 2000/XP)
注冊表項(xiàng)HKEY_LOCAL_MACHINE_SoftwareMicrosoftWindowsCurrentVersionRun和HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunOnce下存放的是"自動(dòng)運(yùn)行"的程序列表,它們是舊版本的"自動(dòng)運(yùn)行"程序列表,在Windows95/98/NT中就已經(jīng)有了。在注冊表中有兩個(gè)值項(xiàng),可以禁止這兩個(gè)舊版本列表起作用,替代它們的是RunEx和RunOnceEx注冊表項(xiàng)。
這兩個(gè)值項(xiàng)位于注冊表項(xiàng)HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer下。
9.禁止遠(yuǎn)程訪問光盤和軟盤(適用范圍:Windows NT/2000/XP)
在C2級別的安全要求中,必須對可移動(dòng)介質(zhì)的安全作保護(hù),它要求當(dāng)本地用戶在使用計(jì)算機(jī)時(shí),光盤和軟盤稱為本地用戶的專有資源,網(wǎng)絡(luò)上的其他用戶,包括系統(tǒng)管理員,都不能夠訪問光盤和軟盤。這是因?yàn)榇藭r(shí)使用的可移動(dòng)介質(zhì),通常是本地用戶私人的,因此不應(yīng)該給其他人看到。 下表的值項(xiàng)存放在注冊表項(xiàng)HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWinlogon中。
10.設(shè)定口令的最小長度(適用范圍:Windows 9x/Me/NT/2000/XP)
默認(rèn)情況下,口令可以設(shè)置為空。為了加強(qiáng)安全性,我們可以強(qiáng)行指定口令的最小長度。
在注冊表項(xiàng)HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionPoliciesNetwork下,創(chuàng)建二進(jìn)制類型的值項(xiàng)MinPwdLen,并修改其值為口令的長度,例如6。這樣,用戶在設(shè)定口令時(shí),最少要設(shè)定6位的長度。