怎樣寫一個與Win8 IE11兼容的標準BHO?

怎樣寫一個與Win8 IE11兼容的標準BHO

 

 

 

環境:Windows8.1 x86 IE11(其它環境未討論)

作者:magictong

日期:2014/02/02

 

 

概述

微軟在20136月份推出了Windows8.1並且帶上了IE11,在一個不起眼的地方,偷偷的勾上了“啓動增強保護模式”功能(最新消息,11月份的時候微軟發了個更新又取消了這個勾,但是說不定哪天又發個更新給勾上)。然後你會發現一大批的IE插件淪陷了(迅雷,QQ下載助手等等,都無法生效了)。


等等!我大微軟不是號稱兼容做得最好的嗎……難道一棍子把所有的插件全部打死了?!

 

 

現象

我們看看自己的BHO插件的情況,找一個在老的瀏覽器下面工作的很好的BHO插件,然後在Windows8.1IE11下面註冊使用,慢着,BHO是啥?怎麼寫一個BHO,這……參考[1][2]吧,只能幫助你到這裏了。

註冊之後打開IE11,發現IE11的下面有這樣的提示。


某某插件與增強安全功能不兼容。打開這個詳細信息看看,發現是告訴你怎麼關閉這個增強安全功能。


查看管理加載項裏面的狀態,也是“不兼容”。


這下用戶心裏開始糾結了,從這個描述上看你的增強保護模式是加強安全保護的,如果關閉了是不是我就不安全了?如果不關閉,以前的一些好用的插件都無效了,這要用戶怎麼選?!當然更多的用戶是不知道發生了神馬,嗯!而對於我們這些軟件廠商來說,這是更大的負擔,看似一個小小的改動,又得忙活幾天了,對於軟件開發者來說,當然希望用戶不關閉增強保護功能(既不能幫助用戶關閉,也不能提示用戶關閉,這畢竟是一種不負責任的行爲),那麼要想我們的插件在用戶的機器上生效,看來得做點什麼……

 

 

解決方案

解鈴還須繫鈴人,當然得去問問微軟在這個增強保護模式上面做了什麼,參考[3],前面主要講IE11下面對Web訪問的影響等等,可以快速瀏覽下。和插件相關的在後半部分,需要仔細研究下。


這裏面提到,如果你的插件(不管是BHOAxtivex還是其它插件)想兼容EPM(增強保護模式),需要在註冊時標明本插件是增強保護模式兼容的,具體來說就是要把插件註冊到一個特殊的Com組件類型庫中,這個特殊的組件類型庫就是CATID_AppContainerCompatibleOK,註冊組件類型庫是不難的,我們試一下,在BHO的註冊代碼裏面添加下面的代碼。

DEFINE_GUID(CATID_AppContainerCompatible, 0x59fb2056, 0xd625,0x48d0, 0xa9, 0x44, 0x1a, 0x85, 0xb5, 0xab, 0x26, 0x40);

 

//DllRegisterServer - Adds entries to the system registry

STDAPIDllRegisterServer(void)

{

   HRESULThr =_AtlModule.DllRegisterServer();

 

   ICatRegister*pcr =NULL;

   HRESULThrRegCat =CoCreateInstance(CLSID_StdComponentCategoriesMgr,NULL,CLSCTX_INPROC_SERVER,IID_ICatRegister, (void**)&pcr);

   if(SUCCEEDED(hrRegCat)&&pcr)

   {

       CATIDrgcatid[1];

       rgcatid[0] =CATID_AppContainerCompatible;

       pcr->RegisterClassImplCategories(CLSID_AdPromotionImp, 1,rgcatid);

   }

 

   if(pcr)

       pcr->Release();

 

      returnhr;

}

 

看起來很簡單,但是行不行呢?試一下(注意:要重新註冊BHO,直接只替換文件是不行的!上面這種是動態註冊的方法,還有一種靜態註冊的方法(等下說),這種動態註冊的方法要注意的是,如果是用嚮導生成的BHO代碼,那麼DllRegisterServer裏面會有一段(_AtlModule.DllRegisterServer();)代碼,你的組件註冊代碼要放在它後面,否則註冊會被覆蓋掉而不生效,靜態註冊的方法沒有這種問題)。


是不是看到了熟悉“啓用”不“不啓用”提示?!果斷“啓用”。現在BHO是不是加載了,並且大部分功能都正常了呢?


有人說,我想那個啓動不啓用提示也沒有是否可以呢?答案是肯定的,但是過程卻是曲折的,如果你的BHO永遠只想當一個良民(標準BHO),還真的很困難,你得修改HKCU\Software\Microsoft\InternetExplorer\Approved Extensions\{05F5F404-7C24-4B39-B5CC-340CEDEB9C0D}這個註冊表下面的二進制值,這個裏面存儲的是微軟IE下的某個插件獲取到用戶信任(也就是用戶主動點了啓用)的數據,而這個值微軟是加密的,難以輕易破解,否則微軟架構的這套安全機制輕易就完蛋了。那隻能走其它的路子,做一個不標準的BHO,主要體現在不註冊COM,也不在標準BHO的註冊表位置註冊(IE通過枚舉這個位置來加載BHO),然後我們通過其它方式注入(消息鉤子,驅動,遠程線程……),這不是本文重點,可以參考[4]

之前提到,還有一種靜態註冊COM組件類型庫的方法,也很簡單,只需要在RGS文件裏面添加如下的內容就可以了。

 


其實原理都是類似的(不過要注意的是靜態添加的方法無法區分系統版本,而在低於win8的系統環境下面上面的rgs代碼是會註冊失敗的,除非你確信你的BHO只會在win8上存在,否則慎用)。。

 

 

更多問題

事情完全搞定了嗎?NoNoNo!萬里長征才走了第一步,我想有些人可能已經注意到了我在上面提到現在大部分功能已經正常了,也就是說還有很多功能是不正常的,這就牽扯出了IE11增強保護模式下的特殊權限問題,你會發現雖然IE加載了你的BHO,但是很多API都調用失敗了,很多IPC通信也無法完成,原因不外乎,讀\寫文件,讀\寫註冊表失敗,打開某內核對象失敗,而且都是權限問題,這又是另外一個自IE下保護模式出現以來就有的兼容性問題了,但是因爲這個和本文關係不是特別大,而且網上介紹保護模式的文件汗牛充棟[5],因此就不詳細介紹了。這裏僅僅點到即止,說明一下IE11下增強保護下出現的新問題,在增強保護模式下IE運行在一種特殊的完整性權限下,叫AppContainer,在[3]裏面有提到,在這種情況下BHO或者插件需要訪問的資源的用戶組權限需要在一個特殊的組裏面,這個組叫ALL_APPLICATION_PACKAGES,這個組的SID是“S-1-15-2-1”(當然Low完整性權限也是必須要的),你給BHO所有要訪問的資源,內核對象通過權限控制API,添加上這個用戶組,基本上BHO就都可以訪問了,另外就是建議你的BHO不要去直接操作文件註冊表這些敏感資源,一來是一般沒權限不被系統允許,二來是風險很高,建議你通過IPC告知高權限進程去進行這些敏感操作。

 

 

參考資料

[1]如何使用BHO定製你的Internet Explorer瀏覽器http://www.vckbase.com/index.php/wv/1145

 

[2]VisualStudio2005生成瀏覽器幫助對象http://www.cnblogs.com/jcss2008/archive/2009/06/06/1497518.html

 

[3] UnderstandingEnhanced Protected Modehttp://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx

 

[4] BHO強制注入IE技術方案簡述http://km.oa.com/group/QQPCMGR_tech/articles/show/165005

 

[5]面對IE保護模式的開發者生存之道http://tech.it168.com/msoft/2007-12-04/200712041740771.shtml

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章