安全類工具制作AutoRun.inf免疫程序
一、前言
我曾經(jīng)在《反病毒攻防研究第006篇:利用WinRAR與AutoRun.inf實現(xiàn)自啟動》那篇文章中討論過AutoRun.inf的原理與應對方法,作為對這個問題的收尾,我打算在此討論一下如何利用MFC開發(fā)一個簡單的免疫程序。盡管如今我們應該已經(jīng)不會再受到AutoRun.inf的肆虐,但是這其中包含的很多思想依舊值得探討。需要強調的是,這篇文章的重點在于預防,也就是在還沒有受到AutoRun.inf的威脅時該如何給自己的計算機打預防針。如果計算機中了AutoRun.inf的破壞,可參考反病毒系列第006篇的文章內容。
二、AutoRun.inf的免疫原理
我們在網(wǎng)上可以找到很多免疫工具,現(xiàn)在一些修改版的操作系統(tǒng)里面也會提供這樣一個免疫工具。它免疫的原理是建立一個不被刪除的AutoRun.inf文件夾,以防止病毒生成一個運行病毒的AutoRun.inf。其免疫要點是:
1、防止病毒在驅動器根目錄下生成autorun.inf文件。
2、防止病毒破壞我們的免疫措施。
對于第一點,我們可以在驅動器根目錄下做一個autorun.inf文件夾,原理是同一個目錄中文件不能和文件夾重名。對于第二點,我們在剛才建立的autorun.inf文件夾中做一個不可刪除的目錄即可實現(xiàn)。
Windows下,不能夠以下面這些字樣來命名文件/文件夾,包括:aux、com1、com2、prn、con、nul等,因為這些名字都屬于設備名稱,等價于一個DOS設備。如果我們把文件命名為這些名字,Windows就會誤以為發(fā)生重名。而以這些名字命名的文件夾雖可以訪問,也可以建立文件夾,但卻無法刪除,因為Windows不允許以這種方式刪除設備。在系統(tǒng)看來,這個文件夾就是設備。如果不以設備名稱作為文件名,也可以采用某些方法給文件或者文件起一個包含非法字符的名稱,這樣一來,它們也是不能夠被刪除的,這也是接下來所要討論的方法。而這類名稱,雖然不能夠用正常的手段進行創(chuàng)建與刪除,但是我們是可以通過編程實現(xiàn)的,接下來就對編程方法進行討論。
三、利用MFC制作免疫程序的界面
首先需要建立一個基于對話框的MFC程序,然后界面上的默認控件,添加一個Combo Box控件和兩個Button控件
圖1 程序界面
將界面中的三個控件的ID分別改為:IDC_COMBO_DRIVER、IDC_IMMUNITY和IDC_CANCEL。然后再給ComboBox控件添加一個類型為“Control”,名稱為“m_ComboDriver”的變量。
這里有一點需要說明的是,很多初學者發(fā)現(xiàn)程序在運行后,單擊Combo Box控件右邊的下三角,無法打開下拉選項,而用鍵盤的“↓”卻可以進行下拉項的選擇。其實這是因為在界面設計時,需要將Combo Box控件向下拉一定的范圍才可以。單擊右邊的倒三角,就能夠進行調整:
圖2 調整Combo Box控件顯示范圍
至此,界面設計完畢,還是非常簡單的,接下來就要添加代碼來實現(xiàn)功能了。
四、編寫免疫程序的代碼
程序中的Combo Box控件是用來選擇想要進行免疫的盤符的,所以需要在控件中顯示出所有的盤符供用戶選擇,這里定義一個函數(shù)以實現(xiàn)相應的功能。在CImmunityARDlg.cpp文件中,找到OnInitDialog()函數(shù),在“// TODO: Add extra initialization here”與“return”之間的進行函數(shù)聲明:
[cpp] view plain copy
InitComboDriver();
以表明程序對話框的初始設定,然后在OnInitDialog()函數(shù)的后面添加InitComboDriver()函數(shù):
[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);
//每個盤符占據(jù)4個字節(jié),所以加上4可以切換到下一個盤符
pTmp += 4;
}
}
對于初學者來說,還有一點需要注意的是,由于這里我們自定義了InitComboDriver()函數(shù),因此一定要把這個函數(shù)的聲明添加到頭文件,也就是CImmunityARDlg.h中,可以在public下添加:
[cpp] view plain copy
void InitComboDriver();
接下來添加“Immunity”按鈕的代碼,雙擊該按鈕就可以來到代碼編輯界面,首先在最上方添加兩個宏定義:
[cpp] view plain copy
//創(chuàng)建的目錄名稱
#define AUTORUN "autorun.inf"
//創(chuàng)建無法刪除的目錄
#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);
//創(chuàng)建autorun.inf文件夾
strcat(szPath, AUTORUN);
BOOL bRet = CreateDirectory(szPath,NULL);
//盤符無法免疫的情況,可能已經(jīng)免疫或盤符不可寫
if(!bRet)
{
//在MFC中推薦使用AfxMessageBox
AfxMessageBox("Immunity error!");
return;
}
//創(chuàng)建無法刪除的用來進行免疫的文件夾
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.infImmunity...
GetDlgItemText(IDC_COMBO_DRIVER, szPath, MAX_PATH);
strcat(szPath, AUTORUN);
strcat(szPath, IMMUNITY);
RemoveDirectory(szPath);
//清空保存有路徑信息的數(shù)組
ZeroMemory(szPath,MAX_PATH);
//刪除文件夾autorun.inf,其路徑為X:autorun.inf
//注意這里的目錄需要從里向外一層層刪除
GetDlgItemText(IDC_COMBO_DRIVER, szPath, MAX_PATH);
strcat(szPath, AUTORUN);
RemoveDirectory(szPath);
}
至此所有代碼編寫完畢,經(jīng)實際測試,可以達到相應的效果,這里不再贅述。
五、知識補充
上述程序中用到了ZeroMemory()函數(shù),我以前的程序中為了達到相同的目的,也用過memt()函數(shù),二者的區(qū)別在于:
1、ZeroMemory()是微軟SDK提供的,memt()是屬于C Run-timeLibrary提供的,因此ZeroMemory()只能用于Windows系統(tǒng),而memt()還可以用于其他系統(tǒng)。
2、ZeroMemory()是一個宏,只是用于把一段內存的內容置零,內部其實是用memt()實現(xiàn)的,而memt()除了對內存清零操作,還可以將內存置成別的字符。
3、如果程序是Win32程序而不想連接CRun-time Library,就用ZeroMemory;如果需要跨平臺,就用memt。ZeroMemory相當于memt(buffer,0,length)。
對于AfxMessageBox和MessageBox的區(qū)別如下:
1、AfxMessageBox是MFC庫提供的全局函數(shù),提供了多種重載形式,而MessageBox是標準的Windows API函數(shù)。
2、AfxMessageBox函數(shù)在任何類里邊都可以使用,而MessageBox()函數(shù)只能在CWnd類的繼承類中使用。另外,AfxMessageBox()函數(shù)的參數(shù)沒有MessageBox()函數(shù)的參數(shù)豐富,所以后者較前者靈活。
3、AfxMessageBox不能控制消息框標題,常用于調試程序時的內部數(shù)據(jù)輸出或警告;MessageBox比較正式,常用在要提交的應用程序版本中,可以控制標題內容而不必采用含義不明的可執(zhí)行文件名為標題。
本文發(fā)布于:2023-02-28 20:13:00,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/167766398482100.html
版權聲明:本站內容均來自互聯(lián)網(wǎng),僅供演示用,請勿用于商業(yè)和其他非法用途。如果侵犯了您的權益請與我們聯(lián)系,我們將在24小時內刪除。
本文word下載地址:afxmessagebox.doc
本文 PDF 下載地址:afxmessagebox.pdf
| 留言與評論(共有 0 條評論) |