tft每日頭條

 > 科技

 > 公平鎖編程源碼

公平鎖編程源碼

科技 更新时间:2024-11-25 12:48:50

公平鎖編程源碼(黑客編程制作AutoRun.inf免疫程序)1

公平鎖編程源碼(黑客編程制作AutoRun.inf免疫程序)2

公平鎖編程源碼(黑客編程制作AutoRun.inf免疫程序)3

安全類工具制作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控件

公平鎖編程源碼(黑客編程制作AutoRun.inf免疫程序)4

圖1 程序界面

将界面中的三個控件的ID分别改為:IDC_COMBO_DRIVER、IDC_IMMUNITY和IDC_CANCEL。然後再給ComboBox控件添加一個類型為“Control”,名稱為“m_ComboDriver”的變量。

這裡有一點需要說明的是,很多初學者發現程序在運行後,單擊Combo Box控件右邊的下三角,無法打開下拉選項,而用鍵盤的“↓”卻可以進行下拉項的選擇。其實這是因為在界面設計時,需要将Combo Box控件向下拉一定的範圍才可以。單擊右邊的倒三角,就能夠進行調整:

公平鎖編程源碼(黑客編程制作AutoRun.inf免疫程序)5

圖2 調整Combo Box控件顯示範圍

至此,界面設計完畢,還是非常簡單的,接下來就要添加代碼來實現功能了。

四、編寫免疫程序的代碼

程序中的Combo Box控件是用來選擇想要進行免疫的盤符的,所以需要在控件中顯示出所有的盤符供用戶選擇,這裡定義一個函數以實現相應的功能。在CImmunityARDlg.cpp文件中,找到OnInitDialog()函數,在“// TODO: Add extra initialization here”與“return”之間的進行函數聲明:

[cpp] view plain copy

  1. InitComboDriver();

以表明程序對話框的初始設定,然後在OnInitDialog()函數的後面添加InitComboDriver()函數:

[cpp] view plain copy

  1. void CImmunityARDlg::InitComboDriver()

  2. {

  3. char szDriverString[MAXBYTE] = { 0 };

  4. char *pTmp = NULL;

  5. //設置編輯框顯示的内容

  6. SetDlgItemText(IDC_COMBO_DRIVER,_T("Select a drive letter..."));

  7. //獲取字符串類型的驅動器列表

  8. GetLogicalDriveStrings(MAXBYTE, szDriverString);

  9. pTmp = szDriverString;

  10. while( *pTmp )

  11. {

  12. //向CComboBox中添加字符串

  13. m_ComboDriver.AddString(pTmp);

  14. //每個盤符占據4個字節,所以加上4可以切換到下一個盤符

  15. pTmp = 4;

  16. }

  17. }

對于初學者來說,還有一點需要注意的是,由于這裡我們自定義了InitComboDriver()函數,因此一定要把這個函數的聲明添加到頭文件,也就是CImmunityARDlg.h中,可以在public下添加:

[cpp] view plain copy

  1. void InitComboDriver();

接下來添加“Immunity”按鈕的代碼,雙擊該按鈕就可以來到代碼編輯界面,首先在最上方添加兩個宏定義:

[cpp] view plain copy

  1. //創建的目錄名稱

  2. #define AUTORUN "autorun.inf"

  3. //創建無法删除的目錄

  4. #define IMMUNITY \\Immunity...\\

然後對按鍵定義如下代碼:

[cpp] view plain copy

  1. void CImmunityARDlg::OnBtnImmunity()

  2. {

  3. // TODO: Add your control notification handler code here

  4. char szPath[MAX_PATH] = { 0 };

  5. GetDlgItemText(IDC_COMBO_DRIVER, szPath, MAX_PATH);

  6. //創建autorun.inf文件夾

  7. strcat(szPath, AUTORUN);

  8. BOOL bRet = CreateDirectory(szPath,NULL);

  9. //盤符無法免疫的情況,可能已經免疫或盤符不可寫

  10. if(!bRet)

  11. {

  12. //在MFC中推薦使用AfxMessageBox

  13. AfxMessageBox("Immunity error!");

  14. return;

  15. }

  16. //創建無法删除的用來進行免疫的文件夾

  17. strcat(szPath,IMMUNITY);

  18. bRet = CreateDirectory(szPath, NULL);

  19. if(!bRet)

  20. {

  21. AfxMessageBox("Immunity error!");

  22. }

  23. }

接下來是給Cancel按鈕添加代碼:

[cpp] view plain copy

  1. void CImmunityARDlg::OnBtnCancel()

  2. {

  3. // TODO: Add your control notification handler code here

  4. char szPath[MAX_PATH] = { 0 };

  5. //删除文件夾Immunity...,其路徑為X:\autorun.inf\Immunity...

  6. GetDlgItemText(IDC_COMBO_DRIVER, szPath, MAX_PATH);

  7. strcat(szPath, AUTORUN);

  8. strcat(szPath, IMMUNITY);

  9. RemoveDirectory(szPath);

  10. //清空保存有路徑信息的數組

  11. ZeroMemory(szPath,MAX_PATH);

  12. //删除文件夾autorun.inf,其路徑為X:\autorun.inf

  13. //注意這裡的目錄需要從裡向外一層層删除

  14. GetDlgItemText(IDC_COMBO_DRIVER, szPath, MAX_PATH);

  15. strcat(szPath, AUTORUN);

  16. RemoveDirectory(szPath);

  17. }

至此所有代碼編寫完畢,經實際測試,可以達到相應的效果,這裡不再贅述。

五、知識補充

上述程序中用到了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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved