一. 一個EXE引發的危機
網絡程序員小李最近有點忙,公司要做的網頁工程項目已經快到尾期了,可是開發小組的進度仍然遲遲跟不上來,為了趕進度,小李去國外下了一些代碼回來參考,但那些代碼的關鍵部分都是用了字符編碼的形式加密的,小李不想手工一段段的解碼,就上網搜索了一個號稱能解碼腳本字符編碼的工具,下載回來的是一個安裝包,文件名為“downsoft226.exe”,小李要急着用,看也沒看就雙擊執行了,但是他等了好一會兒也沒見安裝界面出現,反而感覺到硬盤在狂轉,機器奇慢,小李有些不安的打開了任務管理器——列表里赫然有至少超過50個進程在后台執行!
小李趕快手忙腳亂的停止進程,可是仍然有新的進程不斷的出現,在他停掉downsoft226.exe這個進程后,系統藍屏了,計算機重啟后跳出好幾個IE窗口,每個窗口上都多了一些工具欄,而且更嚴重的是,IE的空白頁也不再空白了。小李只覺得天昏地暗:完了,惡狼又找上門來了……
二. 無處不在的劫持者
以上的經歷大概許多用戶都會遇到,在網絡上看到個工具的說明很好,就下載了運行,結果運氣好的在得到工具的同時還“獲贈”了一堆所謂的“IE助手”(BHO),運氣差的不但工具沒得到,還引狼入室給自己惹來一身臊。在這個信任危機的網絡時代,你的瀏覽器隨時會被“劫匪”給綁了去。
QUOTE知識回顧:瀏覽器劫持
“瀏覽器劫持”(Browser Hijack)是一種不同於普通病毒木馬感染途徑的網絡攻擊手段,它的滲透途徑很多,目前最常見的方式有通過BHO、DLL插件、Hook技術、Winsock LSP等載體達到對用戶的瀏覽器進行篡改的目的。這些載體可以直接寄生於瀏覽器的模塊里,成為瀏覽器的一部分,進而直接操縱瀏覽器的行為,輕者把用戶帶到自家門戶網站,嚴重的則會在用戶計算機中收集敏感信息,危及用戶隱私安全。“瀏覽器劫持”的后果非常嚴重,用戶只有在受到劫持后才會發現異常情況,但是這時候已經太遲了。目前,瀏覽器劫持已經成為Internet用戶最大的威脅之一。
由於“瀏覽器劫持”的攻擊手段是可以通過被系統認可的“合法途徑”來進行的,以目前的軟件行為檢測技術來說,“瀏覽器劫持”是防不勝防的,即使你每天都很小心的設置安全級別、對瀏覽器彈出的安裝插件提示看了又看,你仍然不可避免會因為下載安裝了一些工具而讓“劫持者”登堂入室。如果我們不小心讓這頭惡狼駐扎了進來,該用什么方法驅逐它呢?
QUOTE知識回顧:為什么“瀏覽器劫持”是“合法入侵”
為什么說“瀏覽器劫持”可以說是合法的呢?因為大部分瀏覽器劫持的發起者,都是通過一種被稱為“BHO”(Browser Helper Object,瀏覽器輔助對象)的技術手段植入系統的。
BHO是微軟早在1999年推出的作為瀏覽器對第三方程序員開放交互接口的業界標准,它是一種可以讓程序員使用簡單代碼進入瀏覽器領域的“交互接口”(INTERACTIVED Interface)。通過BHO接口,第三方程序員可以自己編寫代碼獲取瀏覽器的一些行為(Action)和事件通知(Event),如“后退”、“前進”、“當前頁面”等,甚至可以獲取瀏覽器的各個組件信息,像菜單、工具欄、坐標等。由於BHO的交互特性,程序員還可以使用代碼去控制瀏覽器的行為,比如常見的修改替換瀏覽器工具欄、在瀏覽器界面上添加自己的程序按鈕等操作,而這些操作都被視為“合法”的,這就是一切罪惡根源的開始。
BHO的出現幫助程序員更好的打造個性化瀏覽器或者為自己的程序實現了方便簡潔的交互功能,可以說,如果沒有BHO接口的誕生,我們今天就不能用一些工具實現個性化IE的功能了。從某一方面來看,BHO的確是各種繽紛網絡互動功能的幕后功臣,但是一切事物都是有兩面性的,這個恆古不變的真理同樣對BHO有效,於是就有了今天讓安全界頭痛的“瀏覽器劫持”的攻擊手段誕生。
除了BHO劫持以外,如今的劫持方式更有通過DLL插件、Hook技術和Winsock LSP進行的,而這些矛頭紛紛指向瀏覽器的小壞蛋們,都會被傳統的反病毒軟件視為正常的,因為除了惡意軟件,還有許多正常軟件需要采用這些技術來為IE提供許多功能,因此出現了“魚與熊掌”的尷尬局面,要更改這個已經定型的環境固然不現實,那么,要想在這個危機重重的環境下保全自己,我們就必須掌握一套“除狼”的技術了。
三. 代號35:營救IE行動
1. 解雇死纏爛打的秘書——BHO的清理
雖然一部分BHO是衷心為IE效力的,可是也總有那么一小嘬搗亂分子以簡單的理由(增強瀏覽器特性、保護瀏覽器安全、上網記錄清理等等等等……)讓用戶放心的執行了安裝程序,然后再以復雜的理由(卸載不徹底、不提供卸載、表面上“卸載”等等等等……)死活趕不走了,如果遇到這樣的無賴,用戶該怎么辦呢?
首先,要確認一下它的駐留地,一般情況下,BHO文件都在Windows目錄下的“Downloaded Program Files”目錄下,記住永遠不要用資源管理器進去,它們會騙人的,我們必須用最原始的命令提示符(CMD.EXE)進去,只需要這幾個命令:
QUOTEcd \
cd %SystemRoot%
cd “Downloaded Program Files”
dir *.* /a
你就會發現命令提示符和Windows資源管理器的巨大差異,如果實在用不慣命令提示符也沒關系,有很多工具可以不偏袒任何一方的顯示出最真實的情況,例如Total Commander這款強大的文件管理工具。但是這里並不是唯一的BHO目錄,一些BHO會把自己放在系統根目錄下的“Program Files”目錄里,並且建立有自身所屬的文件管理目錄。
既然看到這么多BHO的文件實體了,那么哪個才是趕不走的“助手”呢?既然它一開始就不打算讓你卸載的,那么自然不會告訴你它一共有多少個文件、文件名是什么、分布的目錄等關系到自身生死大事的敏感信息,這就意味着對於計算機不熟練的用戶來說,要驅逐它們並非那么容易,但是大部分設計者都會被一種“自我”的心理暗示,因此設計出的程序文件一般都會注明版權信息,文件名也會包含有廠商的縮寫或者該工具的英文縮寫等特征字符,有了這些因素存在,用戶要自己尋找這些不受歡迎的客人就好辦多了,一個典型的例子是“中文實名網址”這款工具,它的大部分文件均包含有產品英文縮寫“CDN”,而且每個程序文件都在版權信息里清楚的寫着“中文實名”,因此用戶只要查找包含有“CDN”字符的文件名就能發現個大概了,不過由於系統自身也可能會有幾個文件名帶有“CDN”字符,所以刪除之前請先確認該文件的版權並非Microsoft所屬。
一些用戶也許會疑惑,為什么有些文件要刪除的時候總會提示“文件正在被使用,無法刪除”,這是因為BHO有一定的特殊性:它是可以被Windows的外殼進程加載的,也就是那個Explorer,只要你進了系統,只要你的桌面和窗口還在,那么你就別想刪除它了。要解決這個問題,我們先要嘗試用REGSVR32.EXE程序來去除它的組件注冊信息,例如反注冊HBClient.dll,只需要用命令提示符進入文件的目錄里,執行REGSVR32.EXE /U HBClient.dll即可,然后打開任務管理器taskmgr.exe,找到Explorer.exe進程停掉,最后直接在任務管理器里執行CMD.EXE,進入文件目錄后輸入DEL HBClient.dll就完成了該文件的清理工作。如果這個BHO組件位於Program Files目錄下的某一子目錄里,你還可以放心的直接執行DEL *.*命令一窩端掉。
隨着時間的流逝和技術的進步,許多BHO已經不再簡單,有的BHO不僅使用BHO技術劫持瀏覽器,還加上了Hook技術、LSP劫持甚至采用了類似於Rootkit后門的保護技術最大限度的保全自己,要對付這些越來越狡猾的劫持者,僅僅用上面的方法大概是遠遠不夠的。
幸運的是,現在已經出現了一批針對“瀏覽器劫持”的優秀工具,如列出所有瀏覽器環境組件的HijackThis、直接清理大部分常見惡意軟件的RogueCleaner和直接屏蔽IE安裝惡意軟件功能的Upiea等,許多需要手工清理的惡意軟件都可以通過它們配合完成,事半功倍。
2. 尋回我遺失的首頁
“瀏覽器劫持”的另一個顯著特征就是篡改IE首頁,首先,惡意軟件把IE首頁改為它要帶用戶去瀏覽的網址,如某個廣告頁、帶毒頁等,即使用戶自己把首頁設置為“about:blank”(空白頁),再打開IE仍然會發現瀏覽器在地址為“about:blank”的情況下自己跳轉到了那個惡意頁面,這就是經常搞得一批用戶人心惶惶最后不得不重裝系統的“IE空白頁劫持”事件,如果不慎被這種惡意軟件糾纏上了該怎么辦呢?
首先,我們要理解“空白頁劫持”的機制,它一般通過兩種方法進行,第一種是利用BHO技術進行劫持的,惡意程序員編寫了一個能檢測當前IE地址的BHO組件,如果該組件截獲到地址為“about:blank”,則觸發跳轉代碼,控制瀏覽器訪問該組件內置的地址去;另一種是利用了IURLSearchHook技術實現的內部跳轉,IURLSearchHook被瀏覽器用來轉換一個未知的URL協議地址,當瀏覽器企圖去打開一個未知協議的URL地址時,瀏覽器首先嘗試從這個地址得到當前的協議,如果不成功,瀏覽器將尋找系統里所有注冊為“URL Search Hook”(資源搜索鈎子,USH)的對象並把這個IE不能理解的地址發送過去,如果某個USH對象“認識”這個地址,它就返回一個特定的標識告訴IE它知道怎么打開這個地址,然后IE就根據約定的方法調用它,最終打開這個地址。
這樣描述也許很模糊,舉個例子就好理解了,例如,當用戶輸入一個不帶協議標記的資源地址時(資源定位協議規定標准格式為協議標記://資源所在地址/目錄/文件名),瀏覽器自身並不認識它的,所以它會枚舉所有在系統注冊的USH對象,並把資源請求逐條傳遞過去,如果某一個USH“認識”該資源特征,則告訴瀏覽器它認識這個請求,瀏覽器就會加載它最終打開目標連接。通常,默認的協議標記被指定為“http”,它是屬於urlmon.dll負責的,而屬於mshtml.dll負責的“about”協議被用於本地信息輸出調試和擴展功能的實現(大家可以嘗試在瀏覽器里輸入about:<a%20href=mailto:lk007@163.com>小金</a>@<a%20href=bbs.nettf.net>網絡技術論壇</a> 看看效果),如果有個惡意的USH對象把“about”協議的解釋權搶了過來,用戶指定的空白頁自然就會被帶到某個不知名的地方去了。
對於BHO造成的頁面劫持,只要用清理BHO的方法去查找就可以了,而如果是被USH劫持,那么找起來會有點困難,由於USH對象並不像BHO組件會在前台出現蛛絲馬跡,對一般用戶而言會造成搜索困難,其實只要你理解了我在上文對USH機制的解釋,要找到它們就不困難了,一些USH對象實施的是本地跳轉,所以產生的頁面會帶有到自身文件的連接,用戶只需查看頁面源代碼,然后搜索到“res://”開頭的那個HTML元素,后面那一連串百分號和字符就是該USH的完整文件地址,它們是用Unicode編碼過的,不要看到那一堆類似加密的字符串就退卻了,既然瀏覽器能認識,那么我們也就能讓它顯示出來,只需要在IE瀏覽器的地址欄里輸入這么一句腳本代碼:“javascript:document.write(unescape('被Unicode編碼的字符串'));”,瀏覽器就把它還原回可讀字符串了,記下這個文件名去查找刪除掉,“空白頁劫持”就不復存在了,例如一個字符串為“'%62%62%73%2E%6E%65%74%74%66%2E%6E%65%74”,只需要在瀏覽器地址欄里輸入“javascript:document.write(unescape('%62%62%73%2E%6E%65%74%74%66%2E%6E%65%74'));”,就可以知道它表示什么了,各位可以去試驗一下親自看看效果。
如果是另一種稍微狡猾點的沒有使用本地跳轉代碼的USH對象,以上方法就行不通了,但是我們也不用怕,由於Windows的注冊表管理機制,任何USH對象都必須通過注冊表項目來加載,因此只要運行REGEDIT,定位到以下注冊表鍵:HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\URLSearchHooks,里面列出的項目就是可能被添加的USH入口,只要刪除掉即可解除“空白頁劫持”危機。
3. 不該有你的世界——啟動項的清理
有時候,即使我們清理了惡意劫持,一重啟機器,卻發現它又回來了,或者由劫持帶來的開機自彈廣告惡意頁面還是依舊出現,這是為什么呢?因為在注冊表中,並不是只有與IE有關的地方才會被流氓軟件改寫的,另一處最常見的加載入口——啟動項也常常被它們光臨,惡意軟件還會篡改這三個啟動項目“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run”、“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”和“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices”,更高級的方法是建立“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer\Run”項,然后從這里啟動自身,由於系統配置實用程序並不會檢測這個地方,所以常被一些新型后門鑽了空子。
如何快速篩選正常啟動項和惡意啟動項一直是普通用戶最頭痛的問題,俗話說“不打沒有准備的仗”,平時我們必須記住系統常有的啟動項,到時候就能迅速發現新增加的項目列表了,一般來說,最干凈的系統啟動項只有兩個,甚至只有一個:
QUOTEWindows 2000最少啟動項:
啟動項目:Synchronization Manager 命令:mobsync.exe /logon 作用:系統數據管理同步
啟動項目:Internat 命令:Internat.exe 作用:輸入法指示器
Windows XP/2003 最少啟動項:
啟動項目:CTFMON 命令:CTFMON.exe 作用:輸入法指示器
對於XP/2003,默認情況下可能會有一些IME開頭的啟動項,但是這些項目完全可以刪除掉。除了這幾個項目,剩下的就是根據各人安裝程序和設備時產生的相應管理啟動項了,所以只能靠各用戶平時的觀察和記錄來判斷了,但是通常情況下,莫名其妙出現在Windows系統目錄或者以一些Windows系統文件來命名的啟動項90%不是什么好東西(如果你安裝了涉及系統管理的程序組件除外)!例如svchost.exe、C:\WINDOWS\SYSTEM32\CApp.exe等,還有一些DLL類型的Hook組件靠Rundll32.exe進行自啟動,例如某著名廠商的某某BHO就是這么做的,如果這里沒能清理干凈,那么下次啟動的時候,你剛才辛苦清理的流氓們就又復活了。
4.和李鬼的斗爭——Winsock LSP的清除
LSP全稱為“Windows Socket Layered Service Provider”(分層服務提供商),這是Winsock 2.0才有的功能,它需要Winsock支持服務提供商接口(Service Provider Interface,SPI)才能實現,SPI是一種不能獨立工作的技術,它依賴於系統商已經存在的基本協議提供商,如TCP/IP協議等,在這些協議上派分出的子協議即為“分層協議”,如SSL等,它們必須通過一定的接口函數調用,LSP就是這些協議的接口。
近年來采用LSP技術進行瀏覽器劫持的惡意軟件也慢慢浮出水面了,使用LSP的好處在於,這類瀏覽器劫持方案可以不分瀏覽器“種族”的進行,即使你不用IE,你的Opera、NC、Firefox等非IE內核的瀏覽器也難逃厄運,因為LSP是直接從Winsock獲取信息的,而所有瀏覽器最終的數據傳輸都必須建立在Winsock接口上,所以一旦LSP層被惡意劫持,用戶的所有請求都有可能被控制了。
LSP服務接口位於注冊表的“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\NameSpace_Catalog5\Catalog_Entries”項目內,所有接口都通過一串長數字項表示。普通情況下,系統就已經帶有了兩個LSP接口分別負責TCP/IP組件(rnr20.dll)和NTDS組件(winrnr.dll)的正常工作,而LSP劫持則是把自己加入該項目內,並把優先權提高(用長數字項表示),例如默認情況下TCP/IP組件的優先權為000000000001,如果發生了LSP劫持,惡意LSP可能會把自身改為000000000001,而系統原有的LSP項目就被往后推為000000000002等,以便數據包輪尋的時候能優先被惡意LSP處理。
要清理LSP劫持不能簡簡單單的直接把鼠標往“NameSpace_Catalog5”項目上點“刪除”完事,這樣做以后你就會發現系統也不能使用任何網絡功能了,因為系統自身也必須依賴兩個內置的LSP進行工作,這種架構看起來的確很麻煩,但是如果微軟連自己提出的技術自己都不去使用的話,還指望別人會用?
所以,正確的清理步驟必須這樣進行:
確認LSP劫持已經發生,可以通過手工檢查上文提到的注冊表鍵值判斷,或者使用HijackThis做一次全面掃描。
查找並刪除LSP驅動文件,可直接通過相應LSP項目的“LibraryPath”子項得到。
刪除相應的LSP組件項目,它是用一長串數字表示的。
重命名正常的LSP組件項目,TCP/IP為000000000001,NTDS為000000000002,如果還有其他的話,依次排序。
重啟計算機,再用HijackThis掃描一下惡意LSP是否已經徹底清理掉。
5.不得不恨——迎戰驅動形式的瀏覽器劫持
本來已經不想說這個惡心的東西了,看看“驅動”兩個字,你想起了什么?沒錯,這是Rootkit的代名詞!這個東西原本就不屬於瀏覽器劫持范疇的,可是自從一些廠商和個人首次采用並嘗到“甜頭”后,這股風氣逐漸蔓延開來,我不得不暗自慶幸如今能真正寫出好用的Rootkit的人還沒那么多,否則以后一般用戶的日子更不好過了,這類劫持通常不做主要工作,它只負責隱藏惡意BHO文件、啟動項和進程信息等,這樣即使我們用上面的幾個方法清理了流氓軟件,幾秒鍾后它就又回來了,或者直接就不給你刪除文件!既然為了損害用戶利益把劫持技術研究到這種地步了,為何不去做正事呢?
QUOTE知識回顧:什么是Rootkit
隨着安全技術的發展和計算機用戶群的技術提高,一般的木馬后門越來越難生存,於是一部分有能力的后門作者把眼光投向了系統底層——Ring 0。位於Ring 0層的是系統核心模塊和各種驅動程序模塊,所以位於這一層的木馬也是以驅動的形式生存的,而不是一般的EXE。后門作者把后門寫成符合WDM規范(Windows Driver Model)的驅動程序模塊,把自身添加進注冊表的驅動程序加載入口,便實現了“無啟動項”運行,一般的進程查看器都只能枚舉可執行文件EXE的信息,所以通過驅動模塊和執行文件結合的后門程序便得以生存下來,由於它運行在Ring 0級別,擁有與系統核心同等級的權限,因此它可以更輕易的把自己隱藏起來,無論是進程信息還是文件體,甚至通訊的端口和流量也能被隱藏起來,在如此強大的隱藏技術面前,無論是任務管理器還是系統配置實用程序,甚至系統自帶的注冊表工具都失去了效果,這種形式的后門被稱為Rootkit。
要清理這類劫持並非HijackThis和其他同類軟件能做到的了,手工查找也比較困難,這時候我們必須請出IceSword了,主要關心的位置是“進程”和“SSDT”(順便提一下,IceSword也能看系統當前注冊的BHO信息),注意找被IceSword標注為紅色的項目,它們就是罪魁禍首,對於進程列表里的紅色進程,先嘗試用“結束進程”停止掉該進程運行,然后看看它還會不會“復活”,我不推薦用戶直接刪除紅色進程的文件,因為這些進程雖然是被Rootkit出於某種目的隱藏起來的,但是它們也有可能是被Rootkit借來駐留的系統進程載體(例如線程注射),隨便刪除容易導致系統出錯。
確認沒有紅色進程后,我們來看“SSDT”,SSDT意為“系統服務描述表”,里面存放着最底層的接口函數,Rootkit要實現各種隱藏都要修改這個地方實現對系統底層函數的控制和轉移,正常情況下SSDT的函數都是從ntoskrnl.exe導出的,如果有Rootkit控制了部分函數,在IceSword里就會表示為紅色的,並且指出該函數被哪個文件擄走了(一些殺毒軟件為了查殺Rootkit,也會在這里留下自己的痕跡,如卡巴斯基的klif.sys等,檢查的時候要注意看文件版權信息以免誤殺),我們先要記下該文件名,然后進入注冊表的“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”里查找該文件並刪除對應的子項名稱,重新啟動計算機后再用IceSword檢查,如果沒有再出現紅色,那么恭喜一下,這場反劫持戰爭我們終於勝利了!
四. IE,為什么受傷的總是你
也許是因為瀏覽器的訪問直接代表着利益關系,所以越來越多人把眼光投向瀏覽器,使用戶替代他們完成諸如訪問流量、廣告點擊等工作,不知道繼“網絡釣魚”、“瀏覽器劫持”以后,廣大的網絡用戶明天又該會面對什么樣的危機?
瀏覽器的戰爭,會有休止的那一天嗎?
