Internet Explorer下載檔案的終極過濾 ———— 徹底監視Internet Explorer的下載 (轉)

worldblog發表於2007-12-15
Internet Explorer下載檔案的終極過濾 ———— 徹底監視Internet Explorer的下載 (轉)[@more@]

Inte Explorer的終極過濾

  ———— 徹底監視Internet Explorer的下載


你是否想過類似下面的一些問題?

l  如何過濾IE中的flash?

l  如何過濾在網頁中嵌入e的尼姆達?

l  如何實現像netants、那樣的下載監視呢?

看到上面問題,你會很快認為這很簡單:

“對IE的下載進行監視不就得了?發現字尾是”.swf”的檔案就不進行下載。這樣就過濾了flash.同理,發現字尾是”.eml”的下載也做同樣處理……”

那麼,話說回來,如何徹底監視IE的下載呢?你不會為了這個寫一個吧?

如果你熟悉IE的話,會馬上意識到---使用BHO(Browser Helper )。

但,僅僅使用BHO是不夠的。

BHO類似鉤子(hook),特別的地方是:它鉤的是IE的事件。

如果你還不熟悉BHO,請到MSDN網站看下面的文章:
.com/Mind/0598/browhelp.htm">

透過上面文章你會發現,BHO可以”hook”到IE的所有事件:

Navigate->NavigateComplete->Downloaegin->Complete->DocumentComplete等等。



但它hook不到IE的整個下載事件!比如:

首頁裡包含了大量的gif檔案,BHO面對著它們變成了盲人……

說了這麼多廢話~~~~下面拿出克敵法寶吧!

先了解一下IinternetProtocol 的Start方法:

HRESULT Start(:namespace prefix = o ns = "urn:schemas-microsoft-com::office" />


  LPCWSTR szUrl,//


  IInternetProtocolSink *pOIProtSink,


  IInternetBindInfo *pOIBindInfo,


  D grfPI,


  HANDLE_PTR dwReserved


);


只要實現了IE的這個IinternetProtocolRoot介面,在其Start方法中檢查szUrl,就做到了監視IE的下載。


那麼,怎麼過濾呢?再看看IinternetProtocolSink介面的ReportResult方法!

HRESULT ReportResult(


  HRESULT hrResult,


  DWORD dwError,


  LPCWSTR szResult


);


只需要在Start中其第二個引數pOIProtSink的ReportResult方法就可以實現過濾。實際上就是在IE下載檔案之前欺騙IE說檔案已經下載完畢了。

比方說我們要過濾IE中的gif檔案,那麼只需要實現以下程式碼:

STDMETHODIMP CQUrl::Start(//這裡,我的類名叫CQUrl,大家不必理會
 LPCWSTR szUrl, IInternetProtocolSink *pIProtSink,
  IInternetBindInfo *pIBindInfo,  DWORD grfSTI,
DWORD dwReserved)

{


  USES_CONVERSION;

  char *str=OLE2A(szUrl);

  if(strlen(str) > 4)


  {


  str = str + strlen(str) - 4; //取資源的最後四個字元,用來比較檔案字尾


    if(_strnicmp(str,".gif",4) == 0)//字尾是gif


    {


    pIProtSink->ReportResult(S_OK, 0, 0);//告訴IE:下載已經結束了!          return S_OK;//返回,如果你返回INET_E_DOWNLOAD_FAILURE將看到另外一幅景象……


    }


  }


  return_E_USE_DEFAULT_PROTOCOLHANDLER;


}


 


熟悉了監視過濾的一般方法,下面開始把監視過濾工作深入到IE之中吧!


拿上面MIND雜誌的iehelper的例項說起。


 


我們在IEHelper的基礎上填加一個ATL,在其中繼承IinternetProtocol


並實現IinternetProtocolRoot的Start方法就可以了!


 


剩下所需的工作僅僅是在IEHelper的構造中實現上面填加的atl物件。


在IEHelper類里加兩個介面的指標:


IInternetSession* m_pSession;


  IClasactory* m_pFactory;


然後建立物件:


  CIEHlprObj() 


  {


    HRESULT hr = CoGetClassObject(CLSID_FiltUrl, CLSCTX_SERVER, NULL, IID_IClassFactory, (void**)&m_pFactory);


    if(hr==S_OK)


  {


      if(CoInternetGetSession(0, &m_pSession, 0)==S_OK)


      m_pSession->RegisterNameSpace(m_pFactory, CLSID_FiltUrl, L"http", 0, NULL, 0);    //監視HTTP服務


    } 


  }


必要的時候析構:


CIEHlprObj::~CIEHlprObj()


{


  if(m_pSession!=NULL)


  {


    m_pSession->UnregisterNameSpace(m_pFactory, L"http");


    m_pSession->Release();


    m_pSession = NULL;


  }


  if(m_pFactory!=NULL)


  {


    m_pFactory->Release();


    m_pFactory = NULL;


  }


}


唉,好累,不寫了,煩,顛三倒四的。


具體的看程式碼吧:(請不要把程式碼用於商業用途!)


/FiltUrlIE.rar">


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993609/,如需轉載,請註明出處,否則將追究法律責任。

相關文章