論API hook——說360安全瀏覽器、金山網盾、瑞星、卡巴斯基、傲遊瀏覽器等軟件會互相沖突


最近360安全瀏覽器和金山網盾炒得很厲害,不過實際上做啓發式殺毒的話,是根據病毒的行爲做檢測,大家都是在病毒調用的API這個獨木橋走,時不時被擠下來是很正常的事情。上網搜索一下就可以看到,互相沖突的不止是這兩家,還有瑞星、卡巴和基於IE的瀏覽器,比如傲遊、騰訊TT、搜狗瀏覽器等。這個問題的核心在於這些軟件對API的鉤子的處理。

 

API hook這個東西其實DOS時代就有了,那個時候叫中斷表。這個的工作機理和虛函數表類似,就是一堆函數指針,每個人調用的時候調用的是最後一個更新函數指針的代碼。基於DOS的32位Windows版本(例如Windows95)用這個來轉移DOS程序的16位的文件系統操作到32位的文件系統驅動(當然,如果有16位的TSR和驅動,還得把控制權交回去)。在Windows下也有類似的東西,叫做SSDT。基本上這些東西被殺毒軟件用來截獲文件操作,被病毒用來防止自己被發現,等等。這個有個先來後到的機制,因爲先下手的可以替換所有可以用來防止被替換的函數,比如防病毒軟件在病毒試圖加載的時候就可以判斷:“啊,這個是已知病毒,我應該殺掉”,病毒在殺毒軟件試圖加在的時候也可以判斷:“啊,這個是殺毒軟件,我最好hook這個軟件的系統調用,把自己隱藏起來”。

 

但是計算機上有兩個殺毒軟件的時候,就會有衝突了:函數表裏面在病毒加載的時候是這個樣子:對於兩個殺毒軟件都掛鉤的函數,函數表是Windows->殺毒軟件甲->殺毒軟件乙(假定甲先加載,而且乙會調用被hook之前的函數),對於只有一個殺毒軟件掛鉤的函數,函數表或者是Windows->殺毒軟件甲,或者是Windows->殺毒軟件乙。這樣在應用程序執行一個函數的時候,有時候執行的是殺毒軟件甲的代碼,有時候兩個都執行。只有一層的執行還好,嵌套執行的時候,如果調用殺毒軟件甲的不再是系統而是殺毒軟件乙,這可能造成殺毒軟件甲運行異常,例如如果殺毒軟件乙做了一個沙盒,殺毒軟件甲訪問文件的時候路徑可能就是經過殺毒軟件乙虛擬的路徑,而出現文件找不到、配置無法保存的情況,嚴重的時候甚至造成藍屏死機。

即使不是殺毒軟件,也可能因爲搶佔系統資源而造成衝突。比如IE的地址欄是沒有API的。3721、百度搜霸、CNNIC的中文實名等工具條要搶佔用戶的地址欄怎麼辦呢,就是用自己的窗口過程替換掉IE的。如果安裝了一個,在按回車的時候就不會跳到另一個的網站。當然,技術上還有一些別的衝突。這種衝突會造成用戶抱怨產品不能用。3721的解決方案是在網絡實名插件裏面去檢測用戶有沒有安裝百度,有的話就會把百度的刪除掉。這當然會引起百度抗議,最後起訴到法院,3721敗訴。

 

那安全軟件和各種瀏覽器又是在什麼資源上造成衝突的呢?是WinInet。這個是IE的網絡層,很多瀏覽器都自己hook了做沙盒、腳本過濾、隱私模式或者多IE版本模擬。和前面提到的一樣,一個自己hook WinInet函數的軟件不可能針對市面上所有其他WinInet函數的軟件做兼容性測試(比如我手頭就有幾個軟件懶得自己寫文件下載,用的殺毒軟件很感興趣的URLDownloadToFile來做的下載),所以出問題的機率還會比較大,尤其是在自己hook WinInet,造成WinInet的行爲和系統的不同那個的軟件裏面。本來只hook自己進程的瀏覽器可以互不干擾,不過一些安全軟件會把自己加載到每個進程然後hook掉可以hook的API,這甚至會連Flash的WinInet調用也劫持掉了,造成Flash工作不正常或者這造成瀏覽器在安全軟件運行的時候經常崩潰。然後就有做了沙盒的安全瀏覽器防止安全軟件被加載到自己的進程,引起安全軟件公司抗議,不過目前還只是在法院打口水仗,沒有像瀏覽器工具欄公司們那樣互相起訴不正當競爭的行爲。更新:好像金山已經起訴奇虎不正當競爭了。

 

總而言之,API Hook是一種非常強大的工具,可以用來接管系統和其他軟件,但是強大的能力意味着更多的責任,掛鉤函數作爲系統API的替代物,需要在比應用軟件更多的場景下測試。遺憾的是,病毒製造者也會使用這種工具,使得需要掛鉤的函數經常很多;而且使用系統未公開的行爲也意味着在系統更新的時候,API Hook的軟件經常需要被重新編碼和測試,遠期的總成本比沒有API Hook的軟件要高得多。除非是有Visual Assist這樣的市場佔有率、經驗、人力和時間,通常還是開發只使用正規API的軟件比較容易維護。

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