當前位置:編程學習大全網 - 編程語言 - 流氓軟件的工作原理是什麽?

流氓軟件的工作原理是什麽?

為什麽“瀏覽器劫持”能夠如此猖狂呢?放眼眾多論壇的求助貼,我們不時可以看到諸如“我的IE被主頁被改了,我用殺毒工具掃了壹遍都沒發現病毒,我把主頁改回自己的地址,可是壹重啟它又回來了!”、“我的系統壹開機就跳出壹個廣告,我明明用了最新版的殺毒軟件的啊!”等這類關於IE異常問題的求助,80%的提問者都表示納悶,他們已經安裝了殺毒軟件,可是IE仍然被“黑”了,這又是為什麽?

其實這些都是典型的“瀏覽器劫持”現象,但是受害者不是已經安裝了殺毒軟件嗎?為什麽瀏覽器依然躲不過這只黑手?許多用戶對這個領域都存在壹種誤區心理:瀏覽器劫持?我有最新的殺毒軟件,我不怕!

於是,當他們遭遇“瀏覽器劫持”時,驚訝了。

要知道,殺毒軟件自身也只是壹種輔助工具,它不可能完全保護系統的安全,更何況,殺毒軟件用戶必須知道壹個事實:“瀏覽器劫持”的攻擊手段是可以通過被系統認可的“合法途徑”來進行的!殺毒軟件只能通過“特征碼”的形式來判斷程序是否合法,但這是建立在人為定義以後的,而實施“瀏覽器劫持”的程序可以有很多,防不勝防。

為什麽說“瀏覽器劫持”可以說是合法的呢?因為大部分瀏覽器劫持的發起者,都是通過壹種被稱為“BHO”(Browser Helper Object,瀏覽器輔助對象)的技術手段植入系統的。

BHO是微軟早在1999年推出的作為瀏覽器對第三方程序員開放交互接口的業界標準,它是壹種可以讓程序員使用簡單代碼進入瀏覽器領域的“交互接口”(INTERACTIVED Interface)。通過BHO接口,第三方程序員可以自己編寫代碼獲取瀏覽器的壹些行為(Action)和事件通知(Event),如“後退”、“前進”、“當前頁面”等,甚至可以獲取瀏覽器的各個組件信息,像菜單、工具欄、坐標等。由於BHO的交互特性,程序員還可以使用代碼去控制瀏覽器的行為,比如常見的修改替換瀏覽器工具欄、在瀏覽器界面上添加自己的程序按鈕等操作,而這些操作都被視為“合法”的,這就是壹切罪惡根源的開始。

BHO的出現幫助程序員更好的打造個性化瀏覽器或者為自己的程序實現了方便簡潔的交互功能,可以說,如果沒有BHO接口的誕生,我們今天就不能用壹些工具實現個性化IE的功能了。從某壹方面來看,BHO的確是各種繽紛網絡互動功能的幕後功臣,但是壹切事物都是有兩面性的,這個恒古不變的真理同樣對BHO有效,於是就有了今天讓安全界頭痛的“瀏覽器劫持”的攻擊手段誕生。

看看前面我提到的BHO接口特性,妳想到了什麽?BHO可以獲知和實現瀏覽器的大部分事件和功能,也就是說,它可以利用少量的代碼控制瀏覽器行為。程序員可以設計出壹個BHO按鈕以實現用戶點擊時通知瀏覽器跳轉到某個頁面完成交互功能,當然就可以進壹步寫出控制瀏覽器跳轉到他想讓用戶去的頁面,這就是最初的“瀏覽器劫持”的成因:BHO劫持。

在描述BHO劫持之前,我們先要對BHO接口的啟動做個簡單介紹:符合BHO接口標準的程序代碼被寫為DLL動態鏈接庫形式在註冊表裏註冊為COM對象,還要在BHO接口的註冊表入口處進行組件註冊,以後每次IE啟動時都會通過這裏描述的註冊信息調用加載這個DLL文件,而這個DLL文件就因此成為IE的壹個模塊(BHO組件),與IE***享壹個運行周期,直到IE被關閉。

IE啟動時,會加載任何BHO組件,這些組件直接進入IE領域,而IE則成為它們的父進程和載體,從此IE的每壹個事件都會通過IUnknown接口傳遞到BHO用以提供交互的IObjectWithSite接口裏,這是BHO實現與IE交互的入口函數。

BHO接收到IE接口傳遞來的參數後開始判斷IE正在做什麽,理論上BHO可以獲取IE的大部分事件,然後根據程序員編寫的代碼,BHO持有對特定事件做出反應的決定權,例如壹個可以實現“中文網址”的BHO,就是通過GetSite方法獲取到IE當前打開的站點URL(或通過IURLSearchHook接口來獲知),如果BHO發現獲取到的URL和內置的判斷條件匹配,該BHO就會啟用SetSite方法強制IE跳轉到程序員設定的頁面去,這個過程就是利用about:blank篡改主頁的“瀏覽器劫持”方法之壹,它的實現原理其實很簡單,程序員編寫壹個惡意BHO組件,當它獲取到IE窗口的當前站點為“about:blank”時就強制IE內部跳轉到指定的廣告頁面,於是鬧出了不久之前沸沸揚揚的“IE空白頁劫持事件”。

了解了這種類似惡作劇的作案手段,要解決它就容易了,只要找到並刪除這個隱藏在系統裏的BHO程序即可。

除了這類“廣告軟件”性質的BHO,還有壹種利用IURLSearchHook接口實現的另壹類更隱蔽的BHO,這種BHO從某些方面來說大概不算BHO,因為它並不是響應IUnknown,而是等待IE創建IURLSearchHook來啟動。IURLSearchHook被瀏覽器用來轉換壹個未知的URL協議地址,當瀏覽器企圖去打開壹個未知協議的URL地址時,瀏覽器首先嘗試從這個地址得到當前的協議,如果不成功,瀏覽器將尋找系統裏所有註冊為“URL Search Hook”(資源搜索鉤子,USH)的對象並把這個IE不能理解的地址發送過去,如果某個USH對象“認識”這個地址,它就返回壹個特定的標識告訴IE它知道怎麽打開這個地址,然後IE就根據約定的方法調用它,最終打開這個地址。其實USH對象並不陌生,我們壹些偷懶的用戶就經常為了省事而不輸入“http://”,但是IE最終還是能認出並打開某個地址,就是USH的功勞,但是這壹點又被惡意程序員拿來磨刀了,通過創建自己的USH對象,惡意程序員能夠命令IE在找不到壹些網站時自動跳轉到事先設置的站點裏,如果這個站點帶毒或者掛馬,用戶就完了。

這類BHO的解決方法和前面壹樣,只是它比較隱蔽,除非用戶經常偷懶,否則可能直到系統崩潰也不會知道自己已經感染了這種東西。也許妳會說,只要用戶的輸入永遠不會讓IE無法識別,這種滲透不就白費了?但是事實不容樂觀,我們無法得知BHO作者還會不會通過其他方法攔截IE,說不定每隔壹段時間就讓IE彈出壹個廣告呢?

上面說了這麽多BHO和IE合作搞破壞的事例,可能會給讀者造成壹種“BHO必須在IE傳遞數據後才能行動”的誤解,然而事實並非如此,瀏覽器自身也是壹個標準的可執行程序,而BHO只是借用這個程序進程啟動的DLL,它並非API那種要用的時候就讓妳過來忙活,忙活完了就壹腳踹開的奴隸形態DLL,前面說過了,BHO是壹種在瀏覽器加載時壹同啟動的例程,它相當於壹種自身運行邏輯不太明確的子進程(裏面都是對IE事件的響應和操作代碼),這個特性就造成了BHO DLL和API DLL本質的區別,BHO並不需要所有事件都必須依賴這個大家夥,它可以有自己決定的權利,只要適當的修改,就能用BHO實現類似DLL木馬的功能,當然,這並不是說我們就能在IE眼皮下公然的肆無忌彈幹壞事的,由於BHO自身是作為IE子進程啟動的,它就必須受到壹些限制,例如程序員不能在裏面自己創建網絡連接,這樣會導致IE報錯崩潰並供出妳寫的DLL,害怕BHO成為另壹種後門的用戶可以松口氣了,要在BHO裏實現Winsock大概只能在IE休息的時候才可以,但是會有哪個用戶開著個開空IE什麽事情都不做呢?

但這並不是說BHO就壹定能無害了,雖然用它不能做到遠程控制,但是別忘記,BHO能看到IE的所有東西,也就能任意的訪問用戶文件和註冊表,在這個條件成立的前提下,入侵者可以編寫代碼查找用戶隱私,然後在適當時候通過SetSite提交出去——誰叫現在Webmail這麽流行呢?這就是為什麽許多廠商發布諸如“中文網址”、“網絡搜索”、“IE定制”、“IE監視”這些功能的BHO的同時都保證“不搜集用戶隱私”的原因,只要妳想要,BHO就能得到壹切。

有些人也許會想,既然BHO是微軟瀏覽器的權利,那我不用IE了,我用Opera、Firefox不行?對於這點固然無可厚非,但是妳用不用Windows?用不用***享軟件?如果妳用Windows,那麽,妳仍然可能處於被BHO接觸到的世界,因為Windows本身就是和IE緊密結合的,這就把“IE進程”的範圍給擴大了,細心的用戶大概會發現,IE裏能直接訪問“我的電腦”,“我的電腦”窗口也能迅速變成IE,因為它們實質都是依賴於IE內核的,正因為這個原因,BHO可以在妳打開壹個文件夾時跟著偷偷啟動。同時,現在的網絡正處於壹種“***享軟件捆綁戰略”大肆實施的時代,妳再小心也不能避免某些***享軟件固定捆綁了BHO的行為,安裝後妳才會發現文件夾上又多了個什麽“助手”、“搜索”了。要想徹底逃開BHO的圍困,大概只能放棄使用Windows了。

Hook,妳鉤住瀏覽器了

正如《侏》裏的這句話壹樣,入侵者也在不斷尋找他們的新出路,雖然上面我說了這麽多BHO的負面事例,但是真正的危機並不是只有BHO的,在壹些使用BHO行不通的場合裏,入侵者開始投擲他們的鉤子。

什麽是鉤子?讓我們先看看它的官方定義:

鉤子(Hook),是Windows消息處理機制的壹個平臺,應用程序可以在上面設置子程以監視指定窗口的某種消息,而且所監視的窗口可以是其他進程所創建的。當消息到達後,在目標窗口處理函數之前處理它。鉤子機制允許應用程序截獲處理window消息或特定事件。

鉤子實際上是壹個處理消息的程序段,通過系統調用,把它掛入系統。每當特定的消息發出,在沒有到達目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該消息,也可以不作處理而繼續傳遞該消息,還可以強制結束消息的傳遞。

可能上面的官方定義對壹部分讀者理解有點困難,其實,鉤子就像是壹切程序的“先知”,壹個實現了鉤子的程序自身雖然也是普通程序,但是它總能在別的程序得到數據之前就已經知道了壹切,這是為什麽呢?對Windows系統有壹定了解的讀者應該知道,Windows系統是壹個通過“信息處理機制”運作的系統,在這個系統裏傳遞的數據都是通過“消息”(Message)的形式發送的,各個消息都遵循了官方的約定,否則就不能讓系統產生回應。而且這個傳遞步驟是顛倒的,例如我們關閉了某個程序,我們可能會認為是程序自己關閉後通知系統的,其實不然,當用戶點擊關閉按鈕的時候,Windows就會把壹個叫做WM_CLOSE的消息傳遞給這個程序,程序接收到消息後就執行卸載自身例程的操作。理解了這點,就能知道鉤子的原理了,所謂鉤子程序,就是利用了系統提供的Hook API,讓自己比每壹個程序都提前接收到系統消息,然後做出處理,如果壹個鉤子攔截了系統給某個程序的WM_CLOSE消息,那麽這個程序就會因為接收不到關閉消息而無法關閉自身。除了消息以外,鉤子還可以攔截API,像我們都熟悉的屏幕翻譯軟件就是Hook了壹些文本輸出函數如TextOutA而達到了目的。

技術讓編程人員可以輕松獲取其他程序的壹些有用數據或傳遞相關數據,像現在常見的壹些遊戲外掛,它們就是利用Hook技術鉤住了遊戲窗體,然後就可以識別遊戲裏面的行為和模擬發送按鍵鼠標消息,最終實現電腦自己玩遊戲的功能。把這個技術應用到瀏覽器上面,就成了另壹種控制瀏覽器行為的方法。

鉤子有兩種,本地鉤子(Local Hook)和全局鉤子(Global Hook),本地鉤子只在本進程裏起作用,故不屬於討論範圍;全局鉤子代碼必須以DLL形式編寫,以便在鉤子生效時被其它進程所加載調用,因此我們看到的大部分Hook程序都是DLL形式的。

其實之前提到的BHO也可以視為壹種針對IE的鉤子,它鉤的是IE的事件,這就是IE與BHO交互的起點,但是對於再復雜壹點的操作,例如判斷IE下載的是GIF圖片還是JPEG圖片,BHO無能為力,因為它僅僅知道IE的事件為DownloadBegin和DownloadComplete,對於具體內容,IE本身是不會告訴它的,否則IE豈不是要忙死了?至少我也沒見過哪個領導還需要向秘書匯報中午吃了雞肉還是鴨肉的吧,BHO可不是IE的老婆,或者說IE沒有氣管炎。

所以,為了得到IE的更多數據,程序員開始鉤IE了。與BHO不同,鉤子不需要被動的等待IE事件,它直接和IE形成上司對下屬的關系,這次輪到IE要做什麽都得經過它批準了。Hook形式的控制不需要DLL文件必須與IE的註冊表入口產生組件關系,它可以是壹個獨立的DLL,通過Rundll32.exe或自帶的Loader EXE啟動,而且由於它屬於Hook形式, 在鉤子有效的情況下會被系統自動插入其他程序的進程中,是不是有點像DLL木馬呢?

IE鉤子程序載入進程後便能獲知所有的消息類型、API和內容,壹旦發現某個符合要求的消息,如IE執行了某個事件,或者用戶輸入了特定內容,鉤子的處理代碼就開始工作了,它先攔截系統發送給IE的消息,然後分析消息內容,根據不同消息內容作出修改後再發給IE,就完成了壹次Hook篡改過程。用著名的3721實名搜索做例子,壹些人會以為它是采用了BHO或者IURLSearchHook完成中文域名的識別跳轉的,其實它是用了能夠第壹個得到Windows消息的Hook技術,這樣壹來就可以避免被其他的競爭對手搶先解析域名了:3721的主程序就是壹個Hook DLL,它監視IE地址欄的消息,壹旦用戶輸入的是中文,它便在其他BHO類插件工作之前攔截了這個消息,並調用自身代碼完成中文域名到英文URL的轉換工作,然後返回(也可能與自己的BHO DLL配合)壹個讓IE跳轉到英文URL的消息,完成域名的翻譯任務。

IE鉤子能幫助程序員用少量代碼完成更多的IE交互工作,但是壹旦這個鉤子被用於犯罪,其後果也是嚴重的,惡意程序員可以寫壹個攔截IE輸入的鍵盤鉤子,達到竊取密碼的作用,這樣無論妳是用HTTP明文協議還是SecurityHTTP加密協議都不能逃避密碼被盜的下場了,因為它抓的是妳在IE裏的輸入,後面的數據傳輸已經不重要了。

Winsock LSP

全稱為“Windows Socket Layered Service Provider”(分層服務提供商),這是Winsock 2.0才有的功能,它需要Winsock支持服務提供商接口(Service Provider Interface,SPI)才能實現,SPI是壹種不能獨立工作的技術,它依賴於系統商已經存在的基本協議提供商,如TCP/IP協議等,在這些協議上派分出的子協議即為“分層協議”,如SSL等,它們必須通過壹定的接口函數調用,LSP就是這些協議的接口。

通過LSP,我們可以比分析基本協議更簡單的得到我們想要的數據內容,如直接得到系統上運行的瀏覽器當前正在進行傳輸的地址和內容,不管這個瀏覽器是IE,還是Opera或Firefox,因為LSP是直接從Winsock獲取信息的,即使不用微軟生產的汽車,至少妳這輛汽車壹直是在微軟建造的公路上跑的吧。

LSP用在正途上可以方便程序員們編寫監視系統網絡通訊情況的Sniffer,可是現在常見的LSP都被用於瀏覽器劫持,使用戶又多了個噩夢。

  • 上一篇:c語言編程100題,有沒有大神幫幫忙
  • 下一篇:科學家為得永生,註射350萬年前猛獁象細菌,結局咋樣了?
  • copyright 2024編程學習大全網