自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

網(wǎng)絡(luò)安全編程:U盤防御軟件

安全
在早期互聯(lián)網(wǎng)還不發(fā)達(dá)的時候,病毒都是通過軟盤、光盤等媒介進(jìn)行傳播的。到后來互聯(lián)網(wǎng)被普及以后,通過互聯(lián)網(wǎng)進(jìn)行傳播的病毒大面積地相繼出現(xiàn)

[[405637]]

 在早期互聯(lián)網(wǎng)還不發(fā)達(dá)的時候,病毒都是通過軟盤、光盤等媒介進(jìn)行傳播的。到后來互聯(lián)網(wǎng)被普及以后,通過互聯(lián)網(wǎng)進(jìn)行傳播的病毒大面積地相繼出現(xiàn)。雖然軟盤已經(jīng)被淘汰,但是并沒有使移動磁盤的病毒減少。相反,U盤的普及使得移動磁盤對病毒的傳播更加方便。U盤的數(shù)據(jù)傳輸速度和數(shù)據(jù)存儲容量等多方面都比軟盤要先進(jìn)很多,因此,軟盤可以傳播病毒,U盤當(dāng)然也可以傳播病毒。

通過U盤來傳播病毒通常是使用操作系統(tǒng)的自動運(yùn)行功能,并配合U盤下的Autorun.inf文件來實(shí)現(xiàn)的。著名的“擺渡攻擊”就是依靠此Autorun.inf來進(jìn)行實(shí)施的。如果讓操作系統(tǒng)不自動運(yùn)行移動磁盤,或者保證移動磁盤下不存在Autorun.inf文件,那么通過U盤感染病毒的幾率就小很多了。

1. 通過系統(tǒng)配置禁止自動運(yùn)行

先來介紹如何通過系統(tǒng)配置禁止U盤中Autorun.inf的自動運(yùn)行。通常情況下需要進(jìn)行兩方面的設(shè)置,一方面是通過“管理工具”中的“服務(wù)”來進(jìn)行設(shè)置,另一方面是通過“組策略”來進(jìn)行設(shè)置。一般這兩處都需要進(jìn)行修改。下面分別介紹如何對這兩處進(jìn)行設(shè)置。

先來看如何在“服務(wù)”中進(jìn)行設(shè)置。首先打開控制面板中的“管理工具”,然后找到“服務(wù)”,將其雙擊打開。在服務(wù)列表中找到名稱為“Shell Hardware Detection”的服務(wù),雙擊該服務(wù),打開“Shell Hardware Detection的屬性”對話框。單擊“停止”按鈕將該服務(wù)停止,再把“啟動類型”修改為“已禁用”狀態(tài),如圖1所示。

圖1  禁用“Shell Hardware Detection”服務(wù)

將服務(wù)中的“Shell Hardware Detection”禁用后,再對“組策略”進(jìn)行設(shè)置。首先在“運(yùn)行”中輸入“gpedit.msc”,然后依次單擊左邊的樹形控件“計(jì)算機(jī)配置”→“管理模板”→“系統(tǒng)”,再在右邊雙擊“關(guān)閉自動播放”選項(xiàng),彈出“關(guān)閉自動播放屬性”對話框。在“設(shè)置”選項(xiàng)卡中選擇“已啟用”單選項(xiàng),在“關(guān)閉自動播放”處選擇“所有驅(qū)動器”選項(xiàng),設(shè)置完成后單擊“確定”按鈕。再到左邊的樹形控件中選擇“用戶配置”→“管理模板”→“系統(tǒng)”,到右邊找到“自動關(guān)閉播放”選項(xiàng),設(shè)置方法同上,如圖2所示。

圖2  組策略中的“關(guān)閉自動播放”

通過以上設(shè)置,的確可以相對有效地保護(hù)計(jì)算機(jī)不中U盤相關(guān)的病毒。不過,不能因此而滿足,因?yàn)槟康氖谴蛟煲粋€U盤防御的軟件。

2. 打造一個簡易的U盤防御軟件

這里打造一個U盤防火墻,當(dāng)插入U(xiǎn)盤時會有提示,并且自動檢查U盤下是否有Autorun.inf文件,并解析Autorun.inf文件。除此之外,通過U盤防火墻可以打開U盤,從而安全地使用U盤。

如何才能知道有U盤被插入電腦呢?可以使用定時器不斷地檢查,也可以開啟一個線程不斷地檢查,還可以通過Windows的消息得到通知。前兩種方法笨了些,這里主動不斷地檢查是否有U盤插入,不如被動地等待Windows的消息來通知。

在Windows下有一個消息可以通知應(yīng)用程序計(jì)算機(jī)配置發(fā)生了變化,這個消息是WM_ DEVICECHANGE。消息過程定義如下: 

  1. LRESULT CALLBACK WindowProc(  
  2.  HWND hwnd, 
  3.  UINT uMsg,  
  4.  WPARAM wParam,  
  5.  LPARAM lParam  
  6. ); 

該消息通過兩個附加參數(shù)來進(jìn)行使用,其中wParam表示設(shè)備改變的事件,lParam表示事件對應(yīng)的數(shù)據(jù)。要得到設(shè)備被插入的消息類型,因此wParam的取值為DBT_DEVIC EARRIVAL,而該消息對應(yīng)的數(shù)據(jù)類型為DEV_BROADCAST_HDR,該結(jié)構(gòu)體的定義如下: 

  1. typedef struct _DEV_BROADCAST_HDR {  
  2.  DWORD dbch_size;  
  3.  DWORD dbch_devicetype;  
  4.  DWORD dbch_reserved;  
  5. } DEV_BROADCAST_HDR;  
  6. typedef DEV_BROADCAST_HDR *PDEV_BROADCAST_HDR; 

在該結(jié)構(gòu)體中,主要看的是dbch_devicetype,也就是設(shè)備的類型。如果設(shè)備類型為DBT_DEVTYP_VOLUME,則把當(dāng)前結(jié)構(gòu)體轉(zhuǎn)換為DEV_BROADCAST_VOLUME結(jié)構(gòu)體,該結(jié)構(gòu)體定義如下: 

  1. typedef struct _DEV_BROADCAST_VOLUME {  
  2.  DWORD dbcv_size;  
  3.  DWORD dbcv_devicetype;  
  4.  DWORD dbcv_reserved;  
  5.  DWORD dbcv_unitmask;  
  6.  WORD dbcv_flags;  
  7. } DEV_BROADCAST_VOLUME;  
  8. typedef DEV_BROADCAST_VOLUME *PDEV_BROADCAST_VOLUME; 

在該結(jié)構(gòu)體中,主要看的是dbcv_unitmask和dbcv_flags。dbcv_unitmask通過位表示邏輯盤符,第0位表示A盤,第1位表示B盤。dbcv_flags表示受影響的盤符或媒介,其值為0時表示U盤或移動硬盤。

上面介紹了WM_DEVICECHANGE消息,由于是在MFC下進(jìn)行開發(fā)的,因此可以使用OnDeviceChange()消息響應(yīng)函數(shù)來代替WM_DEVICECHANGE消息。雖然使用了OnDeviceChange()消息響應(yīng)函數(shù)而沒有使用WM_DEVICECHANGE,但是響應(yīng)函數(shù)的附加參數(shù)與WM_DEVICECHANGE相同。OnDeviceChange()函數(shù)定義如下:

  1. afx_msg BOOL OnDeviceChange( UINT nEventType, DWORD dwData ); 

3. 通過OnDeviceChange()消息獲得被插入U(xiǎn)盤的盤符

下面使用MFC下的OnDeviceChange()消息響應(yīng)函數(shù)來編寫一個獲取被插入U(xiǎn)盤的盤符的小程序,為編寫U盤防火墻做簡單的準(zhǔn)備工作。首先來添加消息映射,具體代碼如下: 

  1. BEGIN_MESSAGE_MAP(CUFirewallDlg, CDialog)  
  2.  //{{AFX_MSG_MAP(CUFirewallDlg)  
  3.  ON_MESSAGE(WM_DEVICECHANGE, OnDeviceChange)  
  4.  ON_WM_SYSCOMMAND()  
  5.  ON_WM_PAINT()  
  6.  ON_WM_QUERYDRAGICON()  
  7.  //}}AFX_MSG_MAP  
  8. END_MESSAGE_MAP() 

在頭文件中添加消息響應(yīng)函數(shù)的定義,具體如下: 

  1. // Generated message map functions  
  2. //{{AFX_MSG(CUFirewallDlg)  
  3. afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData); // 消息響應(yīng)函數(shù)  
  4. virtual BOOL OnInitDialog();  
  5. afx_msg void OnSysCommand(UINT nID, LPARAM lParam);  
  6. afx_msg void OnPaint();  
  7. afx_msg HCURSOR OnQueryDragIcon();  
  8. //}}AFX_MSG 

最后添加消息響應(yīng)函數(shù)的實(shí)現(xiàn),具體代碼如下: 

  1. BOOL CUFirewallDlg::OnDeviceChange(UINT nEventType, DWORD dwData)  
  2.  
  3.   if ( nEventType == DBT_DEVICEARRIVAL )  
  4.   {  
  5.     PDEV_BROADCAST_HDR pDevHdr = (PDEV_BROADCAST_HDR)dwData;  
  6.     if ( pDevHdr->dbch_devicetype == DBT_DEVTYP_VOLUME )  
  7.     {  
  8.       PDEV_BROADCAST_VOLUME pDevVolume = (PDEV_BROADCAST_VOLUME)pDevHdr;  
  9.       // pDevVolume->dbcv_flags 為 0 表示為 U 盤  
  10.       if ( pDevVolume->dbcv_flags == 0 )  
  11.       {  
  12.         CString DriverName;  
  13.         char i;  
  14.         // 通過將 pDevVolume->dbcv_unitmask 移位來判斷盤符  
  15.         DWORD dwUnitmask = pDevVolume->dbcv_unitmask;  
  16.         for (i = 0; i < 26; ++i)  
  17.         {  
  18.           if ( dwUnitmask & 0x1)  
  19.           {  
  20.             break;  
  21.           }  
  22.           dwUnitmaskdwUnitmask = dwUnitmask >> 1;  
  23.         }  
  24.         if ( i >= 26 )  
  25.         {  
  26.           return ;  
  27.         }  
  28.         DriverName.Format("檢測到的 U 盤盤符為: %c \r\n", i + 'A');  
  29.         // 顯示盤符  
  30.         MessageBox(DriverName);  
  31.       }  
  32.     }  
  33.   }  

將其編譯連接并運(yùn)行,插入一個U盤,得到如圖3所示的提示。

[[405638]]

圖3  檢測到的U盤盤符

上面的這段代碼可以將其封裝為一個函數(shù),封裝后的函數(shù)定義如下: 

  1. VOID GetDriverName(DWORD dwData); 

在使用類似DBT_DEVICEARRIVAL的以DBT_開頭的宏時,應(yīng)包含頭文件“dbt.h”文件。

4. U盤防火墻的完善

前面已經(jīng)獲得了被插入U(xiǎn)盤的盤符,接下來就可以對U盤上的Autorun.inf文件進(jìn)行分析,并刪除要運(yùn)行的程序,還可以安全地打開U盤。改寫OnDeviceChange()函數(shù),以實(shí)現(xiàn)要完成的功能,具體代碼如下: 

  1. BOOL CUFirewallDlg::OnDeviceChange(UINT nEventType, DWORD dwData)  
  2.  
  3.   if ( nEventType == DBT_DEVICEARRIVAL )  
  4.   { 
  5.     GetDriverName(dwData);  
  6.     MessageBox(DriverName);  
  7.     if ( DriverName != "" )  
  8.     {  
  9.       m_SafeOpen.EnableWindow(TRUE);  
  10.       CString File = DriverName 
  11.       File += "\\autorun.inf";  
  12.       char szBuff[MAX_PATH] = { 0 };  
  13.       if ( GetFileAttributes(File.GetBuffer(0)) == -1 )  
  14.       {  
  15.         m_SafeOpen.EnableWindow(FALSE);  
  16.         return FALSE;  
  17.       }  
  18.       // 獲取 open 后面的內(nèi)容  
  19.       GetPrivateProfileString("AutoRun","open",  
  20.         NULL,szBuff,MAX_PATH,File.GetBuffer(0));  
  21.       CString str;  
  22.       str = "是否刪除:" 
  23.       str += szBuff;  
  24.       if ( MessageBox(str, NULL, MB_YESNO) == IDYES )  
  25.       {  
  26.         // 刪除要執(zhí)行的文件  
  27.         DeleteFile(str.GetBuffer(0));  
  28.       }  
  29.     }  
  30.   }  
  31.   else if ( nEventType == DBT_DEVICEREMOVECOMPLETE )  
  32.   {  
  33.     m_SafeOpen.EnableWindow(FALSE);  
  34.   }  
  35.   return TRUE;  

安全打開U盤的實(shí)現(xiàn)代碼如下: 

  1. void CUFirewallDlg::OnBtnSafeopen()  
  2.  
  3.   // TODO: Add your control notification handler code here  
  4.   ShellExecute(NULL, "open", DriverName.GetBuffer(0), NULL, NULL, SW_SHOW);  

用DeleteFile()函數(shù)刪除U盤中要運(yùn)行的程序可能會失敗,因?yàn)橛袝rU盤并沒有完全準(zhǔn)備好。可以通過判斷來完成,但這里就不給出代碼了,大家可自行修改完成。代碼中涉及兩個新的API函數(shù),分別是GetPrivateProfileString()和ShellExecute()。這兩個函數(shù)的功能分別是獲取配置文件中指定鍵的鍵值、運(yùn)行指定的文件或文件夾。

在上面的程序中,通過提示讓用戶選擇是否要刪除U盤中要被執(zhí)行的文件。如果用戶對此并沒有太多的了解和認(rèn)識的話,很有可能不刪除。如果刪了本不該刪的文件,那么用戶對該軟件的友好感便會降低。應(yīng)該如何做呢?應(yīng)該建立一個白名單和黑名單,無論是通過散列進(jìn)行比較,還是通過文件名進(jìn)行比較,都可以。當(dāng)然,越精確的匹配方法越好。這樣,就可以提早為用戶進(jìn)行判斷了,然后給出一個安全建議,這樣不但提高了軟件的友好度,而且會顯得相對較為專業(yè)。 

 

責(zé)任編輯:龐桂玉 來源: 計(jì)算機(jī)與網(wǎng)絡(luò)安全
相關(guān)推薦

2021-03-03 12:20:42

網(wǎng)絡(luò)安全DLL編程

2019-07-17 10:23:44

網(wǎng)絡(luò)安全防御

2019-09-06 15:16:59

2021-01-26 13:45:03

網(wǎng)絡(luò)安全Winsock編程

2021-03-05 13:46:56

網(wǎng)絡(luò)安全遠(yuǎn)程線程

2019-03-22 07:44:01

2021-06-01 09:26:20

網(wǎng)絡(luò)安全APT代碼

2021-02-21 18:19:43

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全編程創(chuàng)建進(jìn)程

2023-10-18 07:08:54

2021-02-23 10:20:07

網(wǎng)絡(luò)安全進(jìn)程代碼

2010-12-21 18:22:30

2015-06-11 15:55:55

2020-07-16 07:54:39

網(wǎng)絡(luò)安全數(shù)據(jù)技術(shù)

2009-02-27 11:01:00

2009-10-23 20:41:06

2016-09-01 21:28:11

2020-02-20 08:13:45

網(wǎng)絡(luò)安全安全代碼數(shù)據(jù)泄露

2021-06-18 09:55:09

網(wǎng)絡(luò)安全目錄監(jiān)控

2016-10-10 00:18:27

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號