• 防止密码被非法获取


     防   止   密   码   被   非   法   获   取    
      郝   峰    
         
      ----Windows   虽   然   是   一   个   功   能   强   大   的   操   作   系   统,   但   其   存   在   的   一   些   先   天   性   不   足   给   黑   客    
      留   下   了   许   多   可   乘   之   机,   著   名   的BO   程   序   就   是   利   用Windows   的   这   些   漏   洞   来   危   害   计   算   机   的  
        安   全。   笔   者   最   近   发   现   了   一   个   很   流   行   的   专   门   获   取Edit   框Password   的   工   具,   甚   至   其   源   代    
      码   已   在   某   报   纸   上   发   表   了,   这   无   疑   是   对Edit   的Password   功   能   的   完   全   否   定。   本   文   将   首   先  
      分   析   非   法   获   取Password   的   原   理,   然   后   给   出   用Visual   C   +   +   来   实   现   保   护Edit   框   中   的  
      Password   不   被   非   法   获   取   的   对   策。    
      一、   非   法   获   取Password   的   原   理    
      ----Edit   是Windows   的   一   个   标   准   控   件,   当   把   其   Password   属   性   设   为True   时,   就   会   将   输   入   的    
      内   容   屏   蔽   为   星   号(   *),   从   而   达   到   保   护   的   目   的。   而Edit   框   中   的   内   容   可   通   过   发    
      WM_GETTEXT,EM_GETLINE   消   息   来   获   取。   黑   客   程   序   就   是   利   用Edit   的   这   个   特   性,   首   先   枚   举   当    
      前   程   序   的   所   有   子   窗   口,   当   发   现   枚   举   的   窗   口   是EDIT   并   且   具   有ES_PASSWORD   属   性   时,   则   通    
      过SendMessage   向   此   窗   口   发   送WM_GETTEXT   或EM_GETLINE   消   息,   这   样Edit   框   中   的   内   容   就   一   目   了    
      然   了。    
      二、   对Password   进   行   保   护    
      ----由   上   述   分   析   可   看   出,Edit   的   漏   洞   在   于   没   有   检   查   发   送WM_GETTEXT   或EM_GETLINE   消   息   者    
      的   身   份,   只   要   找   到Edit   窗   口   句   柄,   任   何   进   程   都   可   获   取   其   内   容。   这   里   给   出   一   种   简   单    
      的   方   法   来   验   证   发   送   消   息   者   的   身   份   是   否   合   法。    
      ----1.   创   建   新CEdit   类    
      ----从CEdit   继   承   一   个   子   类CPasswordEdit,   申   明   全   局   变   量g_bAuthorIdentity   表   明   消   息   发   送   者  
      的   身   份:    
              BOOL   g_bAuthorIdentity;  
      ----然   后   响   应CWnd   的   虚   函   数DefWindowProc,   在   这   个   回   调   函   数   中   进   行   身   份   验   证:    
              LRESULT   CPasswordEdit::DefWindowProc  
          (UINT   message,   WPARAM   wParam,   LPARAM   lParam)    
              {  
                      //   对Edit   的   内   容   获   取   必   须   通   过    
                          以   下   两   个   消   息   之   一  
                      if((   message   ==   WM_GETTEXT)    
                      ||   (   message   ==   EM_GETLINE))  
                      {  
                              //   检   查   是   否   为   合   法  
                              if(   !g_bAuthorIdentity)  
                              {  
                                      //   非   法   获   取,   显   示   信   息  
                                      AfxMessageBox(_T  
                      (“   我   的   密   码,   可   不   能   让   你   看!"));  
                                      //    
                                      return   0;  
                              }  
                              //   合   法   获   取  
                              g_bAuthorIdentity   =   FALSE;  
                      }  
                      return   CEdit::DefWindowProc  
                        (message,   wParam,   lParam);  
              }  
               
       
      ----2.   在   数   据   输   入   对   话   框   中   做   处   理    
      ----在   对   话   框   中   申   明   一   个   类   成   员m_edtPassword:    
              CPasswordEdit   m_edtPassword;  
      ----然   后   在   对   话   框   的OnInitDialog()   中   加   入   下   列   代   码:    
              m_edtPassword.SubclassDlgItem(IDC_EDIT_   PASSWORD,   this);  
      ----其   目   的   是   将   控   制   与   新   类   做   关   联。    
      ----之   后   在   对   话   框   的   数   据   交   换   中   将   身   份   设   为   合   法:    
              void   CDlgInput::DoDataExchange  
              (CDataExchange   *   pDX)  
              {  
                //   如   果   获   取   数   据  
                //   注   意:   对   于CPropertyPage   类   这   里   不   需   要if  
                (   pDX   ->m_bSaveAndValidate)   条   件  
                      if(   pDX   ->m_bSaveAndValidate)  
                      {  
                              g_bAuthorIdentity   =   TRUE;  
                      }                    
                      CDialog::DoDataExchange(pDX);  
                  //{{AFX_DATA_MAP(CDlgInput)  
                  DDX_Text  
                (pDX,   IDC_EDIT_PASSWORD,   m_sPassword);  
                  //}}AFX_DATA_MAP  
              }  
      ----这   样,Password   输   入   框   就   会   受   到   保   护。    
      三、   需   要   注   意   的   问   题  
      ----以   上   的   方   法   仅   针   对VC   程   序,   对   于VB   程   序,   需   要   借   助VC   做   一   个Password   的ActiveX   控    
      件,   实   现   方   法   与   上   类   似。   以   上   程   序   在Visual   C   +   +6.0   上   通   过,   并   且   用   黑   客   程   序  
      PWBTool   测   试   通   过。   完   整   演   示   代   码   请   到http://myhelper.yeah.net   的“   编   程   技   巧”   下   载。

  • 相关阅读:
    第19章 网络通信----网络程序设计基础
    第18章 多线程----线程同步
    第18章 多线程----线程的优先级
    一款基于jquery和css3的响应式二级导航菜单
    一款纯css3实现的颜色渐变按钮
    一款基于jquery的手风琴显示详情
    推荐10款纯css3实现的实用按钮
    一款纯css3实现的数字统计游戏
    一款基于jquery ui的动画提交表单
    一款纯css实现的漂亮导航
  • 原文地址:https://www.cnblogs.com/buffer/p/1408341.html
Copyright © 2020-2023  润新知