安全類工具制作autorun.inf免疫程序
一、前言
我曾經在《反病毒攻防研究第006篇:利用WinRAR與AutoRun.inf實現自啟動》那篇文章中讨論過AutoRun.inf的原理與應對方法,作為對這個問題的收尾,我打算在此讨論一下如何利用MFC開發一個簡單的免疫程序。盡管如今我們應該已經不會再受到AutoRun.inf的肆虐,但是這其中包含的很多思想依舊值得探讨。需要強調的是,這篇文章的重點在于預防,也就是在還沒有受到AutoRun.inf的威脅時該如何給自己的計算機打預防針。如果計算機中了AutoRun.inf的破壞,可參考反病毒系列第006篇的文章内容。
二、AutoRun.inf的免疫原理
我們在網上可以找到很多免疫工具,現在一些修改版的操作系統裡面也會提供這樣一個免疫工具。它免疫的原理是建立一個不被删除的AutoRun.inf文件夾,以防止病毒生成一個運行病毒的AutoRun.inf。其免疫要點是:
1、防止病毒在驅動器根目錄下生成autorun.inf文件。
2、防止病毒破壞我們的免疫措施。
對于第一點,我們可以在驅動器根目錄下做一個autorun.inf文件夾,原理是同一個目錄中文件不能和文件夾重名。對于第二點,我們在剛才建立的autorun.inf文件夾中做一個不可删除的目錄即可實現。
Windows下,不能夠以下面這些字樣來命名文件/文件夾,包括:aux、com1、com2、prn、con、nul等,因為這些名字都屬于設備名稱,等價于一個DOS設備。如果我們把文件命名為這些名字,Windows就會誤以為發生重名。而以這些名字命名的文件夾雖可以訪問,也可以建立文件夾,但卻無法删除,因為Windows不允許以這種方式删除設備。在系統看來,這個文件夾就是設備。如果不以設備名稱作為文件名,也可以采用某些方法給文件或者文件起一個包含非法字符的名稱,這樣一來,它們也是不能夠被删除的,這也是接下來所要讨論的方法。而這類名稱,雖然不能夠用正常的手段進行創建與删除,但是我們是可以通過編程實現的,接下來就對編程方法進行讨論。
三、利用MFC制作免疫程序的界面
首先需要建立一個基于對話框的MFC程序,然後界面上的默認控件,添加一個Combo Box控件和兩個Button控件
圖1 程序界面
将界面中的三個控件的ID分别改為:IDC_COMBO_DRIVER、IDC_IMMUNITY和IDC_CANCEL。然後再給ComboBox控件添加一個類型為“Control”,名稱為“m_ComboDriver”的變量。
這裡有一點需要說明的是,很多初學者發現程序在運行後,單擊Combo Box控件右邊的下三角,無法打開下拉選項,而用鍵盤的“↓”卻可以進行下拉項的選擇。其實這是因為在界面設計時,需要将Combo Box控件向下拉一定的範圍才可以。單擊右邊的倒三角,就能夠進行調整:
圖2 調整Combo Box控件顯示範圍
至此,界面設計完畢,還是非常簡單的,接下來就要添加代碼來實現功能了。
四、編寫免疫程序的代碼
程序中的Combo Box控件是用來選擇想要進行免疫的盤符的,所以需要在控件中顯示出所有的盤符供用戶選擇,這裡定義一個函數以實現相應的功能。在CImmunityARDlg.cpp文件中,找到OnInitDialog()函數,在“// TODO: Add extra initialization here”與“return”之間的進行函數聲明:
[cpp] view plain copy
InitComboDriver();
以表明程序對話框的初始設定,然後在OnInitDialog()函數的後面添加InitComboDriver()函數:
[cpp] view plain copy
void CImmunityARDlg::InitComboDriver()
{
char szDriverString[MAXBYTE] = { 0 };
char *pTmp = NULL;
//設置編輯框顯示的内容
SetDlgItemText(IDC_COMBO_DRIVER,_T("Select a drive letter..."));
//獲取字符串類型的驅動器列表
GetLogicalDriveStrings(MAXBYTE, szDriverString);
pTmp = szDriverString;
while( *pTmp )
{
//向CComboBox中添加字符串
m_ComboDriver.AddString(pTmp);
//每個盤符占據4個字節,所以加上4可以切換到下一個盤符
pTmp = 4;
}
}
對于初學者來說,還有一點需要注意的是,由于這裡我們自定義了InitComboDriver()函數,因此一定要把這個函數的聲明添加到頭文件,也就是CImmunityARDlg.h中,可以在public下添加:
[cpp] view plain copy
void InitComboDriver();
接下來添加“Immunity”按鈕的代碼,雙擊該按鈕就可以來到代碼編輯界面,首先在最上方添加兩個宏定義:
[cpp] view plain copy
//創建的目錄名稱
#define AUTORUN "autorun.inf"
//創建無法删除的目錄
#define IMMUNITY \\Immunity...\\
然後對按鍵定義如下代碼:
[cpp] view plain copy
void CImmunityARDlg::OnBtnImmunity()
{
// TODO: Add your control notification handler code here
char szPath[MAX_PATH] = { 0 };
GetDlgItemText(IDC_COMBO_DRIVER, szPath, MAX_PATH);
//創建autorun.inf文件夾
strcat(szPath, AUTORUN);
BOOL bRet = CreateDirectory(szPath,NULL);
//盤符無法免疫的情況,可能已經免疫或盤符不可寫
if(!bRet)
{
//在MFC中推薦使用AfxMessageBox
AfxMessageBox("Immunity error!");
return;
}
//創建無法删除的用來進行免疫的文件夾
strcat(szPath,IMMUNITY);
bRet = CreateDirectory(szPath, NULL);
if(!bRet)
{
AfxMessageBox("Immunity error!");
}
}
接下來是給Cancel按鈕添加代碼:
[cpp] view plain copy
void CImmunityARDlg::OnBtnCancel()
{
// TODO: Add your control notification handler code here
char szPath[MAX_PATH] = { 0 };
//删除文件夾Immunity...,其路徑為X:\autorun.inf\Immunity...
GetDlgItemText(IDC_COMBO_DRIVER, szPath, MAX_PATH);
strcat(szPath, AUTORUN);
strcat(szPath, IMMUNITY);
RemoveDirectory(szPath);
//清空保存有路徑信息的數組
ZeroMemory(szPath,MAX_PATH);
//删除文件夾autorun.inf,其路徑為X:\autorun.inf
//注意這裡的目錄需要從裡向外一層層删除
GetDlgItemText(IDC_COMBO_DRIVER, szPath, MAX_PATH);
strcat(szPath, AUTORUN);
RemoveDirectory(szPath);
}
至此所有代碼編寫完畢,經實際測試,可以達到相應的效果,這裡不再贅述。
五、知識補充
上述程序中用到了ZeroMemory()函數,我以前的程序中為了達到相同的目的,也用過memset()函數,二者的區别在于:
1、ZeroMemory()是微軟SDK提供的,memset()是屬于C Run-timeLibrary提供的,因此ZeroMemory()隻能用于Windows系統,而memset()還可以用于其他系統。
2、ZeroMemory()是一個宏,隻是用于把一段内存的内容置零,内部其實是用memset()實現的,而memset()除了對内存清零操作,還可以将内存置成别的字符。
3、如果程序是Win32程序而不想連接CRun-time Library,就用ZeroMemory;如果需要跨平台,就用memset。ZeroMemory相當于memset(buffer,0,length)。
對于AfxMessageBox和MessageBox的區别如下:
1、AfxMessageBox是MFC庫提供的全局函數,提供了多種重載形式,而MessageBox是标準的Windows API函數。
2、AfxMessageBox函數在任何類裡邊都可以使用,而MessageBox()函數隻能在CWnd類的繼承類中使用。另外,AfxMessageBox()函數的參數沒有MessageBox()函數的參數豐富,所以後者較前者靈活。
3、AfxMessageBox不能控制消息框标題,常用于調試程序時的内部數據輸出或警告;MessageBox比較正式,常用在要提交的應用程序版本中,可以控制标題内容而不必采用含義不明的可執行文件名為标題。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!