网络坦然编程:U盘退守柔件

作者:admin| 发表于2021-07-06 16:16 点击数:

在早期互联网还不发达的时候,病毒都是经过柔盘、光盘等序言进走传播的。到后来互联网被通俗以后,经过互联网进走传播的病毒大面积地相继展现。固然柔盘已经被镌汰,但是并异国使移动磁盘的病毒缩短。相逆,U盘的通俗使得移动磁盘对病毒的传播更添方便。U盘的数据传输速度和数据存储容量等众方面都比柔盘要先辈许众,所以,柔盘能够传播病毒,U盘自然也能够传播病毒。

经过U盘来传播病毒清淡是行使操作编制的主动运走功能,并相符作U盘下的Autorun.inf文件来实现的。著名的“摆渡抨击”就是凭借此Autorun.inf来进走实走的。倘若让操作编制不主动运走移动磁盘,或者保证移动磁盘下不存在Autorun.inf文件,那么经过U盘感染病毒的几率就幼许众了。

1. 经过编制配置不准主动运走

先来介绍如何经过编制配置不准U盘中Autorun.inf的主动运走。清淡情况下必要进走两方面的竖立,一方面是经过“管理工具”中的“服务”来进走竖立,另一方面是经过“组策略”来进走竖立。清淡这两处都必要进走修改。下面别离介绍如何对这两处进走竖立。

先来望如何在“服务”中进走竖立。最先掀开限制面板中的“管理工具”,然后找到“服务”,将其双击掀开。在服务列外中找到名称为“Shell Hardware Detection”的服务,双击该服务,掀开“Shell Hardware Detection的属性”对话框。单击“停留”按钮将该服务停留,再把“启动类型”修改为“已禁用”状态,如图1所示。

图1  禁用“Shell Hardware Detection”服务

将服务中的“Shell Hardware Detection”禁用后,再对“组策略”进走竖立。最先在“运走”中输入“gpedit.msc”,然后挨次单击左边的树形控件“计算机配置”→“管理模板”→“编制”,再在右边双击“关闭主动播放”选项,弹出“关闭主动播放属性”对话框。在“竖立”选项卡中选择“已启用”单选项,在“关闭主动播放”处选择“一切驱动器”选项,竖立完善后单击“确定”按钮。再到左边的树形控件中选择“用户配置”→“管理模板”→“编制”,到右边找到“主动关闭播放”选项,竖立手段同上,如图2所示。

图2  组策略中的“关闭主动播放”

经过以上竖立,实在能够相对有效地珍惜计算机不中U盘有关的病毒。不过,不克所以而已足,由于方针是打造一个U盘退守的柔件。

2. 打造一个浅易的U盘退守柔件

这边打造一个U盘防火墙,当插入U盘时会有挑示,并暂时动检查U盘下是否有Autorun.inf文件,并解析Autorun.inf文件。除此之外,经过U盘防火墙能够掀开U盘,从而坦然地行使U盘。

如何才能清新有U盘被插入电脑呢?能够行使准时器一向地检查,也能够开启一个线程一向地检查,还能够经过Windows的新闻得到告诉。前两栽手段笨了些,这边主动一向地检查是否有U盘插入,不如被动地期待Windows的新闻来告诉。

在Windows下有一个新闻能够告诉行使程序计算机配置发生了转折,这个新闻是WM_ DEVICECHANGE。新闻过程定义如下:

LRESULT CALLBACK WindowProc(   HWND hwnd,  UINT uMsg,   WPARAM wParam,   LPARAM lParam  ); 

该新闻经过两个附添参数来进走行使,其中wParam外示设备转折的事件,lParam外示事件对答的数据。要得到设备被插入的新闻类型,所以wParam的取值为DBT_DEVIC EARRIVAL,而该新闻对答的数据类型为DEV_BROADCAST_HDR,该组织体的定义如下:

typedef struct _DEV_BROADCAST_HDR {   DWORD dbch_size;   DWORD dbch_devicetype;   DWORD dbch_reserved;  } DEV_BROADCAST_HDR;  typedef DEV_BROADCAST_HDR *PDEV_BROADCAST_HDR; 

在该组织体中,主要望的是dbch_devicetype,也就是设备的类型。倘若设备类型为DBT_DEVTYP_VOLUME,则把现在组织体转换为DEV_BROADCAST_VOLUME组织体,该组织体定义如下:

typedef struct _DEV_BROADCAST_VOLUME {   DWORD dbcv_size;   DWORD dbcv_devicetype;   DWORD dbcv_reserved;   DWORD dbcv_unitmask;   WORD dbcv_flags;  } DEV_BROADCAST_VOLUME;  typedef DEV_BROADCAST_VOLUME *PDEV_BROADCAST_VOLUME; 

在该组织体中,主要望的是dbcv_unitmask和dbcv_flags。dbcv_unitmask经过位外示逻辑盘符,第0位外示A盘,第1位外示B盘。dbcv_flags外示受影响的盘符或序言,其值为0时外示U盘或移动硬盘。

上面介绍了WM_DEVICECHANGE新闻,由所以在MFC下进走开发的,所以能够行使OnDeviceChange()新闻相答函数来代替WM_DEVICECHANGE新闻。固然行使了OnDeviceChange()新闻相答函数而异国行使WM_DEVICECHANGE,但是相答函数的附添参数与WM_DEVICECHANGE相通。OnDeviceChange()函数定义如下:

afx_msg BOOL OnDeviceChange( UINT nEventType, DWORD dwData ); 
3. 经过OnDeviceChange()新闻获得被插入U盘的盘符

下面行使MFC下的OnDeviceChange()新闻相答函数来编写一个获取被插入U盘的盘符的幼程序,为编写U盘防火墙做浅易的准备做事。最先来增补新闻映射,详细代码如下:

BEGIN_MESSAGE_MAP(CUFirewallDlg, CDialog)   //{{AFX_MSG_MAP(CUFirewallDlg)   ON_MESSAGE(WM_DEVICECHANGE, OnDeviceChange)   ON_WM_SYSCOMMAND()   ON_WM_PAINT()   ON_WM_QUERYDRAGICON()   //}}AFX_MSG_MAP  END_MESSAGE_MAP() 

在头文件中增补新闻相答函数的定义,详细如下:

// Generated message map functions  //{{AFX_MSG(CUFirewallDlg)  afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData); // 新闻相答函数  virtual BOOL OnInitDialog();  afx_msg void OnSysCommand(UINT nID, LPARAM lParam);  afx_msg void OnPaint();  afx_msg HCURSOR OnQueryDragIcon();  //}}AFX_MSG 

末了增补新闻相答函数的实现,详细代码如下:

BOOL CUFirewallDlg::OnDeviceChange(UINT nEventType, DWORD dwData)  {    if ( nEventType == DBT_DEVICEARRIVAL )    {      PDEV_BROADCAST_HDR pDevHdr = (PDEV_BROADCAST_HDR)dwData;      if ( pDevHdr->dbch_devicetype == DBT_DEVTYP_VOLUME )      {        PDEV_BROADCAST_VOLUME pDevVolume = (PDEV_BROADCAST_VOLUME)pDevHdr;        // pDevVolume->dbcv_flags 为 0 外示为 U 盘        if ( pDevVolume->dbcv_flags == 0 )        {          CString DriverName;          char i;          // 经过将 pDevVolume->dbcv_unitmask 移位来判定盘符          DWORD dwUnitmask = pDevVolume->dbcv_unitmask;          for (i = 0; i < 26; ++i)          {            if ( dwUnitmask & 0x1)            {              break;            }            dwUnitmaskdwUnitmask = dwUnitmask >> 1;          }          if ( i >= 26 )          {            return ;          }          DriverName.Format("检测到的 U 盘盘符为: %c \r\n", i + 'A');          // 表现盘符          MessageBox(DriverName);        }      }    }  } 

将其编译连接并运走,插入一个U盘,得到如图3所示的挑示。

图3  检测到的U盘盘符

上面的这段代码能够将其封装为一个函数,封装后的函数定义如下:

VOID GetDriverName(DWORD dwData); 

在行使相通DBT_DEVICEARRIVAL的以DBT_起头的宏时,答包含头文件“dbt.h”文件。

4. U盘防火墙的完善

前线已经获得了被插入U盘的盘符,接下来就能够对U盘上的Autorun.inf文件进走分析,并删除要运走的程序,还能够坦然地掀开U盘。改写OnDeviceChange()函数,以实现要完善的功能,详细代码如下:

BOOL CUFirewallDlg::OnDeviceChange(UINT nEventType, DWORD dwData)  {    if ( nEventType == DBT_DEVICEARRIVAL )    {     GetDriverName(dwData);      MessageBox(DriverName);      if ( DriverName != "" )      {        m_SafeOpen.EnableWindow(TRUE);        CString File = DriverName;        File += "\\autorun.inf";        char szBuff[MAX_PATH] = { 0 };        if ( GetFileAttributes(File.GetBuffer(0)) == -1 )        {          m_SafeOpen.EnableWindow(FALSE);          return FALSE;        }        // 获取 open 后面的内容        GetPrivateProfileString("AutoRun","open",          NULL,szBuff,MAX_PATH,File.GetBuffer(0));        CString str;        str = "是否删除:";        str += szBuff;        if ( MessageBox(str, NULL, MB_YESNO) == IDYES )        {          // 删除要实走的文件          DeleteFile(str.GetBuffer(0));        }      }    }    else if ( nEventType == DBT_DEVICEREMOVECOMPLETE )    {      m_SafeOpen.EnableWindow(FALSE);    }    return TRUE;  } 

坦然掀开U盘的实当代码如下:

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

用DeleteFile()函数删除U盘中要运走的程序能够会战败,由于未必U盘并异国十足准备益。能够经过判定来完善,但这边就不给出代码了,行家可自走修改完善。代码中涉及两个新的API函数,别离是GetPrivateProfileString()和ShellExecute()。这两个函数的功能别离是获取配置文件中指定键的键值、运走指定的文件或文件夹。

在上面的程序中,经过挑示让用户选择是否要删除U盘中要被实走的文件。倘若用户对此并异国太众的晓畅和意识的话,很有能够不删除。倘若删了本不答删的文件,那么用户对该柔件的友益感便会降矮。答该如何做呢?答该竖立一个白名单和暗名单,不论是经过散列进走比较,照样经过文件名进走比较,都能够。自然,越准确的匹配手段越益。如许,就能够挑早为用户进走判定了,然后给出一个坦然提出,如许不光挑高了柔件的友益度,而且会显得相对较为专科。

【编辑选举】塑胶跑道简介

鸿蒙官方战略相符作共建——HarmonyOS技术社区 美国每幼时遭受超过7次勒索柔件抨击 GCHQ负责人警告说勒索柔件已上升成为英国的头号网络坦然要挟 Avaddon勒索柔件背后的暗客向坦然钻研人员主动寄出解密密钥 异日十年勒索柔件抨击所致亏损将超2650亿美元 政策添持,助力发展 国家网络坦然产业园区(通州园) 政策发布会成功举办

Powered by 环球体育平台下载app @2018 RSS地图 HTML地图